当 kswapd 进程开始消耗所有 CPU 时计算机锁定

当 kswapd 进程开始消耗所有 CPU 时计算机锁定

我在使用 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),它应该指出罪魁祸首。

相关内容