1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
<?xml version='1.0'?>
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
]>
<section id="useful-disk-graphwithgnuplot">
<title>Real-Time Graphing of Disk and CPU Utilization</title>
<remark>
http://sourceware.org/systemtap/examples/subsystem-index.html
</remark>
<remark>
Graphing Disk and CPU Utilization - http://sourceware.org/systemtap/examples/general/graphs.stp
</remark>
<para>This section describes how you can graph disk and CPU utilization in real-time, i.e. in samples of 1 second each.</para>
<formalpara id="scriptdiskusage">
<title>disk-usage-graph.stp</title>
<para>
<programlisting>
#! stap
# disk I/O stats
probe begin { qnames["ioblock"] ++; qsq_start ("ioblock") }
probe ioblock.request { qs_wait ("ioblock") qs_run("ioblock") }
probe ioblock.end { qs_done ("ioblock") }
# CPU utilization
probe begin { qnames["cpu"] ++; qsq_start ("cpu") }
probe scheduler.cpu_on { if (!idle) {qs_wait ("cpu") qs_run ("cpu") }}
probe scheduler.cpu_off { if (!idle) qs_done ("cpu") }
# ------------------------------------------------------------------------
# utilization history tracking
global N
probe begin { N = 50 }
global qnames, util, histidx
function qsq_util_reset(q) {
u=qsq_utilization (q, 100)
qsq_start (q)
return u
}
probe timer.ms(100) { # collect utilization percentages frequently
histidx = (histidx + 1) % N # into circular buffer
foreach (q in qnames)
util[histidx,q] = qsq_util_reset(q)
}
# ------------------------------------------------------------------------
# general gnuplot graphical report generation
probe timer.ms(1000) {
# emit gnuplot command to display recent history
printf ("set yrange [0:100]\n")
printf ("plot ")
foreach (q in qnames+)
{
if (++nq >= 2) printf (", ")
printf ("'-' title \"%s\" with lines", q)
}
printf ("\n")
foreach (q in qnames+) {
for (i = (histidx + 1) % N; i != histidx; i = (i + 1) % N)
printf("%d\n", util[i,q])
printf ("e\n")
}
printf ("pause 1\n")
}
</programlisting>
</para>
</formalpara>
<para><xref linkend="scriptdiskusage"/> outputs raw statistics on both CPU and disk usage per second. I/O usage is tracked through the events <command>ioblock.request</command> and <command>ioblock.request.end</command>, which track each request (and request completion) for a generic block I/O. CPU usage is tracked through <command>scheduler.cpu_on</command> and <command>scheduler.cpu_off</command>, which are activated whenever a process begins (and ends) a command execution on a CPU.</para>
<section id="gnuplotexplain">
<title>gnuplot</title>
<para>Running <xref linkend="scriptdiskusage"/> by itself hardly presents any data that is useful, as in <xref linkend="rawdiskusagegraph"/>.</para>
<example id="rawdiskusagegraph"><title>Raw disk-usage-graph.stp Output</title>
<screen>
[...]
62
5
3
4
6
4
4
5
5
3
6
5
e
pause 1
</screen>
</example>
<para>However, refining the output of <xref linkend="scriptdiskusage"/> through <command>gnuplot</command> presents us with a more useful result. <command>gnuplot</command> is a lightweight, command-line driven plotting program that helps you display data in a graphical format.</para>
<para>By piping <xref linkend="scriptdiskusage"/> output to <command>gnuplot</command> (as in <command>stap disk-usage-gr<remark>
http://sourceware.org/systemtap/examples/subsystem-index.html
</remark>
<remark>
Graphing Disk and CPU Utilization - http://sourceware.org/systemtap/examples/general/graphs.stp
</remark> aph.stp | gnuplot</command>), we get a graphical output similar to the following:</para>
<figure id="gnuoutputsample">
<title>Graphical Output Sample</title>
<mediaobject>
<imageobject>
<imagedata fileref="images/gnuplotsample.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Sample output</phrase>
</textobject>
<caption>
<para>
Sample output of <xref linkend="scriptdiskusage"/> when piped through <command>gnuplot</command>
</para>
</caption>
</mediaobject>
</figure>
<para><xref linkend="gnuoutputsample"/> presents a cleaner, more useful graphical output. This graph can show you the level of utilization for both I/O and CPU, in real time.</para>
<remark>
question: does this script also capture stap process? i.e. does the graph also include CPU utilization by systemtap while the script is running?
</remark>
<!--
disktop has no entry in war stories
<remark>
Summarize Disk Read/Write Traffic
http://sourceware.org/systemtap/examples/io/disktop.stp
</remark>-->
</section>
</section>
|