1. 引言:为什么需要掌握Linux调试命令
在服务器运维和开发工作中,我们90%的时间都在与各种问题打交道。记得刚入行时,面对一台突然CPU飙高的生产服务器,我手忙脚乱地翻文档查命令,那种无力感至今难忘。后来才发现,Linux系统自带的调试工具就像瑞士军刀,用好了能快速定位90%的常见问题。
不同于图形界面工具,命令行调试的优势在于:
- 轻量级:不依赖GUI环境,通过SSH就能完成所有操作
- 组合性强:可以通过管道将多个工具串联使用
- 信息密度高:一个命令就能获取系统状态的完整快照
本文将分享我这些年积累的20+个最实用的调试命令,从系统监控到进程分析,从网络排查到性能调优,覆盖日常工作的主要场景。每个命令都配有真实案例和使用技巧,建议收藏备用。
2. 系统资源监控三板斧
2.1 top - 实时系统监控仪表盘
作为最基础的系统监控工具,top命令相当于汽车的仪表盘,能实时显示:
code复制top - 15:30:45 up 32 days, 2:15, 3 users, load average: 0.52, 0.58, 0.61
Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.3 us, 1.2 sy, 0.0 ni, 93.2 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15876.2 total, 1023.4 free, 7845.3 used, 7007.5 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 6789.5 avail Mem
实用技巧:
- 按
1展开多核CPU详情 - 按
M按内存排序,P按CPU排序 shift + h显示线程视图(排查Java应用特别有用)-p PID只监控特定进程
注意:wa(IO等待)值长期高于5%说明磁盘可能成为瓶颈
2.2 vmstat - 系统健康检查仪
vmstat以固定间隔采样系统状态,适合观察趋势:
bash复制$ vmstat 1 5 # 每秒1次,共5次
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 501234 123456 789012 0 0 12 34 567 1234 10 2 88 0 0
关键指标解读:
- r:运行队列长度(超过CPU核数说明饱和)
- si/so:交换分区使用情况(非零值需警惕)
- cs:上下文切换次数(过高说明进程频繁切换)
2.3 dmesg - 系统异常雷达
内核日志是排查硬件和驱动问题的金矿:
bash复制$ dmesg -T | tail -20 # 显示带时间戳的最后20条
[Sun Aug 15 15:30:45 2023] Out of memory: Kill process 12345 (java) score 789
典型场景:
- OOM Killer记录
- 磁盘I/O错误
- 网络设备异常
技巧:
dmesg -w实时监控新日志(类似tail -f)
3. 进程调试深度攻略
3.1 ps - 进程侦查显微镜
基础用法:
bash复制$ ps aux | grep nginx # 经典组合
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1234 0.0 0.1 12345 6789 ? S Aug14 0:00 nginx: master
高级技巧:
- 查看线程:
bash复制
ps -eLf | grep java - 显示进程树:
bash复制
ps -ef --forest - 自定义输出列:
bash复制ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
3.2 strace - 系统调用追踪器
追踪进程的系统调用:
bash复制$ strace -ff -o debug.log ./myprogram
实战案例:
- 定位文件找不到错误:
bash复制strace -e openat ls 2>&1 | grep ENOENT - 统计系统调用耗时:
bash复制
strace -c -p 12345
注意:生产环境慎用,性能开销较大
3.3 lsof - 文件与网络连接探测器
查看进程打开的文件:
bash复制$ lsof -p 12345
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 root cwd DIR 253,1 4096 2 /
nginx 1234 root txt REG 253,1 1234567 123456 /usr/sbin/nginx
实用场景:
- 查找删除后仍占用的文件:
bash复制
lsof | grep deleted - 查看端口占用:
bash复制
lsof -i :8080 - 列出所有网络连接:
bash复制
lsof -i
4. 网络问题排查大全
4.1 netstat/ss - 网络连接分析仪
现代Linux推荐使用ss:
bash复制$ ss -tulnp # 等效于netstat -tulnp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp ESTAB 0 0 192.168.1.1:1234 203.0.113.1:5678
关键参数:
-tTCP连接-uUDP连接-l监听端口-p显示进程信息-s统计信息
4.2 tcpdump - 网络流量嗅探器
抓取eth0网卡的HTTP流量:
bash复制$ tcpdump -i eth0 -A -s0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
过滤技巧:
- 抓取特定主机:
bash复制
tcpdump host 192.168.1.1 - 抓取ICMP包:
bash复制
tcpdump icmp - 保存到文件:
bash复制
tcpdump -w capture.pcap
4.3 traceroute/mtr - 网络路径追踪器
可视化网络路径:
bash复制$ mtr -n 8.8.8.8
Start: 2023-08-15T16:00:00+0800
HOST: localhost Loss% Snt Last Avg Best Wrst StDev
1.|-- 192.168.1.1 0.0% 10 2.1 2.2 1.9 3.0 0.3
2.|-- 203.0.113.1 0.0% 10 10.1 10.3 9.8 11.2 0.4
诊断用途:
- 定位网络延迟发生在哪一跳
- 识别路由环路问题
- 检测包丢失节点
5. 性能分析高级技巧
5.1 perf - 系统性能剖析器
CPU热点分析:
bash复制$ perf top -p 12345
Samples: 1K of event 'cycles:ppp', 4000 Hz, Event count (approx.): 123456789
Overhead Shared Object Symbol
25.12% libc-2.31.so [.] __GI___libc_malloc
12.34% myprogram [.] mainLoop
常用命令:
- 记录性能数据:
bash复制
perf record -g -p 12345 - 生成火焰图:
bash复制
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg
5.2 iostat - 磁盘I/O监视器
监控磁盘负载:
bash复制$ iostat -x 1
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 5.12 8.34 123.45 456.78 0.12 1.23 12.34 23.45 1.23 2.34 0.12 24.12 54.78 0.78 1.23
关键指标:
- %util:设备利用率(接近100%说明饱和)
- await:平均I/O等待时间(毫秒)
- svctm:平均服务时间
5.3 free - 内存使用分析器
查看真实内存使用:
bash复制$ free -h
total used free shared buff/cache available
Mem: 15Gi 5Gi 1Gi 123Mi 9Gi 9Gi
Swap: 2Gi 0Gi 2Gi
重要概念:
- buff/cache:可回收的缓存内存
- available:实际可用内存(含可回收缓存)
6. 文本处理与日志分析
6.1 grep - 文本搜索瑞士军刀
多条件搜索日志:
bash复制$ grep -E 'ERROR|WARN' /var/log/app.log
高级用法:
- 显示前后上下文:
bash复制grep -A 3 -B 2 "panic" system.log - 统计出现次数:
bash复制grep -c "timeout" access.log - 递归搜索:
bash复制grep -r "connection refused" /var/log/
6.2 awk - 数据提取与报表生成
统计Nginx状态码:
bash复制$ awk '{print $9}' access.log | sort | uniq -c | sort -rn
5000 200
123 404
12 500
实用单行命令:
- 求某一列总和:
bash复制awk '{sum+=$3} END {print sum}' data.txt - 过滤时间范围:
bash复制awk '/15\/Aug\/2023:15:/,/15\/Aug\/2023:16:/' access.log
6.3 jq - JSON处理神器
解析API响应:
bash复制$ curl -s http://api.example.com/data | jq '.items[] | select(.status=="active")'
常用操作:
- 格式化输出:
bash复制jq '.' messy.json - 提取特定字段:
bash复制jq '.user.name' data.json - 数组过滤:
bash复制jq '.[] | select(.age > 30)' users.json
7. 综合调试案例实战
7.1 案例一:服务器响应变慢
现象: Web服务器响应时间从50ms突增到2s+
排查步骤:
- 快速检查系统负载:
bash复制uptime; vmstat 1 5 - 确认是否是CPU瓶颈:
bash复制top -c -p $(pgrep -d',' nginx) - 检查磁盘I/O:
bash复制
iostat -x 1 - 分析进程系统调用:
bash复制
strace -ff -o trace.log -p $(pgrep nginx)
最终发现: 某个新上线的API频繁读写临时文件导致磁盘I/O饱和
7.2 案例二:端口占用冲突
现象: 服务启动报错"Address already in use"
解决方案:
- 查找占用进程:
bash复制
ss -tulnp | grep :8080 - 查看进程详情:
bash复制
ps -fp $(lsof -ti :8080) - 安全终止进程:
bash复制kill -15 $(lsof -ti :8080)
7.3 案例三:内存泄漏诊断
现象: 服务运行几天后内存持续增长最终OOM
排查方法:
- 监控内存变化:
bash复制watch -n 1 'ps -eo pid,cmd,%mem --sort=-%mem | head' - 生成内存快照(Java):
bash复制
jmap -dump:live,format=b,file=heap.hprof $(pgrep java) - 分析内存分配:
bash复制
valgrind --leak-check=full ./myprogram
8. 调试工具箱扩展
8.1 终端多路复用器
使用tmux保持会话:
bash复制$ tmux new -s debug_session
# 断开后重新连接
$ tmux attach -t debug_session
实用功能:
- 水平/垂直分屏
- 会话共享
- 后台运行长任务
8.2 命令行HTTP客户端
调试REST API:
bash复制$ http POST http://api.example.com/login username=admin password=123456
HTTP/1.1 200 OK
{
"token": "abc123"
}
替代curl的优势:
- 自动格式化JSON
- 更直观的语法
- 支持会话保持
8.3 现代替代命令
传统命令的新版本:
| 传统命令 | 现代替代 | 优势 |
|---|---|---|
| netstat | ss | 更快更准确 |
| ifconfig | ip | 功能更强大 |
| top | htop | 交互性更好 |
| dig | dog | 输出更友好 |
9. 调试思维与方法论
9.1 问题定位的二分法
-
确定问题范围:
- 是整个系统还是单个服务?
- 是特定请求还是普遍现象?
-
检查依赖链:
mermaid复制graph LR A[客户端] --> B[负载均衡] B --> C[Web服务器] C --> D[数据库] D --> E[磁盘存储] -
逐层排除:
- 从客户端开始逐步向后排查
- 使用traceroute、curl、telnet等工具测试连通性
9.2 监控指标的四象限法
根据紧急性和重要性划分:
code复制 高重要性
+---------------+
| 立即处理 | 长期优化
高紧急性 | CPU饱和 | 内存泄漏
+---------------+
| 误报警 | 低优先级
低紧急性 | 临时日志增长 | 历史数据
+---------------+
低重要性
9.3 根因分析的5Why法
示例分析:
- 为什么服务不可用?→ 进程崩溃
- 为什么进程崩溃?→ 内存不足
- 为什么内存不足?→ 内存泄漏
- 为什么有内存泄漏?→ 缓存未释放
- 为什么缓存未释放?→ 代码逻辑错误
10. 调试环境最佳实践
10.1 生产环境调试禁忌
- 避免直接修改生产配置(先备份!)
- 慎用性能影响大的工具(如strace)
- 禁止随意重启服务(先评估影响范围)
- 高危操作使用--dry-run先测试
10.2 调试记录模板
markdown复制# 问题描述
- 现象:
- 发生时间:
- 影响范围:
# 排查过程
1. 第一步操作及结果
2. 第二步操作及结果
...
# 根本原因
- 直接原因:
- 深层原因:
# 解决方案
- 临时措施:
- 长期修复:
10.3 个人调试笔记管理
推荐知识库工具:
- 本地:VSCode + Markdown
- 云端:Notion/语雀
- 终端:cheat.sh
我的笔记结构示例:
code复制~/debug_notes/
├── linux/
│ ├── memory_leaks.md
│ └── network_latency.md
├── database/
│ ├── mysql_slow_query.md
│ └── redis_timeout.md
└── tools/
├── tcpdump_examples.md
└── perf_usage.md
11. 命令速查手册
11.1 按场景分类
CPU问题:
top -H -p PID查看线程CPUperf top热点函数分析pidstat 1进程CPU统计
内存问题:
pmap -x PID内存映射详情free -h内存使用概览cat /proc/PID/status进程内存状态
磁盘I/O:
iostat -x 1磁盘负载iotop进程I/O排行du -sh *目录大小统计
网络问题:
ss -s连接统计tcpdump -nn -i eth0 'port 80'抓包mtr -n 8.8.8.8路由追踪
11.2 按命令分类
| 命令 | 主要用途 | 常用参数 |
|---|---|---|
| strace | 系统调用跟踪 | -p PID -ff -o file |
| ltrace | 库函数调用跟踪 | -p PID -f |
| nc | 网络连接测试 | -vz host port |
| telnet | 端口连通性测试 | host port |
| sar | 系统历史数据 | -u 1 3 (CPU) -r 1 3 (内存) |
| mpstat | 多核CPU统计 | -P ALL 1 |
| pidstat | 进程资源统计 | -urd -p PID 1 |
| iotop | 进程磁盘I/O监控 | -o -P |
| slabtop | 内核slab分配统计 | -o |
| ethtool | 网卡配置查看 | -i eth0 |
12. 调试技巧进阶
12.1 无侵入式调试
-
使用/proc文件系统:
bash复制cat /proc/PID/stack # 查看进程调用栈 cat /proc/net/tcp # 查看TCP连接状态 -
动态观察文件变化:
bash复制watch -n 1 'ls -l /proc/PID/fd' -
内核事件监控:
bash复制perf probe --add tcp_sendmsg perf stat -e probe:tcp_sendmsg -a sleep 10
12.2 性能分析技巧
-
火焰图生成:
bash复制perf record -F 99 -g -p PID -- sleep 30 perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg -
系统调用统计:
bash复制
strace -c -p PID -
上下文切换分析:
bash复制perf stat -e context-switches -p PID sleep 5
12.3 容器环境调试
-
进入容器:
bash复制docker exec -it container /bin/bash kubectl exec -it pod -- /bin/sh -
查看容器日志:
bash复制docker logs -f --tail 100 container kubectl logs -f pod -c container -
容器资源监控:
bash复制
docker stats kubectl top pod
13. 调试工具链构建
13.1 个人工具集配置
我的~/.bashrc常用别名:
bash复制alias ports='ss -tulnp'
alias meminfo='free -h && cat /proc/meminfo'
alias cpuinfo='lscpu && cat /proc/cpuinfo'
alias diskio='iostat -x 1'
alias netio='iftop -i eth0'
alias pstop='top -c -p $(pgrep -d"," -f "$1")'
13.2 常用脚本片段
快速进程检查:
bash复制#!/bin/bash
pid=$1
echo "=== Process $pid ==="
ps -fp $pid
echo "=== Open Files ==="
ls -l /proc/$pid/fd
echo "=== Memory Map ==="
pmap -x $pid
13.3 调试环境容器化
Docker调试镜像Dockerfile:
dockerfile复制FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
procps lsof strace tcpdump iputils-ping \
dnsutils net-tools vim curl
WORKDIR /debug
CMD ["/bin/bash"]
14. 经验总结与避坑指南
14.1 常见误区和纠正
-
误区: free内存少就是内存不足
事实: Linux会充分利用空闲内存做缓存,看available值更准确 -
误区: CPU使用率100%一定有问题
事实: 需结合负载(r)判断,计算密集型应用可能正常 -
误区: 网络不通就是防火墙问题
事实: 可能是路由、ARP、MTU、TCP参数等问题
14.2 性能优化黄金法则
- 测量优先:优化前必须先量化现状
- 瓶颈导向:优化当前最大瓶颈点
- 简单有效:先用最简单方案解决问题
- 验证闭环:每次优化后必须验证效果
14.3 调试日志记录建议
- 关键操作前记录系统状态快照
- 使用script命令录制完整会话
- 保存原始数据和中间结果
- 记录时间戳和操作顺序
15. 资源推荐与延伸阅读
15.1 经典书籍
- 《Linux性能优化大师》- Brendan Gregg
- 《Systems Performance: Enterprise and the Cloud》- Brendan Gregg
- 《The Linux Programming Interface》- Michael Kerrisk
- 《Troubleshooting with the Windows Sysinternals Tools》- Mark Russinovich
15.2 在线资源
- Brendan Gregg的博客和工具集
- Linux Performance项目
- Kernel.org官方文档
- Arch Linux Wiki
15.3 培训课程
- Linux Foundation性能调优课程
- Red Hat系统诊断与调优
- Udemy/Linux Academy相关课程
16. 命令历史与技巧回顾
16.1 历史命令复用
- 搜索历史命令:
bash复制Ctrl+R 搜索 history | grep tcpdump - 快速执行上一条命令:
bash复制!! # 上一条 !$ # 上条命令的最后一个参数 !ssh # 执行最近以ssh开头的命令
16.2 命令行效率技巧
- 并行执行:
bash复制cat servers.txt | xargs -P 10 -I {} ssh {} "hostname" - 实时监控:
bash复制watch -n 1 'df -h | grep /data' - 批量重命名:
bash复制rename 's/\.old$/.new/' *.old
16.3 终端复用技巧
- 分屏操作:
bash复制tmux split-window -h # 水平分割 tmux split-window -v # 垂直分割 - 同步输入:
bash复制
tmux set-window-option synchronize-panes on - 会话共享:
bash复制tmux new -s shared # 其他人连接 tmux attach -t shared
17. 调试文化培养建议
17.1 团队知识共享
- 建立内部Wiki记录典型案例
- 定期举办故障复盘会议
- 创建可复用的调试脚本库
- 新成员调试能力培训计划
17.2 个人成长路径
- 每月深入研究一个调试工具
- 参与开源社区问题排查
- 系统学习操作系统原理
- 考取相关认证(如RHCA)
17.3 调试思维训练
- 参与CTF竞赛
- 研究公开的故障报告
- 构建自己的实验环境
- 尝试解释所有"神奇"的操作
18. 终极调试检查清单
18.1 系统健康检查
- 负载情况:
uptime - CPU使用:
mpstat -P ALL 1 - 内存状态:
free -h - 磁盘I/O:
iostat -x 1 - 网络流量:
sar -n DEV 1
18.2 进程级检查
- 资源占用:
top -c -p PID - 线程状态:
ps -eLf | grep PID - 打开文件:
lsof -p PID - 系统调用:
strace -p PID - 内存映射:
pmap -x PID
18.3 网络连接检查
- 监听端口:
ss -tulnp - 活动连接:
ss -tan - 路由跟踪:
mtr -n 目标 - 带宽使用:
iftop -i eth0 - DNS解析:
dig +trace 域名
19. 调试工具的未来演进
19.1 eBPF革命
新一代观测工具:
- bpftrace
- BCC工具集
- kubectl-trace
19.2 可观测性平台
三大支柱:
- 指标(Prometheus)
- 日志(Loki)
- 追踪(Jaeger)
19.3 AI辅助调试
新兴方向:
- 异常自动检测
- 根因分析建议
- 自愈系统
20. 结语:调试的艺术
调试不仅是技术,更是一种思维方式。经过多年实践,我总结出三点核心心得:
- 保持好奇心:每个异常背后都有原因,不要满足于表面修复
- 系统性思维:系统是相互关联的整体,要建立全局视角
- 持续记录:好记性不如烂笔头,建立自己的调试知识库
最后分享一个真实故事:曾经花费三天排查的"随机崩溃"问题,最终发现是某位同事在crontab里写了个测试脚本。这个故事告诉我——永远不要假设任何事是"不可能的"。