← 返回 Linux命令图解 目录

🌐 Linux网络与监控图解

网络命令/top监控/磁盘/内存/排障流程/线上避坑 · SVG可视化 + 生活类比 + 真实输出

🔴 真实事件:线上服务502,排查3小时才发现是磁盘满了

周三晚上11点,监控告警:API返回502 Bad Gateway。

23:05 运维重启了Nginx和Java应用 → 5分钟后又502

23:30 看Java日志:java.io.IOException: No space left on device

23:35 df -h 一看:/分区 100%满了!du -sh /var/log/* 发现app.log占了45GB

23:40 删了旧日志,重启服务恢复。但已经影响了1小时线上服务

💡 教训:排障必须系统化——先df -h看磁盘,再free -h看内存,再top看CPU。不要上来就重启!

🗺️ Linux网络与监控学习路线图 🧭 第一层:懂网络 ping/curl/ss/nc/dig — 网络排障4步决策树 — 知道"网络通不通"怎么查 🏗️ 第二层:会监控 top/htop + free/df/iostat — load/CPU/内存/磁盘4大指标 — 知道"系统健康不健康" ⚡ 第三层:能排障 5步排障流程 + 线上三大陷阱❌✅ + Java CPU飙高定位 → 出问题能自己查 网络基础 系统监控 实战排障

① 网络命令

网络命令 = 各种通信工具
ping = 打电话试通不通(能响就通)
curl = 寄快递试服务(发请求看响应)
netstat/ss = 查电话簿(谁在跟谁通话)
nslookup/dig = 查114号码(域名→IP)
telnet/nc = 试门能不能推开(端口通不通)
tcpdump = 录音监听(抓包分析)
网络排障决策树 — 从外到内 ① ping目标IP — 网络通不通? 通→继续 | 不通→检查路由/防火墙/网卡 ② telnet/nc 端口 — 服务开没开? 通→继续 | 不通→检查服务/防火墙 ③ curl请求 — 服务正常吗? 200→正常 | 5xx→看应用日志 | 超时→看负载/线程池 ④ tcpdump抓包 — 数据对不对? 分析请求/响应内容,定位协议级问题 命令速查 ping 10.0.0.1 nc -zv host 8080 curl -v http://api/ ss -tlnp | grep 8080 nslookup baidu.com dig baidu.com traceroute 10.0.0.1 tcpdump -i eth0 port 80 ifconfig / ip addr ip route 类比:先打电话→ 试门→进屋→查录音
网络排障4步决策树:ping→telnet→curl→tcpdump
terminal — 网络命令实战
📂 network/
network-debug.sh
ss-netstat.sh
dns-check.sh
# 1. ping — 测试网络连通性 $ ping -c 3 10.0.0.1 64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.123 ms 64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.098 ms # --- 3 packets transmitted, 3 received, 0% loss --- # 2. curl — 测试HTTP服务 $ curl -v -o /dev/null -s -w "HTTP:%{http_code} Time:%{time_total}s\n" http://api.example.com/users < HTTP/1.1 200 OK HTTP:200 Time:0.234s # 3. ss — 查看端口监听(替代netstat) $ ss -tlnp | grep 8080 LISTEN 0 128 *:8080 *:* users:(("java",pid=12345,fd=12)) # ↑状态 ↑backlog ↑端口 ↑进程名/PID # 4. nslookup — DNS解析 $ nslookup api.example.com Server: 8.8.8.8 Name: api.example.com Address: 93.184.216.34 # 5. nc — 测试端口连通性 $ nc -zv db-server 3306 Connection to db-server 3306 port [tcp/mysql] succeeded!
✅ 已了解:网络排障4步决策树(ping→telnet→curl→tcpdump)和6个常用命令
➡️ 接下来看:系统监控——top/htop怎么看

② top/htop监控

top = 公司实时监控大屏:看谁最忙、谁最占资源、整体负荷如何。
load average = 公司整体忙碌程度(1分钟/5分钟/15分钟)
CPU% = 员工忙不忙
MEM% = 员工占了多少办公空间
top输出解读 — 监控大屏 系统概览 top - 10:23:45 up 30 days, 2 users, load average: 2.50, 1.80, 1.20 ↑当前时间 ↑运行30天 ↑2用户 ↑1分钟 ↑5分钟 ↑15分钟 Tasks: 256 total, 2 running, 253 sleeping, 1 zombie %Cpu(s): 25.3 us, 1.2 sy, 0.0 ni, 72.8 id, 0.5 wa, 0.2 hi, 0.0 si CPU指标含义(公司人力分配) us(用户)=员工干活 sy(系统)=行政开销 id(空闲)=闲着 wa(IO等待)=等快递(等磁盘) hi/si(中断)=电话打扰 ⚠️ wa高 = 磁盘慢!不是CPU问题!加SSD或优化IO MiB Mem: 7823.0 total, 1234.0 free, 5432.0 used, 1157.0 buff/cache MiB Swap: 2048.0 total, 1800.0 free, 248.0 used. 2345.0 avail Mem ↑可用内存=free+可回收cache PID USER %CPU %MEM VSZ RSS S COMMAND 12345 app 25.3 8.1 4567890 523456 S java -jar app.jar 12346 mysql 12.1 15.2 2345678 987654 S mysqld
top输出全景解读:load average/CPU指标/内存/进程
load average怎么看?
• 值 < CPU核数 = 正常(比如4核机器,load < 4就行)
• 1分钟 >> 5分钟 > 15分钟 = 突然变忙(刚出问题)
• 1分钟 < 5分钟 < 15分钟 = 在恢复(问题在改善)
• 三个值差不多 = 稳定状态(或持续高压)
top快捷键速查
Shift+P:按CPU排序(最常用)
Shift+M:按内存排序
c:显示完整命令行
1:展开每个CPU核心的使用率
top -Hp PID:查看某进程的线程级CPU使用(定位Java热点线程必备)
✅ 已了解:top输出全景——load/CPU指标(us/sy/wa/id)/内存/进程列表
➡️ 接下来看:磁盘和内存的详细监控命令

③ 磁盘与内存监控

$ # === 磁盘监控 === $ df -h # 查看磁盘使用率 Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 35G 15G 70% / /dev/sdb1 200G 120G 80G 60% /data tmpfs 3.9G 0 3.9G 0% /dev/shm # ⚠️ Use% > 80%要警惕,>90%可能影响服务 $ du -sh /var/log/* # 查看各目录大小 2.5G /var/log/app 1.2G /var/log/nginx 500M /var/log/mysql $ du -sh /var/log/* | sort -rh | head -5 # 排序取TOP5 $ iostat -x 1 3 # IO统计(每秒1次,共3次) Device rrqm/s wrqm/s r/s w/s rMB/s wMB/s await %util sda 0.00 5.00 10.0 20.0 0.05 0.10 2.50 1.50 # ↑平均IO等待(ms) ↑设备利用率 # await > 10ms = IO慢 %util > 80% = 磁盘繁忙 $ # === 内存监控 === $ free -h total used free shared buff/cache available Mem: 7.6Gi 5.3Gi 1.2Gi 256Mi 1.1Gi 2.3Gi Swap: 2.0Gi 248Mi 1.8Gi # ⚠️ 看available不是看free!available=free+可回收cache # Swap used高 = 物理内存不够,用了交换空间=变慢! $ vmstat 1 5 # 虚拟内存统计 procs -----------memory---------- ---swap-- -----io---- r b swpd free buff cache si so bi bo 2 0 248000 1234567 234567 890123 5 2 20 15 # r=等待运行的进程 b=不可中断睡眠(等IO) # si=从swap进来 so=到swap出去 si/so高=内存紧张!
指标正常警告危险类比
磁盘Use%<70%70-85%>85%办公室快满了
iostat await<5ms5-10ms>10ms等快递太久
Swap used<10%10-30%>30%借了隔壁的办公室
Memory avail>30%10-30%<10%空闲工位很少
Load average<核数1-2×核数>2×核数员工排队等CPU
✅ 已了解:磁盘(df/du/iostat)和内存(free/vmstat)的监控命令和阈值
➡️ 接下来看:系统化的5步排障流程

④ 排障流程

排障 = 医生看病:先量体温(top) → 问症状(log) → 查血象(监控) → 精准定位(strace/tcpdump) → 治疗(改配置/重启/扩容)
5步排障流程 — 医生看病法 ① 量体温 — top/htop $ top -c # 看整体CPU/内存/Load $ htop # 增强版,更直观 高CPU? 高内存? 高Load? IO等待? ② 问症状 — 查日志 $ tail -200f app.log $ journalctl -u my-app -f ERROR? OOM? Timeout? 死锁? ③ 查血象 — 系统监控 $ free -h # 内存够不够? $ df -h # 磁盘满没满? $ iostat -x 1 # IO慢不慢? ④ 精准定位 — strace/tcpdump $ strace -p PID # 进程在干啥? $ tcpdump -i eth0 port 8080 $ lsof -p PID # 打开了哪些文件? ⑤ 治疗 — 根据诊断结果 CPU高 → 优化代码/加机器/限流 内存高 → 查内存泄漏/加内存/重启 磁盘满 → 清日志/扩容 IO慢 → 加SSD/优化查询 常见场景速查 应用卡住 → jstack PID / kill -3 PID(Java线程dump) OOM → jmap -heap PID / -XX:+HeapDumpOnOutOfMemoryError CPU飙高 → top -H → 找到高CPU线程ID → jstack中找 网络不通 → ping → telnet → curl → tcpdump
5步排障流程:量体温→问症状→查血象→精准定位→治疗
✅ 已了解:5步排障流程 + 常见场景速查(jstack/jmap/top -H)
➡️ 接下来看:线上最常踩的三大陷阱 ❌✅对比

⑤ 线上三大陷阱 ❌✅

线上事故不是"出了再查",而是平时就该知道怎么防。下面三个陷阱,覆盖了80%的线上问题!

陷阱1: 磁盘满了导致服务异常

❌ bad-disk-full.sh — 磁盘满了还在重启服务
📂 ops/
emergency.sh
# ❌ 陷阱:502就重启,不查磁盘 $ systemctl restart my-app $ curl http://localhost:8080/health 502 Bad Gateway $ systemctl restart my-app # 再重启 $ curl http://localhost:8080/health 502 Bad Gateway # 还是502! # 为什么?因为磁盘满了,应用写不了临时文件/日志 # 重启也写不了,当然还是502 # 而且磁盘满还可能导致数据库崩溃!
✅ good-disk-full.sh — 先查磁盘,再处理
📂 ops/
emergency.sh
# ✅ 正确:先看磁盘,再处理 # 第1步:查磁盘 $ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 50G 0 100% / # ↑ 磁盘100%! # 第2步:找大文件 $ du -sh /var/log/* | sort -rh | head -5 45G /var/log/app/app.log # ← 45G! 1.2G /var/log/nginx/access.log # 第3步:清理日志(不删除文件,清空内容) $ > /var/log/app/app.log # 清空文件但保留inode # 或者用 logrotate 配置自动轮转 # 第4步:重启服务 $ systemctl restart my-app $ curl http://localhost:8080/health 200 OK # ✅ 恢复了! # 第5步:治本 — 配置logrotate防止再满 # /etc/logrotate.d/my-app # /var/log/app/*.log { # daily # 每天轮转 # rotate 7 # 保留7天 # compress # 压缩旧日志 # missingok # 日志不存在不报错 # }

陷阱2: OOM(内存溢出)只知道重启

❌ bad-oom.sh — OOM就重启,重启完还OOM
📂 ops/
handle-oom.sh
# ❌ 陷阱:OOM就重启,不dump不分析 $ kubectl get pods my-app-7d9f8 OOMKilled 0/1 Completed $ kubectl delete pod my-app-7d9f8 # 等新Pod起来 $ kubectl get pods my-app-8a2e1 OOMKilled 0/1 Completed # 还是OOM!内存泄漏还在,重启多少次都一样 # 而且没有dump,根本不知道什么对象占满了内存
✅ good-oom.sh — 先dump再重启,分析根因
📂 ops/
handle-oom.sh
# ✅ 正确:先dump再重启,分析根因 # 预防:启动参数加HeapDumpOnOutOfMemoryError # JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError # -XX:HeapDumpPath=/tmp/heapdump.hprof # -Xmx512m" # OOM发生后,先拿dump文件 $ kubectl cp my-app-8a2e1:/tmp/heapdump.hprof ./heapdump.hprof # 用MAT(Memory Analyzer Tool)分析dump # 1. 打开heapdump.hprof # 2. 看"Leak Suspects"报告 → 哪个对象占内存最多 # 3. 看"Dominator Tree" → 谁持有了这些对象 # 4. 定位代码中哪里创建了泄漏对象 # 常见OOM原因和解决: # • HashMap无限增长 → 加淘汰策略/限流 # • ThreadLocal没remove → 用完必须remove # • 大查询一次加载全部数据 → 分页查询 # • 连接池泄漏 → 用连接池框架,别自己管理 # 治本:找到泄漏原因后再部署新版本 # 如果是内存不够(不是泄漏),加大-Xmx

陷阱3: CPU飙高只知道加机器

❌ bad-cpu-high.sh — CPU高就加机器/重启
📂 ops/
handle-cpu.sh
# ❌ 陷阱:CPU高就加机器,不查原因 $ top -bn1 | head -5 load average: 15.6, 12.3, 8.9 # 4核机器load 15! $ kubectl scale deployment my-app --replicas=5 # 从2个Pod扩到5个,CPU确实降了 # 但如果代码里有死循环/正则回溯? # 5个Pod全都在死循环,浪费3倍资源! # 而且没找到根因,下次流量一来还会飙
✅ good-cpu-high.sh — 4步定位热点代码
📂 ops/
handle-cpu.sh
# ✅ 正确:4步定位热点代码 # 第1步:找到Java进程PID $ top -c # 看完整命令行 PID USER %CPU COMMAND 12345 app 98.5 java -jar app.jar # 第2步:找到最耗CPU的线程 $ top -Hp 12345 # 线程级CPU PID USER %CPU COMMAND 12350 app 95.2 "http-nio-8080-exec-5" # 第3步:线程ID转十六进制 $ printf "%x\n" 12350 303e # 第4步:在线程dump中找该线程 $ jstack 12345 | grep 0x303e -A 30 "http-nio-8080-exec-5" #12350 prio=5 os_prio=0 tid=0x... nid=0x303e runnable java.lang.Thread.State: RUNNABLE at com.app.service.RegexUtils.validate(RegexUtils.java:42) at com.app.controller.OrderController.create(OrderController.java:89) # ← 找到了!RegexUtils.validate()在正则回溯! # 解决:优化正则或加超时限制
📋 线上三大陷阱速查表
陷阱❌ 错误做法✅ 正确做法一句话口诀
磁盘满→502反复重启服务df -h→du -sh找大文件→清空→logrotate治本先看磁盘再重启!
OOM重启了事,没dumpHeapDumpOnOutOfMemoryError→MAT分析→修泄漏先dump再重启!
CPU飙高加机器/扩容top -Hp→printf %x→jstack定位热点线程先找热点再扩容!
线上排障3个必备JVM参数
1. -XX:+HeapDumpOnOutOfMemoryError:OOM时自动dump堆内存
2. -XX:HeapDumpPath=/tmp/heapdump.hprof:dump文件路径
3. -XX:+PrintGCDetails -XX:+PrintGCDateStamps:打印GC日志
这3个参数在OOM/GC频繁时能救命!生产环境必须配,不要等出了问题再配。
✅ 已了解:线上三大陷阱 ❌✅对比(磁盘满/OOM/CPU飙高) + 3个必备JVM参数
➡️ 最后:面试中Linux监控的高频问题速答

⑥ 面试速答

load average的3个数字分别代表什么?多少算高?
3个数字分别是过去1分钟、5分钟、15分钟的系统负载平均值。

多少算高?取决于CPU核数。4核机器:load < 4正常,4-8偏高,>8严重过载。

判断逻辑:
- 三个值差不多 = 稳定状态
- 1分钟 >> 5/15分钟 = 刚出问题
- 1分钟 << 5/15分钟 = 问题在恢复
free命令中available和free有什么区别?
free:完全没被使用的内存。
available:可用内存 = free + 可回收的buff/cache。

Linux会把空闲内存用作磁盘缓存(buff/cache),当应用需要内存时,这些缓存会自动释放。所以available才是真正的可用内存。

类比:free=完全空的工位,available=空工位+随时可腾出来的临时工位。
磁盘满了怎么快速排查?
3步排查
1. `df -h` → 看哪个分区满
2. `du -sh /* | sort -rh | head -10` → 看哪个目录最大
3. `du -sh /var/log/* | sort -rh | head -10` → 继续深入

常见原因:
- 日志文件太大 → `find /var/log -name "*.log" -size +100M`
- 已删除但进程仍占用的文件 → `lsof | grep deleted`
- Docker镜像/容器 → `docker system df`
top命令中wa(IO Wait)高说明什么问题?
wa高 = CPU在等磁盘IO完成。不是CPU不够,是磁盘太慢。

常见原因:
1. 磁盘性能差(机械硬盘跑重IO应用)
2. MySQL大量随机IO(缺少索引的全表扫描)
3. 日志狂写(应用疯狂打日志)

解决方案:
- 加SSD / 优化查询加索引 / 减少日志量
ss和netstat有什么区别?为什么推荐ss?
netstat:老牌工具,读取/proc/net信息,连接数多时很慢。
ss:直接读取内核socket数据结构,速度快很多,信息更全。

生产环境万级连接时:netstat可能要十几秒,ss秒出。

常用命令对照:
- `ss -tlnp` = `netstat -tlnp`(TCP监听端口)
- `ss -s` = 连接统计概要
- `ss -tn state established` = 所有已建立连接
Java应用CPU飙高怎么排查?
4步定位
1. `top -c` → 找到Java进程PID(确认是Java进程)
2. `top -Hp PID` → 找到占用CPU最高的线程ID(如TID=12350)
3. `printf "%x\n" 12350` → 十进制转十六进制(0x303e)
4. `jstack PID | grep 0x303e -A 30` → 在线程dump中找到该线程在干啥

常见原因:死循环、正则回溯、GC频繁、加密运算。
Swap空间频繁使用说明什么问题?
Swap频繁使用 = 物理内存不够了,系统把数据从内存搬到磁盘(swap out),需要时再搬回来(swap in)。磁盘比内存慢1000倍!

用`vmstat 1`看si/so列:持续大于0说明在频繁swap。
用`free -h`看Swap used是否在增长。

解决方案:
1. 增加物理内存
2. 减少应用内存占用(优化/减少缓存)
3. 调整swappiness:`sysctl vm.swappiness=10`(尽量不用swap)
4. 注意:k8s环境建议swappiness=0或直接关闭swap
线上服务突然变慢,你怎么排查?
按"医生看病法"5步走

1. 量体温:`top -c`看整体load/CPU/内存/wa
2. 问症状:`tail -200f app.log`看ERROR/OOM/Timeout
3. 查血象:`free -h`内存 / `df -h`磁盘 / `iostat -x 1` IO
4. 精准定位:CPU高→`top -Hp + jstack`,内存高→`jmap -heap`,网络→`ping/curl/tcpdump`
5. 治疗:根据根因处理(修代码/加资源/改配置)

面试加分:强调"先看整体指标再定位具体问题",不要说"我直接重启"。
🎯 Linux网络与监控速记三原则

— 全栈资料库 · Linux网络与监控图解 —