summaryrefslogtreecommitdiffstats
path: root/doc/SystemTap_Beginners_Guide/en-US/Useful_Scripts-topsys.xml
blob: ba814d5e3c42450318a35677335d31b692365a8a (plain)
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
<?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="topsyssect">
<title>Tracking Most Frequently Used System Calls</title>
<indexterm>
<primary>script examples</primary>
<secondary>monitoring system calls</secondary>
</indexterm>

<indexterm>
<primary>examples of SystemTap scripts</primary>
<secondary>monitoring system calls</secondary>
</indexterm>

<indexterm>
<primary>monitoring system calls</primary>
<secondary>examples of SystemTap scripts</secondary>
</indexterm>		
		
<!--
<indexterm>
<primary>counting function calls</primary>
<secondary>examples of SystemTap scripts</secondary>
</indexterm>
-->

<indexterm>
<primary>system calls, monitoring</primary>
<secondary>examples of SystemTap scripts</secondary>
</indexterm>
		
<remark>
uses systemtap/testsuite/systemtap.examples/profiling/topsys.stp
</remark>	
				
		
	<para>
		<xref linkend="timeouts"/> from <xref linkend="timeoutssect"/> helps you identify which applications
		are polling by pointing out which ones used the following system calls most frequently:
	</para>
	
	<itemizedlist>
		<listitem><para><command>poll</command></para></listitem>
		<listitem><para><command>select</command></para></listitem>
		<listitem><para><command>epoll</command></para></listitem>
		<listitem><para><command>itimer</command></para></listitem>
		<listitem><para><command>futex</command></para></listitem>
		<listitem><para><command>nanosleep</command></para></listitem>
		<listitem><para><command>signal</command></para></listitem>
	</itemizedlist>		
		
	<para>
		However, in some systems, a different system call might be responsible for excessive polling. If you suspect 
		that a polling application might is using a different system call to poll, you need to identify first the top
		system calls used by the system. To do this, use <xref linkend="topsys"/>.
	</para>	

<formalpara id="topsys">
	<title>topsys.stp</title>
<para>
<programlisting>
<xi:include parse="text" href="../testsuite/systemtap.examples/profiling/topsys.stp" xmlns:xi="http://www.w3.org/2001/XInclude" />
</programlisting>
</para>
</formalpara>		
	
<para>
	<xref linkend="topsys"/> lists the top 20 system calls used by the system per 5-second interval. It also lists 
	how many times each system call was used during that period. Refer to <xref linkend="topsysoutput"/> for a sample output. 
</para>	
	
<indexterm>
<primary>script examples</primary>
<secondary>timer.s(), sample usage</secondary>
</indexterm>

<indexterm>
<primary>examples of SystemTap scripts</primary>
<secondary>timer.s(), sample usage</secondary>
</indexterm>

<indexterm>
<primary>timer.s(), sample usage</primary>
<secondary>examples of SystemTap scripts</secondary>
</indexterm>


<example id="topsysoutput">
	<title><xref linkend="topsys"/> Sample Output</title>
<screen>
--------------------------------------------------------------
                  SYSCALL      COUNT
             gettimeofday       1857
                     read       1821
                    ioctl       1568
                     poll       1033
                    close        638
                     open        503
                   select        455
                    write        391
                   writev        335
                    futex        303
                  recvmsg        251
                   socket        137
            clock_gettime        124
           rt_sigprocmask        121
                   sendto        120
                setitimer        106
                     stat         90
                     time         81
                sigreturn         72
                    fstat         66
--------------------------------------------------------------
</screen>
</example>
<!--probe kernel.function(@1) {  # probe function passed as argument from stdin
called[probefunc()] &lt;&lt;&lt; 1  # add a count efficiently
}
global called          
probe end,timer.ms(30000) {
foreach (fn+ in called)  # Sort by function name
#       (fn in called-)  # Sort by call count (in decreasing order)
printf("%s %d\n", fn, @count(called[fn]))
exit()
}-->

	</section>