一句话总结
磁盘排查三板斧:df -h 看容量、df -i 看 inode(小文件占满)、lsof 找"已删除但未释放"的文件(日志被删但进程还握着句柄)。网络排查分层走:ping(三层可达)→ 端口(四层,ss/telnet)→ 应用(七层,curl),抓包用 tcpdump 兜底。
初级理解
df 显示磁盘满了,但 du 统计加起来很小——为什么?(经典题)两个原因:
inode 是什么:文件的"身份证"(元数据 + 数据块指针),每个文件占一个。海量小文件会把 inode 耗尽——df -h 还有空间但写入报 "No space left on device",用 df -i 确认。
中级深入
磁盘性能看 iostat -x 1:
- %util:设备处理 IO 的时间占比,接近 100% 说明打满(SSD/并发队列下还要结合 await)
- await:IO 平均响应时间(ms),SSD 应 < 1ms,机械盘正常 5~10ms,飙升即瓶颈
- r/s w/s、rkB/s wkB/s:区分随机/顺序、读/写压力来源
找大文件/大目录:
网络排查四层法(面试标准答案):
高级拓展
ss 优于 netstat(要说得出理由):ss 直接读内核 netlink/内存数据,万级连接不卡;netstat 遍历 /proc 逐个读,连接多时极慢。高频用法:
TIME_WAIT 过高的处置:TIME_WAIT 是主动关闭方的正常状态(等 2MSL),万级可接受;十万级+影响建连时:① 应用侧用连接池复用、尽量由客户端主动关闭;② 内核调优 tcp_tw_reuse=1(仅出站方向安全)。不要背"net.ipv4.tcp_tw_recycle=1"这种答案——它已在内核 4.12 移除且本身就是坑。
tcpdump 实战(面试让手写一条):
抓包看什么:三次握手有没有 SYN 无 SYN-ACK(防火墙丢包/未监听)、RST 谁发的(服务拒绝/端口未监听)、重传多不多(网络质量)、HTTP 层看请求响应内容(配合 -A)。
实战场景
场景一:凌晨告警磁盘使用率 95%
场景二:服务间调用突然大量超时
场景三:容器里磁盘写满
面试模拟
Q:rm 掉一个 100G 日志文件,磁盘空间没释放,为什么?怎么办?
A:Linux 删除只减 link count,进程还持有文件句柄时 inode 不会释放。用 lsof +L1 能看到 deleted 状态的大文件。处置:优雅方案是让进程重开日志(logrotate 的 copytruncate / 发 USR1 信号);紧急方案是 truncate -s 0 文件名 截断释放空间——直接 rm 是无效的,重启进程才彻底。
Q:服务器能 ping 通但端口连不上,列出可能原因。
A:按概率排:① 服务没启动或崩了(ss -tnl 看监听);② 监听地址是 127.0.0.1 而非 0.0.0.0(容器/配置常见);③ 防火墙:iptables/firewalld 规则、云平台安全组没放行;④ 端口被占用导致服务起不来;⑤ 中间网络设备 ACL。排查命令链:ss -tnl → telnet → iptables -L -n → 抓包看 SYN 有没有回 SYN-ACK。
Q:怎么统计一个服务的实时连接数和来源 IP 分布?
A:ss -tn state established '( sport = :8080 )' 列出 established 连接;配 awk 统计来源:ss -tn | awk 'NR>1 {split($4,a,":"); print a[1]}' | sort | uniq -c | sort -rn | head(按需取 $4 对端或本端)。对比 netstat:ss 读内核态数据更快,连接数上万时是唯一可行选择。关注点:ESTABLISHED 总量、TIME_WAIT 趋势、单一来源 IP 是否异常(可能是爬虫或连接泄漏)。