Seekwatcher generates graphs from blktrace runs to help visualize IO patterns and performance. It can plot multiple blktrace runs together, making it easy to compare the differences between different benchmark runs.


Version 0.12

HG repo

tar.gz of the latest commit


Btrfs streaming writes across multiple devices

Ext3 Btrfs and XFS creating 20 copies of the Linux kernel sources

Ext3 Animation
Btrfs Animation
XFS Animation
Specialized workloads on block devices (Josef 'Jeff' Sipek)


Seekwatcher uses matplotlib to generate graphs, and most distros have a package for this. You'll also need to install python and the numpy module. It is common for the matplotlib packages to depend on numpy, so installing a distro's matplotlib should get you what you need.

seekwatcher --movie uses mencoder or png2theora to create movie files.

Once those are setup, just copy the seekwatcher script to a bin directory and make it executable.

For versions after 0.12, seekwatcher added some cython extensions to improve performance. You will need to install the cython package from your distro, and use python install to compile the extensions and install the resulting files.

Running Seekwatcher

There are three basic ways to run seekwatcher. It can either generate graphs from an existing blktrace run, start blktrace and run a program for you, or make a series of pngs from a single trace. If seekwatcher starts and stops blktrace, the trace runs are kept so they can be graphed again later.


This will start blktrace on /dev/sda6, run find / > /dev/null, save the blktrace output to find.trace and save the graph to find.png.

seekwatcher -t find.trace -o find.png -p 'find / > /dev/null' -d /dev/sda6

seekwatcher can run blktrace on multiple devices at the same time. The resulting graph will have IO from each device combined.

seekwatcher -t dd.trace -o dd.png -p 'dd if=/dev/zero of=/mnt/file bs=1M count=4096' -d /dev/sda1 -d /dev/sdb1

To regenerate the graph from the saved trace file:

seekwatcher -t find.trace -o find.png

To compare multiple traces, use the -t flag multiple times. Providing a corresponding -l flag for each trace will create labels on the graphs.

seekwatcher -t ext3.trace -t xfs.trace -l ext3 -l xfs -o ext3_vs_xfs.png

Finally, you can also make an animation (either ogg or mpg) of the IO generated by a given run. For these images, a disk is simulated as a grid of x,y coordinates and every sector read/written is plotted with a black square. Squares fade as the IO ages, blanking out after 10 frames.

To create an animation from ext3.trace and store the resulting mpg file in ext3-trace.mpg:

seekwatcher -t ext3.trace -o ext3-trace.mpg --movie

Seekwatcher creates 3 graphs by default: a plot of each sector read or written, the number of seeks per second, and the throughput per second during the run. Sometimes the plot of each sector can be difficult to read, especially when comparing two runs with very different IO patterns. seekwatcher --no-io-graph will disable this plot. Another option is to use seekwatcher --zoom start:end to specify the range on the yaxis you want included in the graph. The range is specified in MB, and using a range of 0:0 will turn off seekwatcher's attempt at autoscaling the plot.

seekwatcher -t ext3.trace -z 10000:20000 -o ext3.png
seekwatcher -t ext3.trace -z 0:0 -o ext3-no-zoom.png

Seekwatcher uses a rolling average of the seek counts and throughput values to make graphs smoother. You can control the number of seconds rolled together (by default total trace time / 25) with seekwatcher --rolling-avg

Controlling Output

By default, seekwatcher saves the graph into a file called trace.png. seekwatcher -o filename can be used to save it to a different file. The extension specified controls what type of file is created, choices include .png, .jpg, .eps, and .svg. The resolution used can be controlled with --dpi num. By default, seekwatcher uses a 8x6 pagesize and a dpi of 120.