别再只会top和df了!这10个Linux命令组合拳,让你线上问题排查效率翻倍
2026/5/8 13:32:41 网站建设 项目流程

10组Linux命令组合拳:从CPU暴增到磁盘爆满的精准打击手册

当服务器监控突然告警,CPU曲线飙升成心电图,磁盘空间像被黑洞吞噬般快速消失——此刻的你需要的不是单兵作战的topdf,而是一套能直击问题根源的组合式诊断策略。本文将拆解10个实战验证的命令链路,它们像手术刀般精准定位过载进程、幽灵日志、僵尸连接等典型问题场景。

1. CPU过载的连环诊断术

发现load average数值突破安全阈值时,多数工程师的第一反应是top -c查看进程列表。但真正的高手会启动三级诊断流程

# 第一级:定位CPU消耗大户 top -b -n 1 | head -n 12 | tee /tmp/cpu_usage.log # 第二级:分析进程线程详情 ps -eLo pid,lwp,pcpu,cmd | grep $(cat /tmp/cpu_usage.log | awk '/^[0-9]/{print $1}' | head -1) # 第三级:追踪系统调用 strace -p $(ps -eLo pid,lwp | grep -w $(cat /tmp/cpu_usage.log | awk '/^[0-9]/{print $1}' | head -1) | awk '{print $2}' | head -1) -T -tt -o /tmp/strace.log

这套组合拳的精妙之处在于:

  • top -b以批处理模式运行避免交互式刷新干扰
  • ps -eLo展示轻量级进程(LWP)级别的CPU占用
  • strace -T统计系统调用耗时,定位IO等待或锁竞争

关键提示:当发现某个Java进程CPU持续高位运行时,可配合jstack导出线程栈进一步分析热点方法

2. 磁盘空间神秘消失的刑侦手段

收到/var分区使用率90%的告警后,常规的df -h只能确认病症,我们需要更深入的取证工具:

# 第一步:定位大文件分布 du -x --max-depth=4 /var | sort -nr | head -20 # 第二步:检查被删除未释放空间的文件 lsof +L1 /var | awk '$5=="REG" && $7=="0t0" {print $9}' | xargs -I{} ls -lh {} # 第三步:追踪实时写入 inotifywait -m -r /var/log -e create,modify 2>/dev/null | awk '{print $3}' | sort | uniq -c

这里有几个高阶技巧:

  • du -x避免跨文件系统统计
  • lsof +L1找出被删除但未释放的文件句柄
  • inotifywait监控目录实时变化
文件类型典型位置清理策略
日志文件/var/log配置logrotate轮转
临时文件/tmp设置tmpwatch定期清理
核心转储/var/crash调整ulimit限制

3. 端口冲突与网络连接的全息画像

当应用报错"Address already in use"时,仅靠netstat -tulnp可能遗漏关键信息。完整的端口侦查流程应该是:

# 立体化端口画像 ss -tulnp | grep :80 lsof -i :80 -P cat /proc/net/tcp | grep -w "0A" # 0A是80端口的16进制 # 连接溯源 tcpdump -i any port 80 -c 100 -w /tmp/port80.pcap tshark -r /tmp/port80.pcap -Y "http" -T json

这个案例展示了如何将不同工具的优势结合:

  • ssnetstat更快速高效
  • /proc/net/tcp提供内核级原始数据
  • tcpdump+tshark实现流量分析可视化

4. 内存泄漏的狩猎方案

内存缓慢增长往往是最难诊断的问题之一,我们需要多维度证据链:

# 监控整体趋势 watch -n 5 'free -m; echo; ps aux --sort=-%mem | head -5' # 分析进程内存映射 pmap -x $(pgrep java) | tail -n +3 | sort -k3 -nr | head # 追踪malloc调用 LD_PRELOAD=/lib64/libmalloc_debug.so.0 MALLOC_DEBUG=leak_trace java -jar app.jar

内存诊断的黄金法则是时间序列对比。建议每小时执行以下命令并归档结果:

date >> /tmp/mem.log ps aux --sort=-%mem >> /tmp/mem.log cat /proc/meminfo >> /tmp/mem.log

5. 日志分析的联邦调查局

面对GB级别的分布式日志,greptail只是基础装备。专业级的日志分析需要建立多级过滤管道

# 时间范围过滤 sed -n '/2023-08-01 14:00:00/,/2023-08-01 15:00:00/p' app.log > period.log # 多条件交集查询 rg -N -A5 -B2 'ERROR.*connection timeout' app.log | grep -v 'DEBUG' | jq '.request_id' # 实时异常检测 tail -F app.log | awk '/ERROR/{system("telegram-cli -msg \"异常出现: "$0"\"")}'

工具链选择建议:

  • rg(ripgrep)比grep快10倍
  • jq处理JSON日志
  • awk实现简单事件触发

6. 僵尸进程的终结者协议

ps显示<defunct>状态进程时,需要特殊处理手段:

# 定位僵尸父进程 ps -A -ostat,pid,ppid | grep -e '^[Zz]' | awk '{print $3}' | xargs -I{} ps -p {} # 优雅终止 kill -SIGCHLD $(ps -A -ostat,ppid | grep -e '^[Zz]' | awk '{print $2}') # 强制清理 echo 1 > /proc/sys/kernel/sysrq echo "reap_orphaned_zombies" > /proc/sysrq-trigger

处理僵尸进程的注意事项:

  1. 优先尝试让父进程正常回收
  2. 避免直接kill -9僵尸进程
  3. 内核参数调整是最后手段

7. 文件描述符泄露的缉凶指南

Too many open files错误背后往往隐藏着资源泄露。完整的诊断步骤包括:

# 查看全局限制 cat /proc/sys/fs/file-nr # 进程级分析 ls -l /proc/$(pgrep java)/fd | wc -l lsof -p $(pgrep java) | awk '{print $5}' | sort | uniq -c # 追踪打开操作 strace -f -e trace=open,openat,close -p $(pgrep java) 2>&1 | grep -v ENOENT

预防策略:

  • 使用ulimit -n合理设置限制
  • 所有文件操作放在try-with-resources块中
  • 定期监控/proc/sys/fs/file-nr趋势

8. 系统负载的根因分析法

高负载但CPU空闲?可能是以下隐形杀手:

# 检查不可中断进程 ps aux | awk '$8=="D"' # 磁盘IO等待分析 iostat -x 2 5 | awk '/^[v,s]/ {print $1,$12}' # 内核调用追踪 perf top -e 'syscalls:sys_enter_*' -s pid,cpu

典型案例对照表:

现象可能原因验证命令
load高,CPU低磁盘IO瓶颈iotop -oP
CPU sys占比高系统调用频繁perf stat -e 'syscalls:sys_enter_*'
上下文切换多进程过度竞争pidstat -w 2

9. 网络流量的时空回溯术

当突发流量导致连接池耗尽时,需要历史数据对比:

# 安装流量记录工具 yum install -y nethogs iftop # 实时监控 iftop -P -n -N -B # 历史分析 sar -n DEV 1 10 | grep -v Average cat /proc/net/dev | awk '/eth0/{print $2,$10}'

网络诊断的黄金时间窗是问题发生后的前5分钟,建议预先部署以下监控:

# 持续记录连接状态 watch -n 60 'date >> /tmp/net.log; netstat -ant >> /tmp/net.log'

10. 性能问题的火焰图取证

对于偶发性能劣化,传统命令难以捕捉,需要采样工具:

# CPU火焰图 perf record -F 99 -a -g -- sleep 30 perf script | stackcollapse-perf.pl | flamegraph.pl > cpu.svg # 内存分配热点 valgrind --tool=massif --pages-as-heap=yes java -jar app.jar ms_print massif.out.* > mem_analysis.txt

火焰图分析要点:

  • 纵向表示调用栈深度
  • 横向表示出现频率
  • 避免直接阅读原始perf数据

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询