记录一次解决服务器卡顿问题的经过
记录两次解决服务器卡顿问题的过程。之前遇到都是直接重启机器或者重置服务器,没有认真考虑过原因,折腾完这两次以后突然觉得应该记录一下,后续在遇到这些情况不至于只知道重启/重装。
情况一:硬盘空间不足
- 检查磁盘空间
1
2
3
4
5
6
7
8
9
10
11
12# df -h
Filesystem Size Used Avail Use% Mounted on
udev 422M 0 422M 0% /dev
tmpfs 91M 10M 81M 12% /run
/dev/vda3 40G 39G 0 100% /
tmpfs 452M 0 452M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 452M 0 452M 0% /sys/fs/cgroup
/dev/vda2 189M 6.1M 182M 4% /boot/efi
overlay 40G 39G 0 100% /var/lib/docker/overlay2/2cef17a9bba0b6ad0829ffb0a3e4053e99b9a7203e1d709fd8f56bcb2f7d3d75/merged
overlay 40G 39G 0 100% /var/lib/docker/overlay2/8fc17c4d69466dd8f93d14e965dbb921ecfa97033c0c463ab78dc3d633e9acbe/merged
tmpfs 91M 0 91M 0% /run/user/0
很明显总共40G的小硬盘已经可用容量已经为零了,急需清理一些磁盘出来。其中嫌疑最大的就是docker了。
重点清理对象
1
2
3
4
5docker system prune -a # 删除所有未使用的容器、镜像、网络
# 清理日志文件
journalctl --disk-usage
journalctl --vacuum-time=7d # 只保留7天日志顺便清理一些临时文件日志文件
1
2
3
4
5
6
7
8# 清理临时文件
rm -rf /tmp/*
rm -rf /var/tmp/*
# 快速清理一些空间
apt-get autoremove
apt-get autoclean
rm -rf /var/log/*.gz /var/log/*.old后续
一通操作,果然腾出了12G的空间出来(主要是docker占用),SFTP又变的丝滑了,ssh也不卡了。
情况二:僵尸进程
- 检查系统资源占用
1
2
3
4
5
6top - 11:10:26 up 98 days, 1:14, 1 user, load average: 45.39, 25.04, 24.50
Tasks: 6277 total, 2 running, 124 sleeping, 0 stopped, 6151 zombie
%Cpu(s): 1.4 us, 38.4 sy, 0.0 ni, 0.0 id, 59.2 wa, 0.0 hi, 0.9 si, 0.0 st
MiB Mem : 903.6 total, 53.4 free, 765.0 used, 85.1 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 23.7 avail Mem
## 后边省略若干行
分析发现三个异常,load average过高,6151个僵尸进程,wa过高,初步判断是因为僵尸进程太多占用了大量的进程表空间,所以系统资源竞争激烈。
- 查找僵尸进程的源头
1
2
3
4
5
6
7
8
9
10
11/# ps -eo ppid | sort | uniq -c | sort -rn | head -10
6151 989827
65 2
31 1
8 989394
6 20956
5 1548830
2 989842
2 989836
2 989706
2 520
罪魁祸首已经很明显了,就是989827这个进程,创建了六千多个僵尸进程
- 定位问题源头
1
2
3/# ps -fp 989827
UID PID PPID C STIME TTY TIME CMD
root 989827 989706 0 Oct27 ? 00:14:57 registry serve /etc/docker/xxx/config.yml
现在问题已经很明显了,是我前天搞了一半的docker,当时着急下班没有完全调通,中间一天没顾上看,结果一直重试差点把服务器给搞崩了。。。
- 后续
关掉重试了两天的服务以后,卡顿情况接触。