酷徒LOGO

内核kswapd0正在占用大量 cpu


问题

kswapd0占用了我99.9%的CPU ,该问题今天在游戏中出现,并且在6分钟后消失,现在已经运行了20分钟左右,这是什么原因?


答案1

进程kswapd0是管理虚拟内存的进程。大多数计算机至少有4GB内存,在正常情况下足够,但是在玩游戏时,内存空间可能不足,这时需要使用SWAP。

SWAP是一个假内存,使用硬盘或固态硬盘替代内存,访问速度比EXT4分区快,但是它比实际内存要慢得多,当您的内存不足时,kswapd0将您未使用的程序移至SWAP,这会导致这些进程卡滞。如果你的游戏需要5GB 内存,那么有1GB会在SWAP。

如何解决这个问题?

告诉kswapd0仅在内存完全不够时,才将内容移动到SWAP。这是解决交换问题最有效的方法。运行

echo vm.swappiness=0 | sudo tee -a /etc/sysctl.conf

其中,0100中保留的百分比,应该使用交换(剩下0%内存时,交换区将开始接收数据),你也可以按自己的喜好编辑/etc/sysctl.conf ,而不必每次使用gedit或nano添加到命令末尾,然后然后重新启动!

购买更多内存,安装内存并不那么难,一两个螺丝在一个小隔间(如果你在笔记本上)和一个简单的点击,一定要确保你买的是正确的!

这是你最好的选择,其他人说完全禁用swap,但是这是危险的,我不建议。如果存在内存泄漏或运行过多的应用程序,则可能导致整个系统死机。


答案2

kswapd0占据99.9%的CPU,但实际上根本不交换数据

对我来说,它发生在Ubuntu 14.04上,内核3.19.0 -50-generic (更早)在VMware中运行,

top显示:


# top


top - 09:49:35 up 5 days, 18:35, 1 user, load average: 1.00, 1.00, 0.99


Tasks: 219 total, 2 running, 217 sleeping, 0 stopped, 0 zombie


%Cpu(s): 0.0 us, 25.0 sy, 0.0 ni, 74.7 id, 0.2 wa, 0.0 hi, 0.1 si, 0.0 st


KiB Mem: 3028784 total, 1874468 used, 1154316 free, 1010276 buffers


KiB Swap: 15624188 total, 3032 used, 15621156 free. 234928 cached Mem



 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND


 52 root 20 0 0 0 0 R 99.7 0.0 122:15.21 kswapd0


 3 root 20 0 0 0 0 S 0.3 0.0 0:29.86 ksoftirqd/0


 7 root 20 0 0 0 0 S 0.3 0.0 9:49.47 rcu_sched



临时解决方案


# cat /proc/sys/vm/swappiness


60


# cat /proc/sys/vm/vfs_cache_pressure


100


# cat /sys/kernel/mm/transparent_hugepage/enabled


[always] madvise never



解决方案实际上是# echo 1 > /proc/sys/vm/drop_caches


# cat /proc/sys/vm/drop_caches


0


# echo 1 > /proc/sys/vm/drop_caches


# cat /proc/sys/vm/drop_caches


1



现在可以了:


# top


top - 10:08:58 up 5 days, 18:55, 1 user, load average: 0.72, 0.95, 0.98


Tasks: 220 total, 1 running, 219 sleeping, 0 stopped, 0 zombie


%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st


KiB Mem: 3028784 total, 681704 used, 2347080 free, 2916 buffers


KiB Swap: 15624188 total, 3032 used, 15621156 free. 81924 cached Mem



 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND


 9 root 20 0 0 0 0 S 0.3 0.0 14:10.40 rcuos/0


 1 root 20 0 45652 8124 2888 S 0.0 0.3 1:54.98 init



永久解决方案

另一个解决方案是将THP设置为madvicenever

cron作业

我已经将以下批处理设置为cron作业作为"永久"解决方案:


#!/bin/bash



## run as cron, thus no $PATH, thus need to define all absolute paths


top=/usr/bin/top


grep=/bin/grep



top=$($top -bn1 -o %CPU -u0 | $grep -m2 -E"%CPU|kswapd0")



IFS='


'


set -f



i=0



for line in $top


do


 #echo $i $line



 if ! (( i++ ))


 then


 pos=${line%%%CPU*}


 pos=${#pos}


 #echo $pos


 else


 cpu=${line:(($pos-1)):3}


 cpu=${cpu// /}


 #echo $cpu


 fi



done



[[ -n $cpu ]] && 


(( $cpu >= 90 )) 


&& echo 1 > /proc/sys/vm/drop_caches 


&& echo"$$ $0: cache dropped (kswapd0 %CPU=$cpu)" >&2 


&& exit 1



exit 0



调用方式


# m h dom mon dow command


 * * * * * /bin/bash /path/to/batch/drop_caches.sh >> /var/log/syslog 2>&1








Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备17041772号-2  |  如果智培  |  酷兔英语  |  帮酷