Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

A.2 工具箱:命令、调试器与观测工具

1. 怎么用这一页

这不是命令大全,而是按任务组织的索引。每个工具只回答三个问题:什么时候用、看哪一列、常见误读是什么。需要完整参数时查 man。

安装基线(Ubuntu 24.04):

sudo apt -y install build-essential gdb strace ltrace lsof \
  iproute2 iputils-ping tcpdump socat netcat-openbsd curl \
  linux-tools-common linux-tools-$(uname -r) bpftrace bpftool \
  sysstat iotop fio htop tree ncdu jq \
  shellcheck shellcheck-doc

2. 文件与文本

任务命令看什么 / 注意
文件类型file f不要用扩展名判断
元数据stat f三个时间:atime/mtime/ctime
权限/ACLgetfacl fmask 会影响有效权限
找文件find / -xdev -name '*.log'-xdev 不跨文件系统
按时间find . -mtime -1 -type f-mtime 以 24h 为单位
按大小find . -size +100M+ 是大于,- 是小于
安全处理文件名find . -print0 | xargs -0空格/换行文件名
目录大小du -sh -- *-- 防止 - 开头文件名
磁盘占用ncdu /var交互式,比 du 快
打开的文件lsof -p PID(deleted) 表示空间未释放
谁占了挂载点fuser -vm /mnt卸载失败时用
文件内容less +F f类似 tail -f,可翻页
二进制差异cmp -l a b看第一个不同字节
十六进制xxd -g1 f / hexdump -C f协议/文件格式分析
文本统计wc -l/-c/-w注意最后一行无换行

3. 进程与 CPU

任务命令看什么
快照ps -eo pid,ppid,stat,pcpu,pmem,etime,comm --sort=-pcpuSTAT 的 D/R/S/Z/T
线程ps -eLf / top -H -p PID线程 ID 与 CPU
实时top / htop%sy(内核)、%wa(I/O)、%si(软中断)
每核mpstat -P ALL 1是否单核打满
历史sar -u 1 5需要 sysstat 采集
调度延迟perf sched latency谁被延迟、延迟多久
上下文切换pidstat -w -p PID 1cswch/s(自愿)vs nvcswch/s(非自愿)
优先级chrt -p PID / nice -n实时任务会饿死普通任务
进程树pstree -ap谁 fork 了谁
打开文件ls -l /proc/PID/fdfd 泄漏
内存映射cat /proc/PID/maps共享库、堆、栈、匿名映射
环境tr '\0' '\n' < /proc/PID/environ排查注入/配置
栈cat /proc/PID/stack(root)内核栈,D 状态排查

top 里最容易被误读的列:

  • %wa 高不一定是磁盘慢,也可能是 NFS/网络文件系统等待;
  • %si 高看软中断(网络收包),不是用户态;
  • RES 包含共享库的物理页,SHR 才是共享部分;
  • VIRT 很大不代表内存泄漏(虚拟地址不等于物理页)。

4. 内存

任务命令看什么
总览free -havailable 才是可用,不是 free
明细cat /proc/meminfoCached、Buffers、SReclaimable、Dirty
进程smem -tk / ps_memPSS 比 RSS 更接近真实占用
泄漏valgrind --leak-check=fullstill reachable vs definitely lost
堆gdb + malloc_stats()arena 数量、peak
缺页perf stat -e page-faultsminor/major
交换vmstat 1 的 si/so持续非零说明内存压力
OOMdmesg -T | grep -i oom被杀进程与 oom_score
slabslabtop / /proc/slabinfo内核对象泄漏
NUMAnumastat -p PID跨节点访问

5. 磁盘与文件系统

任务命令看什么
空间df -hT / df -iinode 用尽也会 No space left
I/Oiostat -xz 1%util、await、aqu-sz、r_await/w_await
进程 I/Oiotop -oPa谁在读写
延迟biolatency(bcc)I/O 延迟分布
文件系统findmnt -T /path挂载选项、源设备
只读重挂mount -o remount,rw /救援模式常用
坏块badblocks -sv /dev/sdX会破坏数据,先确认
SMARTsmartctl -a /dev/sdX重映射扇区、温度
压测fio --name=t --rw=randread --bs=4k --iodepth=32IOPS/延迟
页缓存vmtouch -v file文件有多少在缓存

iostat 的三个常见误读:

  • %util 接近 100% 只说明设备忙,不说明饱和(NVMe 多队列下可能仍有余量);
  • await 包含排队时间,不纯是设备延迟;
  • svctm 已废弃,不要再看。

6. 网络

任务命令看什么
接口ip -br addrUP/LOWER_UP
路由ip route get 8.8.8.8实际选中的路由与源地址
邻居ip neighREACHABLE/STALE/FAILED
监听ss -lntpRecv-Q 是 accept 队列
连接ss -tnp state established四元组、Send-Q/Recv-Q
统计ss -s总连接、TIME_WAIT
套接字明细ss -tinrtt、cwnd、retrans、rcv_space
抓包tcpdump -i any -nn -s0 -w cap.pcap先抓全,再过滤
过滤tcpdump -r cap.pcap 'tcp port 443'BPF 语法
DNSdig +short example.com / resolvectl queryTTL、CNAME
HTTPcurl -v --trace-time连接/首字节/总时间
带宽iperf3 -c host -P 4多流才能打满
延迟mtr -rwc 100 host每跳丢包
端口nc -vz host 443只测 TCP 握手

ss -tin 的关键字段:

  • retrans:重传次数;持续增长说明丢包/超时;
  • cwnd:拥塞窗口;小且不涨说明受限;
  • rtt:平滑 RTT;与 rttvar 一起看;
  • rcv_space:接收窗口;为 0 说明应用读得慢。

7. 内核与追踪

任务命令说明
内核日志dmesg -T -w-T 人类时间
动态调试echo 'file mm/* +p' > /sys/kernel/debug/dynamic_debug/control需 debugfs
ftracetrace-cmd record -p function_graph -g vfs_read函数调用图
kprobebpftrace -e 'kprobe:vfs_read { @[comm] = count(); }'内核函数
uprobebpftrace -e 'uprobe:/bin/bash:readline { printf("%s\n", str(arg0)); }'用户函数
tracepointperf list tracepoint稳定事件
系统调用strace -f -tt -T -e trace=%file-T 每调用耗时
库调用ltrace -f -S只对动态库有效
采样perf record -F 999 -g -- PIDperf report
火焰图perf script | flamegraph.pl > out.svg需要 FlameGraph
锁perf lock / lockdep争用与死锁
中断cat /proc/interrupts每 CPU 计数
软中断cat /proc/softirqsNET_RX 等
网络丢包cat /proc/net/softnet_stat第二列是 drop

8. 容器与命名空间

任务命令说明
进程命名空间ls -l /proc/PID/ns看 inode 是否相同
进入nsenter -t PID -m -u -i -n -p调试容器
资源systemd-cgtop / cat /sys/fs/cgroup/.../cpu.statcgroup v2
容器docker stats --no-streamCPU/内存/网络
镜像层docker history IMG每层大小
运行时ctr -n k8s.io containers lscontainerd
抓容器包nsenter -t PID -n tcpdump ...在 netns 里抓

9. 构建与二进制

任务命令说明
依赖ldd ./app不要对不可信二进制用 ldd(会执行)
符号nm -C ./appU 未定义,T 文本段
段readelf -S ./app.text/.data/.bss/.rodata
反汇编objdump -d -M intel ./app对照源码
调试信息readelf --debug-dump=info是否带 -g
动态段readelf -d ./appRPATH/RUNPATH/NEEDED
预加载LD_PRELOAD=./hook.so ./app打桩/注入
系统调用号ausyscall --dump需要 audit
编译警告-Wall -Wextra -Wpedantic -Wconversion交付前打开

10. 安全

任务命令说明
能力getcap -r / 2>/dev/nullsetcap 的程序
seccompgrep Seccomp /proc/PID/status0/1/2
提权面find / -perm -4000 -type fsetuid 清单
审计auditctl -w /etc/passwd -p wa需 auditd
完整性sha256sum -c SHA256SUMS下载校验
端口暴露ss -lntu只听 127.0.0.1 更安全

11. 组合用法

11.1 找出「谁在写这个目录」

sudo bpftrace -e '
tracepoint:syscalls:sys_enter_openat /str(args->filename) == "/var/log/app.log"/
{ printf("%s pid=%d\n", comm, pid); }'

11.2 找出「哪个进程让磁盘忙」

sudo iotop -oPa -d 1
# 或
sudo bpftrace -e 'kprobe:submit_bio { @[comm] = count(); }'

11.3 找出「哪个连接在重传」

ss -tin state established '( dport = :443 )' | grep -B1 retrans

11.4 找出「谁把 CPU 吃满」

top -H -b -n1 | head -20
perf top -g -p $(pgrep -n app)

12. 工具选择的三个原则

  1. 先用低开销的:ss//proc/iostat 先看,再上 perf/bpftrace;
  2. 一次只改一个变量:同时调三个参数,出了效果也不知道谁起作用;
  3. 留下证据:命令、输出、时间、版本;不要只截图,存文本。

下一站:A.3 排错手册把工具串成「症状 → 假设 → 证据」的流程。