那些神乎其神的eBPF bcc小工具
2022-12-10 10:10:28 Author: 奶牛安全(查看原文) 阅读量:14 收藏

在前面已经有过两篇文章,一篇是一分钟内快速分析Linux系统性能问题,一篇是在国内使用ubuntu安装eBPF工具包bcc的指南

在第一篇时,提到这些命令:

  1. uptime
  2. dmesg|tail
  3. vmstat 1
  4. mpstat -P ALL 1
  5. pidstat 1
  6. iostat -xz 1
  7. free -m
  8. sar -n DEV 1
  9. sar -n TCP,ETCP 1
  10. top

但上面这些命令都有一个缺点,它们都不能够实时监控到系统问题。而eBPF工具链bcc却有很多小工具可以实时监控到系统问题。

而在第二篇文章就介绍了怎么安装bcc工具,安装完就可以使用这些工具来定位系统问题。它们的安装位置一般在/usr/share/bcc/tools

execsnoop

# ./execsnoop
PCOMM            PID    RET ARGS
supervise        9660     0 ./run
supervise        9661     0 ./run
mkdir            9662     0 /bin/mkdir -p ./main
run              9663     0 ./run
[...]

这个工具可以实时采集到系统启动了哪些进程(PID),进程名称,进程启动是否成功,它的参数是什么。它是跟踪了系统调用execve这一族。不过它并没有跟踪fork/clone/vfork之类的系统调用,所以对于这种情况启动的子进程是没办法监控到。

opensnoop

# ./opensnoop
PID    COMM               FD ERR PATH
1565   redis-server        5   0 /proc/1565/stat
1565   redis-server        5   0 /proc/1565/stat
1565   redis-server        5   0 /proc/1565/stat
1603   snmpd               9   0 /proc/net/dev
1603   snmpd              11   0 /proc/net/if_inet6
1603   snmpd              -1   2 /sys/class/net/eth0/device/vendor
1603   snmpd              11   0 /proc/sys/net/ipv4/neigh/eth0/retrans_time_ms
1603   snmpd              11   0 /proc/sys/net/ipv6/neigh/eth0/retrans_time_ms
1603   snmpd              11   0 /proc/sys/net/ipv6/conf/eth0/forwarding
[...]

这个工具可以解决“谁动了我的文件”的问题,它显示出哪个进程,进程名称,打开了哪些文件,文件句柄是多少,打开是否成功。如1603 snmpd -1 2 /sys/class/net/eth0/device/vendor,就是没有打开成功的,返回值是2,说明文件或目录不存在。

这个工具是跟踪了open系统调用。

ext4slower

# ./ext4slower
Tracing ext4 operations slower than 10 ms
TIME     COMM           PID    T BYTES   OFF_KB   LAT(ms) FILENAME
06:35:01 cron           16464  R 1249    0          16.05 common-auth
06:35:01 cron           16463  R 1249    0          16.04 common-auth
06:35:01 cron           16465  R 1249    0          16.03 common-auth
06:35:01 cron           16465  R 4096    0          10.62 login.defs
06:35:01 cron           16464  R 4096    0          10.61 login.defs

这个工具实时跟踪了ext4文件系统的性能,只有性能劣化超过一个阈值,才会显示在这里。它会显示在什么时间,哪个进程,进程ID是多少,引用了哪个文件,数据有多少,延迟了有多少。

从上面结果,能够准确定位出是哪些进程导致的文件系统性能劣化的。

biolatency

# ./biolatency
Tracing block device I/O... Hit Ctrl-C to end.
^C
     usecs           : count     distribution
       0 -> 1        : 0        |                                      |
       2 -> 3        : 0        |                                      |
       4 -> 7        : 0        |                                      |
       8 -> 15       : 0        |                                      |
      16 -> 31       : 0        |                                      |
      32 -> 63       : 0        |                                      |
      64 -> 127      : 1        |                                      |
     128 -> 255      : 12       |********                              |
     256 -> 511      : 15       |**********                            |
     512 -> 1023     : 43       |*******************************       |
    1024 -> 2047     : 52       |**************************************|
    2048 -> 4095     : 47       |**********************************    |
    4096 -> 8191     : 52       |**************************************|
    8192 -> 16383    : 36       |**************************            |
   16384 -> 32767    : 15       |**********                            |
   32768 -> 65535    : 2        |*                                     |
   65536 -> 131071   : 2        |*                                     |

它对标iostat,但它的信息比iostat更准确,可以看出磁盘性能劣化程度是怎样。

biosnoop

# ./biosnoop
TIME(s)        COMM           PID    DISK    T  SECTOR    BYTES   LAT(ms)
0.000004001    supervise      1950   xvda1   W  13092560  4096       0.74
0.000178002    supervise      1950   xvda1   W  13092432  4096       0.61
0.001469001    supervise      1956   xvda1   W  13092440  4096       1.24
0.001588002    supervise      1956   xvda1   W  13115128  4096       1.09
1.022346001    supervise      1950   xvda1   W  13115272  4096       0.98
1.022568002    supervise      1950   xvda1   W  13188496  4096       0.93
[...]

它也对标iostat,和biolatency的总览对比,它更准确,它能够展示出什么时候,哪个进程,进程ID是多少,对于某个磁盘进行什么操作(读或写),哪个区块,数据量多少和延迟。

这样可以有效定位出是哪个进程造成的磁盘性能劣化,如果大量数据统计,也可以知道哪些磁盘处于老化,在什么操作下劣化严重。

cachestat

# ./cachestat
    HITS   MISSES  DIRTIES  READ_HIT% WRITE_HIT%   BUFFERS_MB  CACHED_MB
    1074       44       13      94.9%       2.9%            1        223
    2195      170        8      92.5%       6.8%            1        143
     182       53       56      53.6%       1.3%            1        143
   62480    40960    20480      40.6%      19.8%            1        223
       7        2        5      22.2%      22.2%            1        223
     348        0        0     100.0%       0.0%            1        223
[...]

cachestat每秒打印一次文件系统缓存的统计信息,用来识别缓存低命中率,作为系统调优依据。

tcpconnect

# ./tcpconnect
PID    COMM         IP SADDR            DADDR            DPORT
1479   telnet       4  127.0.0.1        127.0.0.1        23
1469   curl         4  10.201.219.236   54.245.105.25    80
1469   curl         4  10.201.219.236   54.67.101.145    80
1991   telnet       6  ::1              ::1              23
2015   ssh          6  fe80::2000:bff:fe82:3ac fe80::2000:bff:fe82:3ac 22
[...]

这个工具的功能和netstat比较类似,显示出向外连接的,用于监查应用程序不当配置或入侵的横向移动

tcpretrans

# ./tcpretrans
TIME     PID    IP LADDR:LPORT          T> RADDR:RPORT          STATE
01:55:05 0      4  10.153.223.157:22    R> 69.53.245.40:34619   ESTABLISHED
01:55:05 0      4  10.153.223.157:22    R> 69.53.245.40:34619   ESTABLISHED
01:55:17 0      4  10.153.223.157:22    R> 69.53.245.40:22957   ESTABLISHED
[...]

这个工具可以显示出TCP重传的行为,它可以定位到发起进程,本地和远程地址,可以用来定位是往哪个地址过去的网络劣化或系统负载过高,出现丢包行为

runqlat

# ./runqlat
Tracing run queue latency... Hit Ctrl-C to end.
^C
     usecs               : count     distribution
         0 -> 1          : 233      |***********                             |
         2 -> 3          : 742      |************************************    |
         4 -> 7          : 203      |**********                              |
         8 -> 15         : 173      |********                                |
        16 -> 31         : 24       |*                                       |
        32 -> 63         : 0        |                                        |
        64 -> 127        : 30       |*                                       |
       128 -> 255        : 6        |                                        |
       256 -> 511        : 3        |                                        |
       512 -> 1023       : 5        |                                        |
      1024 -> 2047       : 27       |*                                       |
      2048 -> 4095       : 30       |*                                       |
      4096 -> 8191       : 20       |                                        |
      8192 -> 16383      : 29       |*                                       |
     16384 -> 32767      : 809      |****************************************|
     32768 -> 65535      : 64       |***                                     |

这个工具显示线程等待到cpu运行的时间,可识别系统线程过多,处于频繁的上下文切换状态。

profile

# ./profile
Sampling at 49 Hertz of all threads by user + kernel stack... Hit Ctrl-C to end.
^C
    00007f31d76c3251 [unknown]
    47a2c1e752bf47f7 [unknown]
    -                sign-file (8877)
        1

    ffffffff813d0af8 __clear_user
    ffffffff813d5277 iov_iter_zero
    ffffffff814ec5f2 read_iter_zero
    ffffffff8120be9d __vfs_read
    ffffffff8120c385 vfs_read
    ffffffff8120d786 sys_read
    ffffffff817cc076 entry_SYSCALL_64_fastpath
    00007fc5652ad9b0 read
    -                dd (25036)
        4

    0000000000400542 func_a
    0000000000400598 main
    00007f12a133e830 __libc_start_main
    083e258d4c544155 [unknown]
    -                func_ab (13549)
        5

[...]

    ffffffff8105eb66 native_safe_halt
    ffffffff8103659e default_idle
    ffffffff81036d1f arch_cpu_idle
    ffffffff810bba5a default_idle_call
    ffffffff810bbd07 cpu_startup_entry
    ffffffff8104df55 start_secondary
    -                swapper/1 (0)
        75

用来对整个系统或单个进程进行栈回溯统计,从而得知是哪些函数消耗最多系统资源

暗号:203c5


文章来源: http://mp.weixin.qq.com/s?__biz=MzU4NjY0NTExNA==&mid=2247487742&idx=1&sn=04eec09b976ca8084e3a3cdb084c8490&chksm=fdf97bebca8ef2fd807cfd6751be633243bf941246f444b53309d737b27883af6ef5202f46aa#rd
如有侵权请联系:admin#unsafe.sh