Fork me on GitHub

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

posted @ 2022-05-01 16:26  yooooooo  阅读(193)  评论(0编辑  收藏  举报