Commit f32a67c9 authored by Brendan Gregg's avatar Brendan Gregg

make bitehist a simpler example of log2 histograms

parent 7bc5b993
...@@ -5,8 +5,6 @@ ...@@ -5,8 +5,6 @@
# #
# Written as a basic example of using a histogram to show a distribution. # Written as a basic example of using a histogram to show a distribution.
# #
# USAGE: bitehist.py [interval [count]]
#
# The default interval is 5 seconds. A Ctrl-C will print the partially # The default interval is 5 seconds. A Ctrl-C will print the partially
# gathered histogram then exit. # gathered histogram then exit.
# #
...@@ -17,24 +15,6 @@ ...@@ -17,24 +15,6 @@
from bcc import BPF from bcc import BPF
from time import sleep from time import sleep
from sys import argv
def usage():
print("USAGE: %s [interval [count]]" % argv[0])
exit()
# arguments
interval = 5
count = -1
if len(argv) > 1:
try:
interval = int(argv[1])
if interval == 0:
raise
if len(argv) > 2:
count = int(argv[2])
except: # also catches -h, --help
usage()
# load BPF program # load BPF program
b = BPF(src_file = "bitehist.c") b = BPF(src_file = "bitehist.c")
...@@ -44,20 +24,10 @@ b.attach_kprobe(event="blk_start_request", fn_name="do_request") ...@@ -44,20 +24,10 @@ b.attach_kprobe(event="blk_start_request", fn_name="do_request")
print("Tracing... Hit Ctrl-C to end.") print("Tracing... Hit Ctrl-C to end.")
# output # output
loop = 0 try:
do_exit = 0 sleep(99999999)
while (1): except KeyboardInterrupt:
if count > 0:
loop += 1
if loop > count:
exit()
try:
sleep(interval)
except KeyboardInterrupt:
pass; do_exit = 1
print print
b["dist"].print_log2_hist()
b["dist"].clear() b["dist"].print_log2_hist()
if do_exit: b["dist"].clear()
exit()
Demonstrations of bitehist.py, the Linux eBPF/bcc version. Demonstrations of bitehist.py, the Linux eBPF/bcc version.
This prints a power-of-2 histogram to show the block I/O size distribution. This prints a power-of-2 histogram to show the block I/O size distribution.
By default, a summary is printed every five seconds: A summary is printed after Ctrl-C is hit.
# ./bitehist.py # ./bitehist.py
Tracing... Hit Ctrl-C to end. Tracing... Hit Ctrl-C to end.
kbytes : count distribution
0 -> 1 : 0 | |
2 -> 3 : 0 | |
4 -> 7 : 26 |************* |
8 -> 15 : 3 |* |
16 -> 31 : 5 |** |
32 -> 63 : 6 |*** |
64 -> 127 : 7 |*** |
128 -> 255 : 75 |**************************************|
kbytes : count distribution
0 -> 1 : 0 | |
2 -> 3 : 0 | |
4 -> 7 : 83 |**************************************|
8 -> 15 : 2 | |
16 -> 31 : 6 |** |
32 -> 63 : 6 |** |
64 -> 127 : 5 |** |
128 -> 255 : 21 |********* |
^C ^C
kbytes : count distribution value : count distribution
0 -> 1 : 0 | | 0 -> 1 : 3 | |
2 -> 3 : 0 | |
4 -> 7 : 8 |**************************************|
The first output shows a bimodal distribution. The largest mode of 75 I/O were
between 128 and 255 Kbytes in size, and another mode of 26 I/O were between 4
and 7 Kbytes in size.
The next output summary shows the workload is doing more 4 - 7 Kbyte I/O.
The final output is partial, showing what was measured until Ctrl-C was hit.
For an output interval of one second, and three summaries:
# ./bitehist.py 1 3
Tracing... Hit Ctrl-C to end.
kbytes : count distribution
0 -> 1 : 0 | |
2 -> 3 : 0 | | 2 -> 3 : 0 | |
4 -> 7 : 4 |**************************************| 4 -> 7 : 211 |********** |
kbytes : count distribution
0 -> 1 : 0 | |
2 -> 3 : 0 | |
4 -> 7 : 5 |**************************************|
8 -> 15 : 0 | | 8 -> 15 : 0 | |
16 -> 31 : 0 | | 16 -> 31 : 0 | |
32 -> 63 : 1 |******* | 32 -> 63 : 0 | |
64 -> 127 : 1 | |
kbytes : count distribution 128 -> 255 : 800 |**************************************|
0 -> 1 : 0 | |
2 -> 3 : 0 | |
4 -> 7 : 4 |**************************************|
Full usage: This output shows a bimodal distribution. The largest mod of 800 I/O were
between 128 and 255 Kbytes in size, and another mode of 211 I/O were between
4 and 7 Kbytes in size.
# ./bitehist.py -h Understanding this distribution is useful for characterizing workloads and
USAGE: ./bitehist.py [interval [count]] understanding performance. The existance of this distribution is not visible
from averages alone.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment