当被问到”系统为什么慢”,在 60 秒内依次运行:
# 1. 负载概览
uptime # 1/5/15 分钟负载
# 2. 内核错误
dmesg | tail -20 # OOM、硬件错误
# 3. 系统统计
vmstat 1 3 # CPU、内存、IO、上下文切换
# 4. CPU 明细
mpstat -P ALL 1 3 # 每核心使用率
# 5. 进程 CPU
pidstat 1 3 # 每进程 CPU、IO、上下文切换
# 6. 磁盘 IO
iostat -x 1 3 # 每设备 IO
# 7. 内存
free -h # 内存和 Swap
# 8. 网络
sar -n DEV 1 3 # 各接口流量
# 9. TCP 连接
ss -s # 连接概要
┌──────────────────────────────────────────────┐
│ 应用层 │
│ strace / bpftrace / perf record │
│──────────────────────────────────────────────│
│ 系统层 │
│ top / htop / vmstat / pidstat │
│ mpstat / sar / uptime │
│──────────────────────────────────────────────│
│ CPU │
│ mpstat / perf / bpftrace │
│──────────────────────────────────────────────│
│ 内存 │
│ free / vmstat / pmap / smem │
│ /proc/meminfo / slabtop │
│──────────────────────────────────────────────│
│ 磁盘 IO │
│ iostat / iotop / pidstat -d │
│ fio / blktrace │
│──────────────────────────────────────────────│
│ 网络 │
│ ss / sar -n / iftop / tcpdump │
│ ping / mtr / iperf3 │
│──────────────────────────────────────────────│
│ 内核 │
│ perf / eBPF(bpftrace) / ftrace │
└──────────────────────────────────────────────┘
| 你想知道 | 用什么 |
|---|---|
| 为什么 CPU 飙高 | perf top, pidstat 1 |
| 什么在吃内存 | smem -p, pmap -x PID |
| 磁盘为什么慢 | iostat -x 1, iotop |
| 网络连接状况 | ss -s, ss -ti, iftop |
| 系统调用开销 | strace -c -p PID |
| 内核函数耗时 | perf record -g, bpftrace |
| 历史趋势 | sar 系列命令 |
| 文件系统缓存效率 | free -h, /proc/meminfo |
| 进程到底在等什么 | cat /proc/PID/wchan, pidstat -w |
# 统计系统调用
bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'
# 统计读文件大小分布
bpftrace -e 'tracepoint:syscalls:sys_enter_read \
{ @bytes = hist(args->count); }'
# 进程运行队列延迟
bpftrace -e 'kprobe:finish_task_switch \
{ @runq_lat = hist((nsecs - @start[args->prev->pid]) / 1000); }'