Skip to main content

parse and visualize iosnoop output

Project description

iosnoop-tool

parse and visualize iosnoop output

What is iosnoop?

iosnoop is a tracing tool for disk I/O events and created by Brendan D. Gregg. Originally, it is for Solaris/MacOS X using DTrace.

iosnoop - A program to print disk I/O events as they happen, with useful details such as UID, PID, filename (if available), command, etc. Written using DTrace (Solaris 10 3/05, MacOS X 10.5).

http://www.brendangregg.com/DTrace/iosnoop

And then, iosnoop was ported for Linux using ftrace. Refer to his blog for iosnoop detail.

I'm probably dreaming. I just ported my popular iosnoop tool to Linux:

http://www.brendangregg.com/blog/2014-07-16/iosnoop-for-linux.html

Linux ported iosnoop is a simple bash script and can be downloaded from here.

The output is like this. iosnoop requires root permission to run. iosnoop summarizes block device I/O (disk I/O) latency (LATms) with 1 line.

$ sudo path/to/iosnoop -ts
Tracing block I/O. Ctrl-C to end.
STARTs          ENDs            COMM         PID    TYPE DEV      BLOCK        BYTES     LATms
14545946.332115 14545946.344366 <...>        17185  WS   8,160    4840587442   4096      12.25
14545946.331036 14545946.347082 main         17197  WS   8,160    4840666914   4096      16.05
14545946.332136 14545946.348852 <...>        17185  WS   8,160    4840643666   4096      16.72
14545946.331067 14545946.352752 main         17197  WS   8,160    4844855458   4096      21.69
14545946.332146 14545946.355893 <...>        17185  WS   8,160    4844863762   4096      23.75
14545946.356584 14545946.358920 <idle>       0      WS   8,160    4844859722   4096       2.34
14545946.356238 14545946.361128 <idle>       0      WS   8,160    4844855466   4096       4.89
14545946.356943 14545946.364070 <idle>       0      WS   8,160    4844863770   4096       7.13

Why iosnoop-tool?

iosnoop-tool is a visualizing tool for iosnoop output.

Brendan also has provided a visualization tool named trace2heatmap.pl, and introduced how to make Heatmap from iosnoop output.

I confirmed this tool works and know heatmap seems good enough. However, I am not good at reading/writing perl script, so I created my visualization tool in order to customize for my purpose.

Requirements

  • Python >= 3.4
  • Seaborn
  • Support output of iosnoop for Linux only
    • need -ts arguments
$ sudo iosnoop -ts

How to install

for developer

Create virtualenv to install iosnoop-tool.

$ mkdir virtualenvs
$ virtualenv -p python3 virtualenvs/venv
$ source virtualenvs/venv/bin/activate
(venv) $

Install iosnoop-tool package from the repository.

(venv) $ git clone https://github.com/t2y/iosnoop-tool.git
(venv) $ cd iosnoop-tool
(venv) $ python setup.py develop

Base CLI options

Confirm iosnoop-cli works as below.

(venv) $ iosnoop-cli --help
usage: iosnoop-cli [-h] [--basedate BASEDATE] --data DATA
                   [--columns COLUMNS [COLUMNS ...]]
                   [--io-commands IO_COMMANDS [IO_COMMANDS ...]]
                   [--io-device IO_DEVICE] [--io-pids IO_PIDS [IO_PIDS ...]]
                   [--io-types IO_TYPES [IO_TYPES ...]] [--since SINCE]
                   [--until UNTIL] [-v] [--version]
                   {csv,plot} ...

positional arguments:
  {csv,plot}

optional arguments:
  -h, --help            show this help message and exit
  --basedate BASEDATE   set base datetime to convert kernel timestamp to
                        localtime, format: yyyymmddHHMISS
  --data DATA           set path to iosnoop output file
  --columns COLUMNS [COLUMNS ...]
                        set columns name in iosnoop output
  --io-commands IO_COMMANDS [IO_COMMANDS ...]
                        set commands in iosnoop output
  --io-device IO_DEVICE
                        set device in iosnoop output
  --io-pids IO_PIDS [IO_PIDS ...]
                        set process ids in iosnoop output
  --io-types IO_TYPES [IO_TYPES ...]
                        set types in iosnoop output
  --since SINCE         set seconds since relative difference from start
  --until UNTIL         set seconds until relative difference from start
  -v, --verbose         set verbose mode
  --version             show program version

Sub Commands

csv

Create csv/tsv file from output of iosnoop.

(venv) $ iosnoop-cli csv --help
usage: iosnoop-cli csv [-h] [--dialect {excel,excel-tab,unix}]
                       [--output OUTPUT] [--separator SEPARATOR]

optional arguments:
  -h, --help            show this help message and exit
  --dialect {excel,excel-tab,unix}
                        set dialect for csv writer, default is excel
  --output OUTPUT       set path to save csv file of iosnoop
  --separator SEPARATOR
                        set separator (choose from comma, tab), default is comma

plot

Create image file rendered by seaborn from output of iosnoop.

(venv) $ iosnoop-cli plot --help
usage: iosnoop-cli plot [-h] [--backend BACKEND] [--colormap COLORMAP]
                        [--fig-output FIGOUTPUT] [--fig-size FIGSIZE]
                        [--hspace HSPACE] [--plot-type {heatmap}] [--square]
                        [--subplot-conditions SUBPLOT_CONDITIONS [SUBPLOT_CONDITIONS ...]]
                        [--x-interval X_INTERVAL] [--x-max X_MAX]
                        [--y-interval Y_INTERVAL] [--y-max Y_MAX]

optional arguments:
  -h, --help            show this help message and exit
  --backend BACKEND     set backend for matplotlib, use TkAgg to monitor in
                        the foreground
  --colormap COLORMAP   set color map for seaborn heatmap
  --fig-output FIGOUTPUT
                        set path to save graph
  --fig-size FIGSIZE    set figure size
  --hspace HSPACE       set hspace for subplot
  --plot-type {heatmap}
                        set plot type ("heatmap" by default)
  --square              set square mode for heatmap
  --subplot-conditions SUBPLOT_CONDITIONS [SUBPLOT_CONDITIONS ...]
                        set DataFrame conditions to filter
  --x-interval X_INTERVAL
                        set value of interval for x bins
  --x-max X_MAX         set maximum value for x-axis
  --y-interval Y_INTERVAL
                        set value of interval for y bins
  --y-max Y_MAX         set maximum value for y-axis

How to use

This is sample heatmap rendered by seaborn.

(venv) $ iosnoop-cli --data tests/fixtures/iosnoop-sample.log plot --y-max 600 --y-interval 10 --fig-output tests/fixtures/iosnoop-sample.png
...
(venv) $ file tests/fixtures/iosnoop-sample.png
tests/fixtures/iosnoop-sample.png: PNG image data, 1024 x 800, 8-bit/color RGBA, non-interlaced

Specifying --basedate options converts kernel timestamp to localtime.

(vent) $ iosnoop-cli --basedate 20180702230100 --data tests/fixtures/iosnoop-sample.log plot --y-max 600 --y-interval 10 --fig-output tests/fixtures/iosnoop-sample-with-basedate.png

Examples

plot

  • show graphical window instead of saviing image file
(venv) $ iosnoop-cli --data tests/fixtures/iosnoop-sample.log plot --backend TkAgg
  • adjust x-axis and y-axis as needed, default settings might not appropriate depends on output of iosnoop
(venv) $ iosnoop-cli --data tests/fixtures/iosnoop-sample.log plot --x-max 100 --x-interval 2.0 --y-max 300 --y-interval 5
compare multiple subplots

Use header name to retrieve particular data in pandas.DataFrame.

(venv) $ head tests/fixtures/iosnoop-sample.log
STARTs          ENDs            COMM         PID    TYPE DEV      BLOCK        BYTES     LATms
14545946.332115 14545946.344366 <...>        17185  WS   8,160    4840587442   4096      12.25
14545946.331036 14545946.347082 main         17197  WS   8,160    4840666914   4096      16.05
14545946.356943 14545946.364070 <idle>       0      WS   8,160    4844863770   4096       7.13
  • retrieved by exact match and contains string, --hspace is used for adjusting height space for each subplots
(venv) $ iosnoop-cli --data tests/fixtures/iosnoop-sample.log plot --y-max 300 --y-interval 30 --subplot-conditions "COMM == 'main'" "COMM.str.contains('jbd2|kblockd|flush')" "COMM == '<idle>'" --hspace 0.9 --fig-output tests/fixtures/iosnoop-sample-comm.png

  • retrieved by bytes between, --hspace is used for adjusting height space for each subplots
(venv) $ iosnoop-cli --data tests/fixtures/iosnoop-sample.log plot --subplot-conditions "BYTES.between(0, 131072)" "BYTES.between(131073, 262144)" "BYTES.between(262145, 524287)" "BYTES == 524288" --hspace 1.2 --fig-output tests/fixtures/iosnoop-sample-bytes.png

csv

  • write contents parsed from iosnoop output as csv file
(venv) $ iosnoop-cli --data tests/fixtures/iosnoop-sample.log csv --output iosnoop.csv
(venv) $ head iosnoop.csv
STARTs,ENDs,COMM,PID,TYPE,DEV,BLOCK,BYTES,LATms,STARTs_DIFF
14545946.332115,14545946.344366,<...>,17185,WS,"8,160",4840587442,4096,12.25,0
14545946.331036,14545946.347082,main,17197,WS,"8,160",4840666914,4096,16.05,-0.0010790005326271057
14545946.332136,14545946.348852,<...>,17185,WS,"8,160",4840643666,4096,16.72,2.099946141242981e-05

Project details


Release history Release notifications

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
iosnoop-tool-0.1.0.tar.gz (789.8 kB) Copy SHA256 hash SHA256 Source None

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page