1. 磁盘I/O
1.1.1. ./disk/bitesize
使用perf命令跟踪 block:block_rq_issue 统计一段时间内(直到Ctrl+C终止)磁盘I/O操作的数据块大小的分布情况。
./bitesize
Kbytes : I/O Distribution
-> 0.9 : 4 |######################################|
1.0 -> 7.9 : 4 |######################################|
8.0 -> 63.9 : 3 |############################# |
64.0 -> 127.9 : 0 |
1.1.2. iosnoop
使用ftrace 跟踪当前进行磁盘I/O操作的进程,同时显示每次I/O的延迟。
./iosnoop
COMM PID TYPE DEV BLOCK BYTES LATms
jbd2/sda3-47 4773 WS 8,0 46099672 24576 5.57
ksoftirqd/5 83 WS 8,0 46099720 4096 5.90
1.1.3. iolatency
使用ftrace 动态显示一段时间内(默认3秒),I/O延迟(ms)的分布统计。
/iolatency
>=(ms) .. <(ms) : I/O |Distribution
4 -> 8 : 0 | |
8 -> 16 : 1 |####### |
16 -> 32 : 2 |############# |
32 -> 64 : 6 |######################################|
64 -> 128 : 5 |################################ |
^C
1.1.4. cachestat
统计间隔时间内buff/cacche的命中率 如果没有命中就会产生磁盘IO
./cachestat
HITS MISSES DIRTIES RATIO BUFFERS_MB CACHE_MB
754 0 0 100.0% 580 3162
2. 系统调用
2.1.1. syscount
使用perf 统计系统进程被调用的次数
./syscount
sshd 12
sap1002 2813
ps 3032
2.1.2. execsnoop
监控exec()系统调用,输出进程PID和命令以及参数。 fork()->exec()
./execsnoop
PID PPID ARGS
11711 11707 gawk -v o=1 -v opt_name=0 -v name= -v opt_duration=0 [...]
2.1.3. opensnoop
监控open()系统调用,输出进程PID和正在打开的文件,如果文件打开失败FD显示-1或error
./opensnoop
COMM PID FD FILE
opensnoop 11933 0x4
opensnoop 11938 0x4 /proc/11938/stat
opensnoop 11938 0x4 /proc/11936/cmdlin
2.1.4. killsnoop
监控kill()系统调用,输出进程名称和signal信号
./killsnoop
COMM PID TPID SIGNAL RETURN
bash 30193 30193 2 0
3. 内核调用
3.1.1. kprobe
跟踪某一个内核函数调用,以及显示调用它的系统进程
./kprobe p:do_sys_open
kprobe-10642 [013] d... 52995681.250594: do_sys_open: (do_sys_open+0x0/0x1c0)
3.1.2. tpoint
跟踪某一个内核调用,以及显示调用它的系统进程
./tpoint -l
block:block_bio_backmerge
block:block_bio_bounce
block:block_bio_complete
./tpoint timer:timer_start
kworker/4:0-23690 [004] d... 52995533.193218: timer_start: timer=ffff88103fc0f9a8 function=delayed_work_timer_fn expires=17543326029 [timeout=3]
3.1.3. perl-stat-hist
统计内核调用参数值大小的分布
./perf-stat-hist syscalls:sys_enter_read count 5
Range : Count Distribution
-> -1 : 0 | |
0 -> 0 : 0 | |
1 -> 3 : 0 | |
4 -> 15 : 0 | |
16 -> 63 : 71 |##### |
64 -> 255 : 2 |# |
256 -> 1023 : 35 |###
4. 内核函数
4.1.1. functrace
跟踪指定的内核函数调用,可用正则匹配
./functrace 'tcp*'
sshd-5750 [002] .... 52994327.229384: tcp_md5_do_lookup <-tcp_v4_md5_lookup
4.1.2. funccount
正则匹配统计内核函数调用次数 类似syscount统计进程调用次数
./funccount -t 1 '*'
idle_cpu 796980
4.1.3. funcslower
统计内核函数调用时间超过指定阀值的调用
./funcslower -a vfs_read 10000
# TIME CPU TASK/PID DURATION FUNCTION CALLS
52994644.045459 | 6) wc-6777 | ! 17657.34 us | } /* vfs_read */
4.1.4. funcgraph
跟踪一个内核函数调用,显示他调用的所有子函数
./funcgraph vfs_read
3) | vfs_read() {
3) 0.097 us | rw_verify_area();
3) | tty_read() {
3) 0.080 us | tty_paranoia_check();
3) | tty_ldisc_ref_wait() {
3) | tty_ldisc_try() {
3) 0.084 us | _raw_spin_lock_irqsave();
3) 0.080 us | _raw_spin_unlock_irqrestore();
5. 其他
5.1.1. tool/reset-ftrace
由于使用ftrace的工具没有正常退出(例如被kill -9杀死),导致ftrace的lock文件没有正常删除和一些配置没能重置。下次使用ftrace时就会出错,这时就是需要tool/reset-ftrace来删除lock文件和重置ftrace配置。
5.1.2. ./user/uprobe
需要内核版本大于3.13才能使用
5.1.3. tcpretrans
监控网络TCP转发状态