8.8 Linux故障排查实战教程
• 模拟CPU飙高:
for i in $(seq 1 $(nproc)); do yes > /dev/null & done
$(nproc):获取当前机器的CPU逻辑核心数量
seq 1 $(nproc):生成一个从1开始,到你CPU核心数结束的数字序列
yes:无限循环输出“y“
▶ cpu占用过高排查思路:
(1)top查看哪个进程占用的cpu
(2)pidstat查看具体是哪个进程在占用
pidstat -u -p 进程id 1
u:查看CPU使用情况
p:指定查看某个id进程
1:每隔1秒刷新一次
-t:查看线程级别
(3)perf查看具体是程序什么代码运行占用
perf top -p 进程id
top:实时显示最热的函数
(4)确定该进程不是生产所需进程,使用kill进程号或者pkill进程名杀死该进程
• 模拟内存饱满:
▪ echo 1 > /proc/sys/vm/drop_caches 清除缓存
▪ stress-ng --vm 2 --vm-bytes 85% --vm-keep &
--vm 2:产生两个进程
--vm-bytes 85%:最高占用空闲内存85%
--vm-keep:占住不释放
▶ 内存占用过高排查思路:
(1)用free -h查看内存占用情况
(2)ps aux --sort=-%mem | head-5
查看那个进程吃了大量内存
(3)pmap -x 进程id | sort -k 3 -n | tail -20
查看进程内存详细地图,如果某块[anon]匿名内存,占用特别大,就是它在吃内存
sort -k 3 -n:按第三列,按数字排序
(4)确定该进程不是生产所需进程,使用pkill 进程名杀死该进程该进程不是所
• 模拟磁盘卡死:
dd if=/dev/zero of=/tmp/test_big_file bs=1M count=5000 &
用dd疯狂写大文件,if输入 of 输出 /dev/zero 不断写0
▶ 磁盘占用过高排查思路:
• iostat -x 1 5:查看磁盘是不是真的忙
x:显示扩展信息,能看到%util,await等关键指标
1:每隔1秒刷新一次 5:总共显示5次
主要看%util和r_await,w_await等参数
• iotop -o -b -d 1 -n 5:查看哪个进程在疯狂读写
o:只显示有I/O活动的进程,过滤掉闲着的
b:批处理模式,适合把结果保存到文件中,不用交互
d 1:每1秒刷新一次
n 5:刷新5次后退出
• 解决故障:
killall 进程名
pkill 进程名
拓展:
用blktrace看块设备级别的I/O(终极深度分析)
blktrace -d /dev/sda -w 10
blkparse -i sda | head-50
• 模拟网络堵塞:
▪ 制造大量连接:
ab -n 100000 -c 1000 http://localhost/ &
▪ 制造大量TIME_WAIT:
for i in $(seq 1 10000); do
curl -s -o /dev/null http://localhost &
done
▪ 模拟带宽占满:
wget -O /dev/null https://download.rockylinux.org/pub/rocky/ 10/isos/x86_64/Rocky-10.2-x86_64-dvd1.iso &
▶ 网络堵塞排查思路:
• ss -s:查看连接状态:
s:显示统计摘要,不看具体连接,只看总数
看timewait,如果值过高,说明大量连接在“断开后等待”,表示异常
• 如果要看具体是哪些端口:
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn
• 用iftop看流量是谁在跑:
iftop -i ens160 -n -N
n:不解析IP为主机名
N:不解析端口为服务码
• tcpdump:抓包看具体内容:
tcpdump -i host 10.8.0.13 -w /tmp/network.pcap -c 1000
w:写入文件
-c:抓1000个包
如果想直接看,不保存:
tcpdump -i eth0 host 123.45.67.89 -nn -X | head -20
nn:既不解析ip为主机名,也不解析端口为服务名
X:同时显示十六进制和ASCII内容,能看到包里的明文数据
• 杀死进程:killall 进程名 pkill 进程名
• 拓展:
抓包查看三次握手,四次挥手:
tcpdump -i ens160 port 80 and host 10.8.0.13 -nn -S
curl www.baidu.com