bpf

# 查看内核版本
# 一定要和最后install的版本一致
$ uname -r
4.18.0-348.7.1.el8_5.x86_64
# 搜索包并显示版本
$ yum search kernel-devel --showduplicates
# 这个版本最匹配
kernel-devel-4.18.0-348.7.1.el8_5.x86_64
# 使用包含版本的完整包名安装
$ yum install kernel-devel-4.18.0-348.7.1.el8_5.x86_64
# header和devel版本一致
$ yum install kernel-headers-4.18.0-348.7.1.el8_5.x86_64

$ yum install -y bcc-tools

# 加入环境目录,在~/.bashrc加入:
$ export PATH=$PATH:/usr/share/bcc/tools/
# 安装好后尝试执行下
$ execsnoop

BPF 实际起作用的一些代码,内核提供的接口。

BCC bpftrace BPF前端

BCC工具60秒快速检查

快速查看负载情况 1min 5min 15min

$ uptime
 10:45:40 up 205 days, 54 min,  1 user,  load average: 0.18, 0.16, 0.20

如果1min的负载高于5min或者15min,说明当前正是高负载。

如果1min的负载低于5min或者15min,说明错过了高负载的现场,后续查看的数据都是非高负载情况的数据。

查看当前机器的错误信息

$ dmesg -T | tail -n 10

T 打印可读的时间戳

查看总体内存占用, 总体CPU使用占比

查看核心数量

$ cat /proc/cpuinfo | grep "cpu cores" | uniq 获取物理核心数量
$ cat /proc/cpuinfo | grep "processor" 获取逻辑核心数量

vmstat

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 253240 141064 1181400    0    0    79   101    0    0  2  2 96  0  0
 0  0      0 252216 141064 1181404    0    0     0     0  881 1401  1  2 98  0  0
 0  0      0 254328 141064 1181404    0    0     0     0  916 1397  1  1 98  0  0
 0  0      0 254436 141064 1181416    0    0     0   152 1480 1894  3  8 88  1  0
 0  1      0 254504 141064 1181412    0    0     8   488 1180 1743  2  2 96  1  0
 0  0      0 254568 141064 1181412    0    0     0   128 1059 1667  2  1 97  1  0
 0  0      0 254692 141064 1181412    0    0     0     0 1056 1723  1  1 98  0  0

第一行数据由于工具的启动 不准确

  • r 等待时间片的进程数量(等待IO时是睡眠状态,不需要等待时间片,所以这里不含阻塞在IO的进程) 大于CPU核心数量说明饱和。
  • free 单位KB 数字很大到不容易换算到GB说明内存充足 具体看free -m
  • si so 换入换出的数量, 非0时说明内存不足
  • us sy id wa st 用户 系统 空闲 等待IO 偷取时间 IO处理需要系统时间, 系统占比高可能指向系统IO效率低

分核心查看CPU占比 (yum install sysstat)

$ mpstat -P ALL 1
02:04:24 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
02:04:25 PM  all    0.99    0.00    0.50    0.00    0.00    0.50    0.00    0.00    0.00   98.02
02:04:25 PM    0    0.98    0.00    0.98    0.00    0.00    0.98    0.00    0.00    0.00   97.06
02:04:25 PM    1    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    4.64    0.00    1.31    0.28    0.53    0.17    0.00    0.00    0.00   93.07
Average:       0    3.13    0.00    1.51    0.17    0.56    0.17    0.00    0.00    0.00   94.46
Average:       1    6.14    0.00    1.12    0.39    0.50    0.17    0.00    0.00    0.00   91.68

单个核心占用高, 指向单线程的问题

分进程查看CPU占比

$ pidstat 1
02:06:42 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
02:06:43 PM     0     50128    1.00    0.00    0.00    0.00    1.00     1  qbittorrent-nox
02:06:43 PM     0   1583327    0.00    1.00    0.00    0.00    1.00     1  YDService
02:06:43 PM     0   1641467    0.00    1.00    0.00    0.00    1.00     0  barad_agent
02:06:43 PM     0   3314936    0.00    1.00    0.00    0.00    1.00     1  pidstat

Average:      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:        0        42    0.00    0.12    0.00    0.00    0.12     -  kworker/0:1H-kblockd
Average:        0       623    0.00    0.12    0.00    0.00    0.12     -  systemd-journal
Average:        0       948    0.38    0.12    0.00    0.12    0.50     -  tuned
Average:        0     50128    0.62    0.12    0.00    0.00    0.75     -  qbittorrent-nox
Average:        0   1583327    0.38    0.38    0.00    0.00    0.75     -  YDService
Average:        0   1641467    0.38    0.38    0.00    0.00    0.75     -  barad_agent
Average:        0   3202896    0.12    0.00    0.00    0.00    0.12     -  node
Average:        0   3313606    0.00    0.12    0.00    0.12    0.12     -  kworker/1:0-events
Average:        0   3314936    0.12    0.38    0.00    0.00    0.50     -  pidstat

相比top, pidstat会将解锁保存到shell的缓冲区 方便观察变化趋势

查看磁盘占用

$ iostat -xz 1

%util 磁盘使用率
avgqu-sz 提交的任务数量, 超过1可能代表有问题

异步IO可能导致性能问题, 因为发起后操作系统不会拒绝, 且一个线程因为不被阻塞可以批量发起.

查看内存占用

$ free -mh
              total        used        free      shared  buff/cache   available
Mem:          7.3Gi       5.8Gi       332Mi       3.0Mi       1.1Gi       1.2Gi
Swap:            0B          0B          0B

网卡占用

$ sar -n DEV 1
02:21:23 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
02:21:24 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:21:24 PM      eth0     56.00     50.00     17.92     12.95      0.00      0.00      0.00      0.00
02:21:24 PM cni-podman0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
Average:           lo      8.43      8.43      0.75      0.75      0.00      0.00      0.00      0.00
Average:         eth0     46.50     43.90      7.77     10.48      0.00      0.00      0.00      0.00
Average:    cni-podman0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

rxkB/s txkB/s 收发速率

网络连接建立和重传

$ sar -n TCP,ETCP 1
02:25:04 PM  active/s passive/s    iseg/s    oseg/s
02:25:05 PM      0.00      1.00      5.00      5.00

02:25:04 PM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
02:25:05 PM      0.00      0.00      0.00      0.00      0.00

Average:     active/s passive/s    iseg/s    oseg/s
Average:         0.50      0.75     10.50      9.75

Average:     atmptf/s  estres/s retrans/s isegerr/s   orsts/s
Average:         0.00      0.00      0.00      0.00      0.25
  • active/s TCP连接connect速度
  • passive/s TCP连接accept速度
  • retrans/s 重传数量

top

提供的数据很多, 但是一直再刷新, 导致很难看到变化相关.

Ctrl-S pause Ctrl-Q continue

追踪系统调用

#  追踪write系统调用 且筛选打开了文件描述符2的进程 
strace -fe write `lsof -t "/proc/$$/fd/2" |sed 's/^/-p/'` -o write2.log

# rdi是系统调用第一个参数 其次为rsi rdx r10 r8 r9
b write if $rdi == 2

# 8个字节 x 16进制 b以bytes为单位打印 
x /8xb ptr