fluent-plugin-perf-tools 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.rubocop.yml +26 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +43 -0
- data/Rakefile +17 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/fluent-plugin-perf-tools.gemspec +48 -0
- data/lib/fluent/plugin/in_perf_tools.rb +42 -0
- data/lib/fluent/plugin/perf_tools/cachestat.rb +65 -0
- data/lib/fluent/plugin/perf_tools/command.rb +30 -0
- data/lib/fluent/plugin/perf_tools/version.rb +9 -0
- data/lib/fluent/plugin/perf_tools.rb +11 -0
- data/perf-tools/LICENSE +339 -0
- data/perf-tools/README.md +205 -0
- data/perf-tools/bin/bitesize +1 -0
- data/perf-tools/bin/cachestat +1 -0
- data/perf-tools/bin/execsnoop +1 -0
- data/perf-tools/bin/funccount +1 -0
- data/perf-tools/bin/funcgraph +1 -0
- data/perf-tools/bin/funcslower +1 -0
- data/perf-tools/bin/functrace +1 -0
- data/perf-tools/bin/iolatency +1 -0
- data/perf-tools/bin/iosnoop +1 -0
- data/perf-tools/bin/killsnoop +1 -0
- data/perf-tools/bin/kprobe +1 -0
- data/perf-tools/bin/opensnoop +1 -0
- data/perf-tools/bin/perf-stat-hist +1 -0
- data/perf-tools/bin/reset-ftrace +1 -0
- data/perf-tools/bin/syscount +1 -0
- data/perf-tools/bin/tcpretrans +1 -0
- data/perf-tools/bin/tpoint +1 -0
- data/perf-tools/bin/uprobe +1 -0
- data/perf-tools/deprecated/README.md +1 -0
- data/perf-tools/deprecated/execsnoop-proc +150 -0
- data/perf-tools/deprecated/execsnoop-proc.8 +80 -0
- data/perf-tools/deprecated/execsnoop-proc_example.txt +46 -0
- data/perf-tools/disk/bitesize +175 -0
- data/perf-tools/examples/bitesize_example.txt +63 -0
- data/perf-tools/examples/cachestat_example.txt +58 -0
- data/perf-tools/examples/execsnoop_example.txt +153 -0
- data/perf-tools/examples/funccount_example.txt +126 -0
- data/perf-tools/examples/funcgraph_example.txt +2178 -0
- data/perf-tools/examples/funcslower_example.txt +110 -0
- data/perf-tools/examples/functrace_example.txt +341 -0
- data/perf-tools/examples/iolatency_example.txt +350 -0
- data/perf-tools/examples/iosnoop_example.txt +302 -0
- data/perf-tools/examples/killsnoop_example.txt +62 -0
- data/perf-tools/examples/kprobe_example.txt +379 -0
- data/perf-tools/examples/opensnoop_example.txt +47 -0
- data/perf-tools/examples/perf-stat-hist_example.txt +149 -0
- data/perf-tools/examples/reset-ftrace_example.txt +88 -0
- data/perf-tools/examples/syscount_example.txt +297 -0
- data/perf-tools/examples/tcpretrans_example.txt +93 -0
- data/perf-tools/examples/tpoint_example.txt +210 -0
- data/perf-tools/examples/uprobe_example.txt +321 -0
- data/perf-tools/execsnoop +292 -0
- data/perf-tools/fs/cachestat +167 -0
- data/perf-tools/images/perf-tools_2016.png +0 -0
- data/perf-tools/iolatency +296 -0
- data/perf-tools/iosnoop +296 -0
- data/perf-tools/kernel/funccount +146 -0
- data/perf-tools/kernel/funcgraph +259 -0
- data/perf-tools/kernel/funcslower +248 -0
- data/perf-tools/kernel/functrace +192 -0
- data/perf-tools/kernel/kprobe +270 -0
- data/perf-tools/killsnoop +263 -0
- data/perf-tools/man/man8/bitesize.8 +70 -0
- data/perf-tools/man/man8/cachestat.8 +111 -0
- data/perf-tools/man/man8/execsnoop.8 +104 -0
- data/perf-tools/man/man8/funccount.8 +76 -0
- data/perf-tools/man/man8/funcgraph.8 +166 -0
- data/perf-tools/man/man8/funcslower.8 +129 -0
- data/perf-tools/man/man8/functrace.8 +123 -0
- data/perf-tools/man/man8/iolatency.8 +116 -0
- data/perf-tools/man/man8/iosnoop.8 +169 -0
- data/perf-tools/man/man8/killsnoop.8 +100 -0
- data/perf-tools/man/man8/kprobe.8 +162 -0
- data/perf-tools/man/man8/opensnoop.8 +113 -0
- data/perf-tools/man/man8/perf-stat-hist.8 +111 -0
- data/perf-tools/man/man8/reset-ftrace.8 +49 -0
- data/perf-tools/man/man8/syscount.8 +96 -0
- data/perf-tools/man/man8/tcpretrans.8 +93 -0
- data/perf-tools/man/man8/tpoint.8 +140 -0
- data/perf-tools/man/man8/uprobe.8 +168 -0
- data/perf-tools/misc/perf-stat-hist +223 -0
- data/perf-tools/net/tcpretrans +311 -0
- data/perf-tools/opensnoop +280 -0
- data/perf-tools/syscount +192 -0
- data/perf-tools/system/tpoint +232 -0
- data/perf-tools/tools/reset-ftrace +123 -0
- data/perf-tools/user/uprobe +390 -0
- metadata +349 -0
@@ -0,0 +1,263 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
#
|
3
|
+
# killsnoop - trace kill() syscalls with signal/process details.
|
4
|
+
# Written using Linux ftrace.
|
5
|
+
#
|
6
|
+
# This traces kill() syscalls, showing which process killed which pid and
|
7
|
+
# returns the returncode (0 for success, -1 for error).
|
8
|
+
#
|
9
|
+
# This implementation is designed to work on older kernel versions, and without
|
10
|
+
# kernel debuginfo. It works by dynamic tracing of the return value of kill()
|
11
|
+
# and associating it with the previous kill() syscall return.
|
12
|
+
# This approach is kernel version specific, and may not work on your version.
|
13
|
+
# It is a workaround, and proof of concept for ftrace, until more kernel tracing
|
14
|
+
# functionality is available.
|
15
|
+
#
|
16
|
+
# USAGE: ./killsnoop [-hst] [-d secs] [-p pid] [-n name]
|
17
|
+
#
|
18
|
+
# Run "killsnoop -h" for full usage.
|
19
|
+
#
|
20
|
+
# REQUIREMENTS: FTRACE and KPROBE CONFIG, syscalls:sys_enter_kill and
|
21
|
+
# syscalls:sys_exit_kill kernel tracepoints (you may already have these
|
22
|
+
# on recent kernels) and awk.
|
23
|
+
#
|
24
|
+
# From perf-tools: https://github.com/brendangregg/perf-tools
|
25
|
+
#
|
26
|
+
# See the killsnoop(8) man page (in perf-tools) for more info.
|
27
|
+
#
|
28
|
+
# COPYRIGHT: Copyright (c) 2014 Brendan Gregg.
|
29
|
+
# COPYRIGHT: Copyright (c) 2014 Martin Probst.
|
30
|
+
#
|
31
|
+
# This program is free software; you can redistribute it and/or
|
32
|
+
# modify it under the terms of the GNU General Public License
|
33
|
+
# as published by the Free Software Foundation; either version 2
|
34
|
+
# of the License, or (at your option) any later version.
|
35
|
+
#
|
36
|
+
# This program is distributed in the hope that it will be useful,
|
37
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
38
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
39
|
+
# GNU General Public License for more details.
|
40
|
+
#
|
41
|
+
# You should have received a copy of the GNU General Public License
|
42
|
+
# along with this program; if not, write to the Free Software Foundation,
|
43
|
+
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
44
|
+
#
|
45
|
+
# (http://www.gnu.org/copyleft/gpl.html)
|
46
|
+
#
|
47
|
+
# 20-Jul-2014 Brendan Gregg Templated this.
|
48
|
+
# 13-Sep-2014 Martin Probst Created this.
|
49
|
+
|
50
|
+
### default variables
|
51
|
+
tracing=/sys/kernel/debug/tracing
|
52
|
+
flock=/var/tmp/.ftrace-lock; wroteflock=0
|
53
|
+
opt_duration=0; duration=; opt_name=0; name=; opt_pid=0; pid=; ftext=
|
54
|
+
opt_time=0; opt_fail=0; opt_file=0; file=
|
55
|
+
kevent_entry=events/syscalls/sys_enter_kill
|
56
|
+
kevent_return=events/syscalls/sys_exit_kill
|
57
|
+
trap ':' INT QUIT TERM PIPE HUP # sends execution to end tracing section
|
58
|
+
|
59
|
+
function usage {
|
60
|
+
cat <<-END >&2
|
61
|
+
USAGE: killsnoop [-hst] [-d secs] [-p PID] [-n name] [filename]
|
62
|
+
-d seconds # trace duration, and use buffers
|
63
|
+
-n name # process name to match
|
64
|
+
-p PID # PID to match on kill issue
|
65
|
+
-t # include time (seconds)
|
66
|
+
-s # human readable signal names
|
67
|
+
-h # this usage message
|
68
|
+
eg,
|
69
|
+
killsnoop # watch kill()s live (unbuffered)
|
70
|
+
killsnoop -d 1 # trace 1 sec (buffered)
|
71
|
+
killsnoop -p 181 # trace kill()s issued to PID 181 only
|
72
|
+
|
73
|
+
See the man page and example file for more info.
|
74
|
+
END
|
75
|
+
exit
|
76
|
+
}
|
77
|
+
|
78
|
+
function warn {
|
79
|
+
if ! eval "$@"; then
|
80
|
+
echo >&2 "WARNING: command failed \"$@\""
|
81
|
+
fi
|
82
|
+
}
|
83
|
+
|
84
|
+
function end {
|
85
|
+
# disable tracing
|
86
|
+
echo 2>/dev/null
|
87
|
+
echo "Ending tracing..." 2>/dev/null
|
88
|
+
cd $tracing
|
89
|
+
warn "echo 0 > $kevent_entry/enable"
|
90
|
+
warn "echo 0 > $kevent_return/enable"
|
91
|
+
warn "echo > trace"
|
92
|
+
(( wroteflock )) && warn "rm $flock"
|
93
|
+
}
|
94
|
+
|
95
|
+
function die {
|
96
|
+
echo >&2 "$@"
|
97
|
+
exit 1
|
98
|
+
}
|
99
|
+
|
100
|
+
function edie {
|
101
|
+
# die with a quiet end()
|
102
|
+
echo >&2 "$@"
|
103
|
+
exec >/dev/null 2>&1
|
104
|
+
end
|
105
|
+
exit 1
|
106
|
+
}
|
107
|
+
|
108
|
+
### process options
|
109
|
+
while getopts d:hn:p:st opt
|
110
|
+
do
|
111
|
+
case $opt in
|
112
|
+
d) opt_duration=1; duration=$OPTARG ;;
|
113
|
+
n) opt_name=1; name=$OPTARG ;;
|
114
|
+
p) opt_pid=1; pid=$OPTARG ;;
|
115
|
+
t) opt_time=1 ;;
|
116
|
+
s) opt_fancy=1 ;;
|
117
|
+
h|?) usage ;;
|
118
|
+
esac
|
119
|
+
done
|
120
|
+
shift $(( $OPTIND - 1 ))
|
121
|
+
(( $# )) && usage
|
122
|
+
|
123
|
+
### option logic
|
124
|
+
(( opt_pid && opt_name )) && die "ERROR: use either -p or -n."
|
125
|
+
(( opt_pid )) && ftext=" issued to PID $pid"
|
126
|
+
(( opt_name )) && ftext=" issued by process name \"$name\""
|
127
|
+
if (( opt_duration )); then
|
128
|
+
echo "Tracing kill()s$ftext for $duration seconds (buffered)..."
|
129
|
+
else
|
130
|
+
echo "Tracing kill()s$ftext. Ctrl-C to end."
|
131
|
+
fi
|
132
|
+
|
133
|
+
### select awk
|
134
|
+
# workaround for mawk fflush()
|
135
|
+
[[ -x /usr/bin/mawk ]] && awk="mawk" && mawk -W interactive && \
|
136
|
+
[ $? -eq 0 ] && awk="mawk -W interactive"
|
137
|
+
# workaround for gawk strtonum()
|
138
|
+
[[ -x /usr/bin/gawk ]] && awk="gawk --non-decimal-data"
|
139
|
+
|
140
|
+
### check permissions
|
141
|
+
cd $tracing || die "ERROR: accessing tracing. Root user? Kernel has FTRACE?
|
142
|
+
debugfs mounted? (mount -t debugfs debugfs /sys/kernel/debug)"
|
143
|
+
|
144
|
+
### ftrace lock
|
145
|
+
[[ -e $flock ]] && die "ERROR: ftrace may be in use by PID $(cat $flock) $flock"
|
146
|
+
echo $$ > $flock || die "ERROR: unable to write $flock."
|
147
|
+
wroteflock=1
|
148
|
+
|
149
|
+
### setup and begin tracing
|
150
|
+
echo nop > current_tracer
|
151
|
+
if ! echo 1 > $kevent_entry/enable; then
|
152
|
+
edie "ERROR: enabling kill() entry tracepoint Exiting."
|
153
|
+
fi
|
154
|
+
if ! echo 1 > $kevent_return/enable; then
|
155
|
+
edie "ERROR: enabling kill() return tracepoint. Exiting."
|
156
|
+
fi
|
157
|
+
(( opt_time )) && printf "%-16s " "TIMEs"
|
158
|
+
printf "%-16.16s %-6s %-8s %-10s %4s\n" "COMM" "PID" "TPID" "SIGNAL" "RETURN"
|
159
|
+
|
160
|
+
#
|
161
|
+
# Determine output format. It may be one of the following (newest first):
|
162
|
+
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
|
163
|
+
# TASK-PID CPU# TIMESTAMP FUNCTION
|
164
|
+
# To differentiate between them, the number of header fields is counted,
|
165
|
+
# and an offset set, to skip the extra column when needed.
|
166
|
+
#
|
167
|
+
offset=$($awk 'BEGIN { o = 0; }
|
168
|
+
$1 == "#" && $2 ~ /TASK/ && NF == 6 { o = 1; }
|
169
|
+
$2 ~ /TASK/ { print o; exit }' trace)
|
170
|
+
|
171
|
+
### print trace buffer
|
172
|
+
warn "echo > trace"
|
173
|
+
( if (( opt_duration )); then
|
174
|
+
# wait then dump buffer
|
175
|
+
sleep $duration
|
176
|
+
cat trace
|
177
|
+
else
|
178
|
+
# print buffer live
|
179
|
+
cat trace_pipe
|
180
|
+
fi ) | $awk -v o=$offset -v opt_name=$opt_name -v name=$name \
|
181
|
+
-v opt_duration=$opt_duration -v opt_time=$opt_time \
|
182
|
+
-v opt_pid=$pid -v opt_fancy=$opt_fancy '
|
183
|
+
# fancy signal names
|
184
|
+
BEGIN {
|
185
|
+
signals[1] = "SIGHUP"
|
186
|
+
signals[2] = "SIGINT"
|
187
|
+
signals[3] = "SIGQUIT"
|
188
|
+
signals[4] = "SIGILL"
|
189
|
+
signals[6] = "SIGABRT"
|
190
|
+
signals[8] = "SIGFPE"
|
191
|
+
signals[9] = "SIGKILL"
|
192
|
+
signals[11] = "SIGSEGV"
|
193
|
+
signals[13] = "SIGPIPE"
|
194
|
+
signals[14] = "SIGALRM"
|
195
|
+
signals[15] = "SIGTERM"
|
196
|
+
signals[10] = "SIGUSR1"
|
197
|
+
signals[12] = "SIGUSR2"
|
198
|
+
signals[17] = "SIGCHLD"
|
199
|
+
signals[18] = "SIGCONT"
|
200
|
+
signals[19] = "SIGSTOP"
|
201
|
+
signals[20] = "SIGTSTP"
|
202
|
+
signals[21] = "SIGTTIN"
|
203
|
+
signals[22] = "SIGTTOU"
|
204
|
+
}
|
205
|
+
|
206
|
+
# common fields
|
207
|
+
$1 != "#" {
|
208
|
+
# task name can contain dashes
|
209
|
+
comm = pid = $1
|
210
|
+
sub(/-[0-9][0-9]*/, "", comm)
|
211
|
+
if (opt_name && match(comm, name) == 0)
|
212
|
+
next
|
213
|
+
sub(/.*-/, "", pid)
|
214
|
+
}
|
215
|
+
|
216
|
+
# sys_kill() entry
|
217
|
+
$1 != "#" && $(4+o) ~ /sys_kill/ && $(5+o) !~ /->/ {
|
218
|
+
#
|
219
|
+
# eg: ... sys_kill(pid:...
|
220
|
+
#
|
221
|
+
kpid = $(5+o)
|
222
|
+
signal = $(7+o)
|
223
|
+
sub(/,$/, "", kpid)
|
224
|
+
sub(/\)$/, "", signal)
|
225
|
+
kpid = int("0x"kpid)
|
226
|
+
signal = int("0x"signal)
|
227
|
+
current[pid,"kpid"] = kpid
|
228
|
+
current[pid,"signal"] = signal
|
229
|
+
}
|
230
|
+
|
231
|
+
# sys_kill exit
|
232
|
+
$1 != "#" && $(5+o) ~ /->/ {
|
233
|
+
rv = int($NF)
|
234
|
+
killed_pid = current[pid,"kpid"]
|
235
|
+
signal = current[pid,"signal"]
|
236
|
+
|
237
|
+
delete current[pid,"kpid"]
|
238
|
+
delete current[pid,"signal"]
|
239
|
+
|
240
|
+
if(opt_pid && killed_pid != opt_pid) {
|
241
|
+
next
|
242
|
+
}
|
243
|
+
|
244
|
+
if (opt_time) {
|
245
|
+
time = $(3+o); sub(":", "", time)
|
246
|
+
printf "%-16s ", time
|
247
|
+
}
|
248
|
+
|
249
|
+
if (opt_fancy) {
|
250
|
+
if (signals[signal] != "") {
|
251
|
+
signal = signals[signal]
|
252
|
+
}
|
253
|
+
}
|
254
|
+
|
255
|
+
printf "%-16.16s %-6s %-8s %-10s %-4s\n", comm, pid, killed_pid, signal,
|
256
|
+
rv
|
257
|
+
}
|
258
|
+
|
259
|
+
$0 ~ /LOST.*EVENTS/ { print "WARNING: " $0 > "/dev/stderr" }
|
260
|
+
'
|
261
|
+
|
262
|
+
### end tracing
|
263
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
.TH bitesize 8 "2014-07-07" "USER COMMANDS"
|
2
|
+
.SH NAME
|
3
|
+
bitesize \- show disk I/O size as a histogram. Uses Linux perf_events.
|
4
|
+
.SH SYNOPSIS
|
5
|
+
.B bitesize
|
6
|
+
[-h] [-b buckets] [seconds]
|
7
|
+
.SH DESCRIPTION
|
8
|
+
This can be used to characterize the distribution of block device (disk) I/O
|
9
|
+
sizes. To study block device I/O in more detail, see iosnoop(8).
|
10
|
+
|
11
|
+
This uses multiple counting tracepoints with different filters, one for each
|
12
|
+
histogram bucket. While this is summarized in-kernel, the use of multiple
|
13
|
+
tracepoints does add addiitonal overhead, which is more evident if you add
|
14
|
+
more buckets. In the future this functionality will be available in an
|
15
|
+
efficient way in the kernel, and this tool can be rewritten.
|
16
|
+
.SH REQUIREMENTS
|
17
|
+
Linux perf_events: add linux-tools-common, run "perf", then add any additional
|
18
|
+
packages it requests. This also requires the block:block_rq_issue tracepoint,
|
19
|
+
which should already be available in recent kernels.
|
20
|
+
.SH OPTIONS
|
21
|
+
.TP
|
22
|
+
\-h
|
23
|
+
Usage message.
|
24
|
+
.TP
|
25
|
+
\-b buckets
|
26
|
+
Specify a list of bucket points for the histogram as a string (eg, "10 500
|
27
|
+
1000"). The histogram will include buckets for less-than the minimum, and
|
28
|
+
greater-than-or-equal-to the maximum. If a single value is specified, two
|
29
|
+
statistics only are gathered: for less-than and for greater-than-or-equal-to.
|
30
|
+
The overhead is relative to the number of buckets, so only specifying a
|
31
|
+
single value costs the lowest overhead.
|
32
|
+
.TP
|
33
|
+
seconds
|
34
|
+
Number of seconds to trace. If not specified, this runs until Ctrl-C.
|
35
|
+
.SH EXAMPLES
|
36
|
+
.TP
|
37
|
+
Trace read() syscalls until Ctrl-C, and show histogram of requested size:
|
38
|
+
#
|
39
|
+
.B bitesize syscalls:sys_enter_read count
|
40
|
+
.SH FIELDS
|
41
|
+
.TP
|
42
|
+
Kbytes
|
43
|
+
Kbyte range of the histogram bucket.
|
44
|
+
.TP
|
45
|
+
I/O
|
46
|
+
Number of I/O that occurred in this range while tracing.
|
47
|
+
.TP
|
48
|
+
Distribution
|
49
|
+
ASCII histogram representation of the I/O column.
|
50
|
+
.SH OVERHEAD
|
51
|
+
While the counts are performed in-kernel, there is one tracepoint used per
|
52
|
+
histogram bucket, so the overheads are higher than usual (relative to the
|
53
|
+
number of buckets) than function counting using perf stat. The lowest
|
54
|
+
overhead is when \-b is used to specify one bucket only, bifurcating
|
55
|
+
statistics.
|
56
|
+
.SH SOURCE
|
57
|
+
This is from the perf-tools collection.
|
58
|
+
.IP
|
59
|
+
https://github.com/brendangregg/perf-tools
|
60
|
+
.PP
|
61
|
+
Also look under the examples directory for a text file containing example
|
62
|
+
usage, output, and commentary for this tool.
|
63
|
+
.SH OS
|
64
|
+
Linux
|
65
|
+
.SH STABILITY
|
66
|
+
Unstable - in development.
|
67
|
+
.SH AUTHOR
|
68
|
+
Brendan Gregg
|
69
|
+
.SH SEE ALSO
|
70
|
+
iosnoop(8), iolatency(8), iostat(1)
|
@@ -0,0 +1,111 @@
|
|
1
|
+
.TH cachestat 8 "2014-12-28" "USER COMMANDS"
|
2
|
+
.SH NAME
|
3
|
+
cachestat \- Measure page cache hits/misses. Uses Linux ftrace.
|
4
|
+
.SH SYNOPSIS
|
5
|
+
.B cachestat
|
6
|
+
[\-Dht] [interval]
|
7
|
+
.SH DESCRIPTION
|
8
|
+
This tool provides basic cache hit/miss statistics for the Linux page cache.
|
9
|
+
|
10
|
+
Its current implementation uses Linux ftrace dynamic function profiling to
|
11
|
+
create custom in-kernel counters, which is a workaround until such counters
|
12
|
+
can be built-in to the kernel. Specifically, four kernel functions are counted:
|
13
|
+
.IP
|
14
|
+
mark_page_accessed() for measuring cache accesses
|
15
|
+
.IP
|
16
|
+
mark_buffer_dirty() for measuring cache writes
|
17
|
+
.IP
|
18
|
+
add_to_page_cache_lru() for measuring page additions
|
19
|
+
.IP
|
20
|
+
account_page_dirtied() for measuring page dirties
|
21
|
+
.PP
|
22
|
+
It is possible that these functions have been renamed (or are different
|
23
|
+
logically) for your kernel version, and this script will not work as-is.
|
24
|
+
This was written for a Linux 3.13 kernel, and tested on a few others versions.
|
25
|
+
This script is a sandcastle: the kernel may wash some away, and you'll
|
26
|
+
need to rebuild.
|
27
|
+
|
28
|
+
This program's implementation can be improved in the future when other
|
29
|
+
kernel capabilities are made available. If you need a more reliable tool now,
|
30
|
+
then consider other tracing alternatives (eg, SystemTap). This tool is really
|
31
|
+
a proof of concept to see what ftrace can currently do.
|
32
|
+
|
33
|
+
WARNING: This uses dynamic tracing of kernel functions, and could cause
|
34
|
+
kernel panics or freezes. Test, and know what you are doing, before use.
|
35
|
+
It also traces cache activity, which can be frequent, and cost some overhead.
|
36
|
+
The statistics should be treated as best-effort: there may be some error
|
37
|
+
margin depending on unusual workload types.
|
38
|
+
|
39
|
+
Since this uses ftrace, only the root user can use this tool.
|
40
|
+
.SH REQUIREMENTS
|
41
|
+
CONFIG_FUNCTION_PROFILER, which you may already have enabled and available on
|
42
|
+
recent kernels, and awk.
|
43
|
+
.SH OPTIONS
|
44
|
+
.TP
|
45
|
+
\-D
|
46
|
+
Include extra fields for debug purposes (see script).
|
47
|
+
.TP
|
48
|
+
\-h
|
49
|
+
Print usage message.
|
50
|
+
.TP
|
51
|
+
\-t
|
52
|
+
Include timestamps in units of seconds.
|
53
|
+
.TP
|
54
|
+
interval
|
55
|
+
Output interval in seconds. Default is 1.
|
56
|
+
.SH EXAMPLES
|
57
|
+
.TP
|
58
|
+
Show per-second page cache statistics:
|
59
|
+
#
|
60
|
+
.B cachestat
|
61
|
+
.SH FIELDS
|
62
|
+
.TP
|
63
|
+
TIME
|
64
|
+
Time, in HH:MM:SS.
|
65
|
+
.TP
|
66
|
+
HITS
|
67
|
+
Number of page cache hits (reads). Each hit is for one memory page (the size
|
68
|
+
depends on your processor architecture; commonly 4 Kbytes). Since this tool
|
69
|
+
outputs at a timed interval, this field indicates the cache hit rate.
|
70
|
+
.TP
|
71
|
+
MISSES
|
72
|
+
Number of page cache misses (reads from storage I/O). Each miss is for one
|
73
|
+
memory page. Cache misses should be causing disk I/O. Run iostat(1) for
|
74
|
+
correlation (although the miss count and size by the time disk I/O is issued
|
75
|
+
can differ due to I/O subsystem merging).
|
76
|
+
.TP
|
77
|
+
DIRTIES
|
78
|
+
Number of times a page in the page cache was written to and thus "dirtied".
|
79
|
+
The same page may be counted multiple times per interval, if it is written
|
80
|
+
to multiple times. This field gives an indication of how much cache churn there
|
81
|
+
is, caused by applications writing data.
|
82
|
+
.TP
|
83
|
+
RATIO
|
84
|
+
The ratio of cache hits to total cache accesses (hits + misses), as a
|
85
|
+
percentage.
|
86
|
+
.TP
|
87
|
+
BUFFERS_MB
|
88
|
+
Size of the buffer cache, for disk I/O. From /proc/meminfo.
|
89
|
+
.TP
|
90
|
+
CACHED_MB
|
91
|
+
Size of the page cache, for file system I/O. From /proc/meminfo.
|
92
|
+
.SH OVERHEAD
|
93
|
+
This tool currently uses ftrace function profiling, which provides efficient
|
94
|
+
in-kernel counters. However, the functions profiled are executed frequently,
|
95
|
+
so the overheads can add up. Test and measure before use. My own testing
|
96
|
+
showed around a 2% loss in application performance while this tool was running.
|
97
|
+
.SH SOURCE
|
98
|
+
This is from the perf-tools collection.
|
99
|
+
.IP
|
100
|
+
https://github.com/brendangregg/perf-tools
|
101
|
+
.PP
|
102
|
+
Also look under the examples directory for a text file containing example
|
103
|
+
usage, output, and commentary for this tool.
|
104
|
+
.SH OS
|
105
|
+
Linux
|
106
|
+
.SH STABILITY
|
107
|
+
Unstable - in development.
|
108
|
+
.SH AUTHOR
|
109
|
+
Brendan Gregg
|
110
|
+
.SH SEE ALSO
|
111
|
+
iostat(1), iosnoop(8)
|
@@ -0,0 +1,104 @@
|
|
1
|
+
.TH execsnoop 8 "2014-07-07" "USER COMMANDS"
|
2
|
+
.SH NAME
|
3
|
+
execsnoop \- trace process exec() with arguments. Uses Linux ftrace.
|
4
|
+
.SH SYNOPSIS
|
5
|
+
.B execsnoop
|
6
|
+
[\-hrt] [\-a argc] [\-d secs] [name]
|
7
|
+
.SH DESCRIPTION
|
8
|
+
execsnoop traces process execution, showing PID, PPID, and argument details
|
9
|
+
if possible.
|
10
|
+
|
11
|
+
This traces exec() from the fork()->exec() sequence, which means it won't
|
12
|
+
catch new processes that only fork(). With the -r option, it will also catch
|
13
|
+
processes that re-exec. It makes a best-effort attempt to retrieve the program
|
14
|
+
arguments and PPID; if these are unavailable, 0 and "[?]" are printed
|
15
|
+
respectively. There is also a limit to the number of arguments printed (by
|
16
|
+
default, 8), which can be increased using -a.
|
17
|
+
|
18
|
+
This implementation is designed to work on older kernel versions, and without
|
19
|
+
kernel debuginfo. It works by dynamic tracing an execve kernel function to
|
20
|
+
read the arguments from the %si register. The stub_execve() function is tried
|
21
|
+
first, and then the do_execve() function. The sched:sched_process_fork
|
22
|
+
tracepoint, is used for the PPID. Tracing registers and kernel functions is
|
23
|
+
an unstable technique, and this tool may not work for some kernels or platforms.
|
24
|
+
|
25
|
+
This program is a workaround that should be
|
26
|
+
improved in the future when other kernel capabilities are made available. If
|
27
|
+
you need a more reliable tool now, then consider other tracing alternatives
|
28
|
+
(eg, SystemTap). This tool is really a proof of concept to see what ftrace can
|
29
|
+
currently do.
|
30
|
+
|
31
|
+
Since this uses ftrace, only the root user can use this tool.
|
32
|
+
.SH REQUIREMENTS
|
33
|
+
FTRACE and KPROBE CONFIG, sched:sched_process_fork tracepoint,
|
34
|
+
and either the stub_execve() or do_execve() kernel function. You may already
|
35
|
+
have these on recent kernels. And awk.
|
36
|
+
.SH OPTIONS
|
37
|
+
.TP
|
38
|
+
\-a argc
|
39
|
+
Maximum number of arguments to show. The default is 8, and the maximum allowed
|
40
|
+
is 16. If execsnoop thinks it has truncated the argument list, an ellipsis
|
41
|
+
"[...]" will be shown.
|
42
|
+
.TP
|
43
|
+
\-d seconds
|
44
|
+
Duration to trace, in seconds. This also uses in-kernel buffering.
|
45
|
+
.TP
|
46
|
+
\-h
|
47
|
+
Print usage message.
|
48
|
+
.TP
|
49
|
+
\-r
|
50
|
+
Include re-exec()s.
|
51
|
+
.TP
|
52
|
+
\-t
|
53
|
+
Include timestamps in units of seconds.
|
54
|
+
.TP
|
55
|
+
name
|
56
|
+
Only show processes that match this name.
|
57
|
+
Partials and regular expressions are allowed, as this is filtered in
|
58
|
+
user space by awk.
|
59
|
+
.SH EXAMPLES
|
60
|
+
.TP
|
61
|
+
Trace all new processes and arguments (if possible):
|
62
|
+
#
|
63
|
+
.B execsnoop
|
64
|
+
.TP
|
65
|
+
Trace all new process names containing the text "http":
|
66
|
+
#
|
67
|
+
.B execsnoop http
|
68
|
+
.SH FIELDS
|
69
|
+
.TP
|
70
|
+
TIMEs
|
71
|
+
Time of the exec(), in seconds.
|
72
|
+
.TP
|
73
|
+
PID
|
74
|
+
Process ID.
|
75
|
+
.TP
|
76
|
+
PPID
|
77
|
+
Parent process ID, if this was able to be read. If it wasn't, 0 is printed.
|
78
|
+
.TP
|
79
|
+
ARGS
|
80
|
+
Command line arguments, if these were able to be read. If they aren't able to be
|
81
|
+
read, "[?]" is printed (which would be due to a limitation in this tools
|
82
|
+
implementation, since this is workaround for older kernels; if you need
|
83
|
+
reliable argument tracing, use a different tracer). They will be truncated
|
84
|
+
to the argc limit, and an ellipsis "[...]" may be printed if execsnoop is
|
85
|
+
aware of the truncation.
|
86
|
+
.SH OVERHEAD
|
87
|
+
This reads and processes exec() events in user space as they occur. Since the
|
88
|
+
rate of exec() is expected to be low (< 500/s), the overhead is expected to
|
89
|
+
be small or negligible.
|
90
|
+
.SH SOURCE
|
91
|
+
This is from the perf-tools collection.
|
92
|
+
.IP
|
93
|
+
https://github.com/brendangregg/perf-tools
|
94
|
+
.PP
|
95
|
+
Also look under the examples directory for a text file containing example
|
96
|
+
usage, output, and commentary for this tool.
|
97
|
+
.SH OS
|
98
|
+
Linux
|
99
|
+
.SH STABILITY
|
100
|
+
Unstable - in development.
|
101
|
+
.SH AUTHOR
|
102
|
+
Brendan Gregg
|
103
|
+
.SH SEE ALSO
|
104
|
+
top(1)
|
@@ -0,0 +1,76 @@
|
|
1
|
+
.TH funccount 8 "2014-07-19" "USER COMMANDS"
|
2
|
+
.SH NAME
|
3
|
+
funccount \- count kernel function calls matching specified wildcards. Uses Linux ftrace.
|
4
|
+
.SH SYNOPSIS
|
5
|
+
.B funccount
|
6
|
+
[\-hT] [\-i secs] [\-d secs] [\-t top] funcstring
|
7
|
+
.SH DESCRIPTION
|
8
|
+
This tool is a quick way to determine which kernel functions are being called,
|
9
|
+
and at what rate. It uses ftrace function profiling capabilities.
|
10
|
+
|
11
|
+
WARNING: This uses dynamic tracing of (what can be many) kernel functions,
|
12
|
+
and could cause kernel panics or freezes. Test, and know what you are doing,
|
13
|
+
before use.
|
14
|
+
|
15
|
+
Since this uses ftrace, only the root user can use this tool.
|
16
|
+
.SH REQUIREMENTS
|
17
|
+
CONFIG_FUNCTION_PROFILER, which you may already have enabled and available on
|
18
|
+
recent kernels, and awk.
|
19
|
+
.SH OPTIONS
|
20
|
+
\-d seconds
|
21
|
+
Total duration of the trace.
|
22
|
+
.TP
|
23
|
+
\-h
|
24
|
+
Print usage message.
|
25
|
+
.TP
|
26
|
+
\-i seconds
|
27
|
+
Print an interval summary every so many seconds.
|
28
|
+
.TP
|
29
|
+
\-t top
|
30
|
+
Print top number of entries only.
|
31
|
+
.TP
|
32
|
+
\-T
|
33
|
+
Include timestamp on each summary.
|
34
|
+
.TP
|
35
|
+
funcstring
|
36
|
+
A function name to trace, which may include file glob style wildcards ("*") at
|
37
|
+
the beginning or ending of a string only. Eg, "vfs*" means match "vfs" followed
|
38
|
+
by anything.
|
39
|
+
.SH EXAMPLES
|
40
|
+
.TP
|
41
|
+
Count every kernel function beginning with "bio_", until Ctrl-C is hit:
|
42
|
+
#
|
43
|
+
.B funccount 'bio_*'
|
44
|
+
.TP
|
45
|
+
Count every "tcp_*" kernel function, and print a summary every one second, five in total:
|
46
|
+
#
|
47
|
+
.B funccount \-i 1 \-d 5 'tcp_*'
|
48
|
+
.TP
|
49
|
+
Count every "ext4*" kernel function, and print the top 20 when Ctrl-C is hit:
|
50
|
+
#
|
51
|
+
.B funccount \-t 20 'ext4*'
|
52
|
+
.SH FIELDS
|
53
|
+
.TP
|
54
|
+
FUNC
|
55
|
+
Kernel function name.
|
56
|
+
.TP
|
57
|
+
COUNT
|
58
|
+
Number of times this function was called during the tracing interval.
|
59
|
+
.SH OVERHEAD
|
60
|
+
This uses the ftrace profiling framework, which does in-kernel counts,
|
61
|
+
lowering the overhead (compared to tracing each event).
|
62
|
+
.SH SOURCE
|
63
|
+
This is from the perf-tools collection:
|
64
|
+
.IP
|
65
|
+
https://github.com/brendangregg/perf-tools
|
66
|
+
.PP
|
67
|
+
Also look under the examples directory for a text file containing example
|
68
|
+
usage, output, and commentary for this tool.
|
69
|
+
.SH OS
|
70
|
+
Linux
|
71
|
+
.SH STABILITY
|
72
|
+
Unstable - in development.
|
73
|
+
.SH AUTHOR
|
74
|
+
Brendan Gregg
|
75
|
+
.SH SEE ALSO
|
76
|
+
functrace(8)
|