bcc工具之syscount
在排查linux性能问题的时候我们有时候会发现 整体 CPU使用率 很高,但是绝大多是是在
sys 上的,usr上的CPU时间很少,这种就需要看看是内核空间在干什么了,
是系统在 系统调用太耗时还是其他原因倒是的sys使用率上升。
如果查看 系统调用时间 和 系统调用次数呢?bcc为 我们提供了这个工具 syscount
sh@ubuntu:/usr/sbin$ sudo syscount-bpfcc
Tracing syscalls, printing top 10... Ctrl+C to quit.
^C[19:42:44]
SYSCALL COUNT
futex 397
times 315
poll 92
read 84
recvmsg 78
nanosleep 39
openat 33
close 33
fstat 33
epoll_pwait 32
Detaching...
如何查看 系统调用耗时呢,如果怀疑某个进程导致的,直接 strace -cp [pid]
sh@ubuntu:/usr/sbin$ sudo strace -cp 19014
strace: Process 19014 attached
^Cstrace: Process 19014 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
33.81 0.000423 23 18 epoll_pwait
15.03 0.000188 17 11 openat
13.11 0.000164 13 12 read
9.43 0.000118 10 11 close
9.43 0.000118 10 11 ioctl
9.27 0.000116 10 11 fstat
3.84 0.000048 16 3 kill
2.80 0.000035 11 3 write
2.24 0.000028 14 2 futex
1.04 0.000013 13 1 epoll_ctl
------ ----------- ----------- --------- --------- ----------------
100.00 0.001251 83 total
选择 怀疑的系统调用之后可以 进一步跟踪
strace -T -e read -p
-T 可以显示出具体时间
-e 显示具体跟踪那个event
sh@ubuntu:/usr/sbin$ sudo strace -T -e read -p 19014
strace: Process 19014 attached
read(32, "/bin/bash\0", 1024) = 10 <0.000111>
read(32, "/bin/bash\0", 1024) = 10 <0.000099>
read(32, "/bin/bash\0", 1024) = 10 <0.000210>
read(32, "/bin/bash\0", 1024) = 10 <0.000124>
read(32, "/bin/bash\0", 1024) = 10 <0.000192>
read(32, "/bin/bash\0", 1024) = 10 <0.000097>
read(32, "/bin/bash\0", 1024) = 10 <0.000097>
read(32, "/bin/bash\0", 1024) = 10 <0.000108>
read(32, "/bin/bash\0", 1024) = 10 <0.000079>
read(32, "/bin/bash\0", 1024) = 10 <0.000086>
也可以使用 这个 工具 来观察
有时候 strace 看不出来啥,因为不是每个 C库的调用都会进行系统调用,
比如 fread 这种,C库都是帮我们做了缓存的。
这就需要使用 ltrace 来进行跟踪了
LTRACE(1) User Commands LTRACE(1)
NAME
ltrace - A library call tracer