我在使用 Pop!_OS 20.04 时遇到问题。基本上,运行足够长的时间后,我的缓冲区/缓存会填满(我读到这是完全正常的)并且我的可用内存会减少。最终我的计算机开始尝试交换内存并且 kswapd 进程启动。发生这种情况时,我的计算机完全冻结并变得无法使用,需要硬重启。下面是在此发生之前不久顶部的几个示例输出。
top - 20:01:56 up 2:20, 1 user, load average: 0.89, 0.89, 0.96
Tasks: 273 total, 2 running, 271 sleeping, 0 stopped, 0 zombie
%Cpu(s): 15.2 us, 3.5 sy, 0.0 ni, 80.9 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7916.1 total, 156.4 free, 3212.3 used, 4547.4 buff/cache
MiB Swap: 4095.5 total, 2097.5 free, 1998.0 used. 118.5 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5717 bob 20 0 6981324 529316 40100 S 52.5 6.5 93:20.71 WoWClassic.exe
1895 bob -2 0 6984436 84200 17752 S 5.3 1.0 2:31.27 gnome-shell
1614 bob 20 0 4878928 24088 3960 S 8.6 0.3 5:45.16 Xorg
2214 bob 20 0 639644 19208 8840 S 4.3 0.2 0:27.15 gnome-terminal-
2349 bob 20 0 2091024 7800 2096 S 0.3 0.1 0:48.83 io.elementary.a
1219 geoclue 20 0 584040 6000 4044 S 0.0 0.1 0:00.41 geoclue
1733 bob 20 0 323980 4896 1724 S 1.0 0.1 0:14.02 ibus-daemon
1 root 20 0 167800 4536 1292 S 0.3 0.1 0:18.14 systemd
876 root 20 0 394572 4448 1940 S 0.3 0.1 0:09.84 udisksd
1836 bob 20 0 505000 4280 2116 S 0.3 0.1 0:00.59 xdg-desktop-por
445 root 19 -1 70136 4272 3608 S 0.0 0.1 0:00.71 systemd-journal
top - 20:16:50 up 2:35, 1 user, load average: 0.88, 0.41, 0.70
Tasks: 274 total, 1 running, 273 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.6 us, 0.2 sy, 0.0 ni, 99.2 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7916.1 total, 459.5 free, 2943.0 used, 4513.6 buff/cache
MiB Swap: 4095.5 total, 2300.2 free, 1795.3 used. 526.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1614 bob 20 0 5060228 37668 11568 S 4.0 0.5 6:02.94 Xorg
2214 bob 20 0 639644 28544 17288 S 3.7 0.4 0:30.20 gnome-terminal-
1895 bob -2 0 7291972 211512 64668 S 3.0 2.6 2:50.37 gnome-shell
1 root 20 0 167800 6812 3568 S 0.3 0.1 0:18.68 systemd
838 root 20 0 419244 5876 4464 S 0.3 0.1 0:01.53 NetworkManager
1733 bob 20 0 323980 7052 2484 S 0.3 0.1 0:14.62 ibus-daemon
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd
9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
10 root 20 0 0 0 0 S 0.0 0.0 0:00.21 ksoftirqd/0
11 root 20 0 0 0 0 I 0.0 0.0 0:10.40 rcu_sched
12 root rt 0 0 0 0 S 0.0 0.0 0:00.02 migration/0
13 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/0
正如您所看到的,缓冲区/缓存相当大,并且使用了一半以上的可用内存。随着我的计算机开启,该值通常会随着时间的推移而缓慢增加。最终它变得足够大,我的计算机死机了,必须进行硬重启。
到目前为止,我真正尝试过的唯一一件事就是通过添加vm.swappiness=0
到 /etc/sysctl.conf 将我的 swappiness 更改为 0,但这并没有帮助。
除了当我的缓存/缓冲区变高并且我的可用内存变低时定期重新启动之外,我还能做些什么来防止 kswapd 疯狂运行而导致这种冻结?
答案1
这可能意味着某些进程正在泄漏内存(或者只是使用了太多内存),并用垃圾填充了内存。一旦内存满了,它就会占用交换空间。磁盘速度很慢,因此对(过度使用的)内存进行过多(随机)访问会迫使系统陷入爬行状态。
查看输出size
中的进程ps(1)
,它应该指出罪魁祸首。