我的一台服务器完全没有响应:
top - 06:16:53 up 2:14, 1 user, load average: 30.95, 29.96, 22.92
Tasks: 168 total, 2 running, 166 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 12.6 sy, 0.0 ni, 0.0 id, 86.4 wa, 0.0 hi, 0.0 si, 1.1 st
KiB Mem : 1014524 total, 61368 free, 877028 used, 76128 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 4196 avail Mem
scroll coordinates: y = 1/168 (tasks), x = 1/12 (fields)
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30 root 20 0 0 0 0 S 11.1 0.0 4:04.70 kswapd0
1116 root 20 0 791548 44900 0 S 0.4 4.4 0:14.91 dockerd
1 root 20 0 37752 2664 864 D 0.2 0.3 0:06.00 systemd
很难说清楚到底发生了什么,因为我真的无法获得太多信息(反应迟钝),但这是我所看到的:
- 平均负载非常高
- 我看到 CPU 负载大约为 20% - 30%
- 我没有看到较高的 IO/网络利用率
- 我无法识别运行队列中有哪些进程
如何实现高平均负载和低 CPU 利用率?
答案1
内存不足,系统处于不稳定状态。没有足够的可用内存来将所有需要的进程页面保存在内存中,因此操作系统必须释放一些页面才能从磁盘加载所需的页面。由于没有交换,要释放的页面无法写入交换空间,因此唯一的选择是丢弃只读代码页或缩小缓冲区缓存。当执行前进到被丢弃的页面时,必须再次将其读入 RAM,这会以牺牲其他页面为代价。在某个时候,问题变得非常严重,以至于大部分时间都花在等待从磁盘加载页面上,并且很少有 CPU 周期可用于有用的工作。
尝试添加一些交换,尽管这可能会或可能不会有帮助,具体取决于您的流程的负载模式。
答案2
可能是挂载点问题。当系统尝试挂载当时不可用的挂载点时,它将开始增加系统负载,尽管您可能不会遇到某些进程囤积 CPU 的情况。
尝试:
- 运行
mount
并查看是否存在一些当时无法到达的挂载点。 - 检查
/etc/fstab
在启动时定义的所有挂载点,查看是否有任何一个挂载点在当时无法到达。