top 显示 kswapd0 占用了我 99.9% 的 CPU,今天玩游戏时出现了这个问题,第一次出现时 6 分钟后就消失了,现在这种情况已经持续了大约 20 分钟。如何修复这个问题?是什么原因造成的?
答案1
进程 kswapd0 是管理虚拟内存的进程。您的机器应该您的 HDD/SSD 上有 RAM、SWAP 和 EXT4。ext4 是存储所有内容的地方,访问速度总是比 RAM 慢。RAM 就像是程序快速访问信息的中途运行空间。大多数计算机至少有 4GB 的 RAM,在正常情况下这已经足够了。然而,在玩游戏时,您可能会用完 RAM 空间,这时 SWAP 就派上用场了。
SWAP 是位于 EXT4 旁边的 HDD/SSD 上的假 RAM。它的访问速度比 EXT4 更快,但比实际 RAM 慢得多。当内存不足时,kswapd0 会将您未使用或使用频率不如其他程序的程序移动到 SWAP,这会导致这些进程严重滞后。如果您的游戏需要 5GB RAM,则至少有 1GB 位于 SWAP 中。这意味着当它尝试访问该信息时,它必须等待更长时间才能获得它。
整个过程会导致 CPU 占用率极高,同时将信息从 SWAP 和 RAM 移出和移入,并处理信息请求。如何解决这个问题?
告诉 kswapd0 仅在内存完全用完时才将内容移动到 SWAP。这是解决 SWAP 问题最有效的方法。运行
echo vm.swappiness=0 | sudo tee -a /etc/sysctl.conf
0
剩余的百分比是多少,应该100
使用 SWAP(当剩余 RAM 为 0% 时,SWAP 将开始接收数据)。您也可以根据自己的喜好编辑 /etc/sysctl.conf,而不是每次都使用 gedit 或 nano 或其他方式将此命令添加到末尾,但请确保使用 sudo,此文件属于 root 所有。重新启动,您就设置好了!- 减少其他进程对 RAM 的消耗,或者在运行高内存程序时关闭其他程序。这就是为什么大多数游戏会要求您在玩游戏前关闭所有其他窗口,或者安装程序也会这样做。文件同步服务之类的东西往往会占用大量内存。
- 购买更多 RAM。安装 RAM 并不像听起来那么难。在小隔间上拧上一两颗螺丝(如果你使用的是笔记本电脑),然后轻轻一按即可。只要确保你购买的是正确的类型即可!
- 降低 CPU 的处理速度,就像降低 RAM 的处理速度一样。这将有助于使 RAM 到 SWAP 的突发事件更加平稳。
这是你能做的最好的事情。其他人可能会说完全禁用交换,但这是危险的,我不建议这样做。如果出现内存泄漏或运行的应用程序太多,这可能会导致整个系统冻结。只需意识到 SWAP 是 RAM 的故障保护。它肯定不如 RAM 快或高效,但它比 Windows 的 Pagefile 更好!(它可以实现相同的目的)
编辑:如果您有兴趣了解有关 SWAP 的更多信息,请参阅这里。
答案2
kswapd0 占用了 99.9% 的 CPU 资源,但实际上根本没有进行交换
对我来说,这种情况有时会发生在运行 VMware 虚拟机的 Ubuntu 14.04 上,内核为 3.19.0-50-generic(及更早版本)。我不知道是什么原因导致这种情况发生的,但它是在空闲时间发生的。
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
临时解决方案
重新启动暂时解决了该问题。
回答如下serverfault(当使用交换时,kswapd 通常会使用 100% 的 CPU)我的系统上有相同的设置:
# 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
作为 root 用户:
# cat /proc/sys/vm/drop_caches
0
# echo 1 > /proc/sys/vm/drop_caches
# cat /proc/sys/vm/drop_caches
1
或者,指出经过礼服赛车手(谢谢!)如果您未以 root 身份登录,请使用以下命令:
echo 1 | sudo tee /proc/sys/vm/drop_caches
现在很好:
# 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
永久的解决方案(有待找到)?
但由于实际原因尚不清楚,而且我在网上也找不到任何合适的解释,所以这不是一个永久的解决方案。实际上,所选的回答可能是永久的解决方案。我只是想添加这个以供将来参考,因为重新启动(以使 sysctl 生效)并不总是可行的。
另一个解决方案可能是将 THP 设置为madvice
或never
(参见波伊格对他的评论回答,如何修改“/sys/kernel/mm/transparent_hugepage/enabled”以及参考的 MongoDB 手册禁用透明大页面 (THP))
计划任务
我已将以下批处理设置为 cron 作业作为“永久”解决方案:
#!/bin/bash
# Rev 2: Use ps instead of top
## run as cron, thus no $PATH, thus need to define all absolute paths
cpu=$(/usr/bin/printf %.0f $(/bin/ps -o pcpu= -C kswapd0))
[[ -n $cpu ]] \
&& (( $cpu >= 90 )) \
&& echo 1 > /proc/sys/vm/drop_caches \
&& echo "$$ $0: cache dropped (kswapd0 %CPU=$cpu)" >&2 \
&& exit 1
exit 0
调用root@localhost:~# crontab -e
自
# m h dom mon dow command
* * * * * /bin/bash /path/to/batch/drop_caches.sh >> /var/log/syslog 2>&1
注意:上面的 cron 作业脚本已修改为包含弗雷德里克·埃兰德森的建议:一种更简单、更有效的方法来确定 kswapd0 的 CPU 使用率。谢谢!
答案3
更持久的解决办法是增加交换文件的大小。
当搜索不存在的交换空间时(如果您的交换分区已满),kswapd 将占用 100% 的 CPU。htop
将在屏幕顶部显示您的交换空间是否已满,或者您可以使用该free -h
命令检查已使用的交换。
在使用以下命令将交换文件的大小从 4GB 增加到 8GB 之后,kswapd 现在以 0% CPU 运行,交换量设置为 60 *。
sudo swapoff /swapfile
sudo rm /swapfile
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
这假设您已经在使用交换文件(Ubuntu 默认设置),并且/swapfile
中引用了/etc/fstab
。此外,您的交换文件可能会更大或更小,具体取决于您有多少 RAM,因此请相应地进行调整。
* 需要注意的是,我使用的是 SSD,因此磁盘性能不是问题。但是,如果内存不足,交换几乎总是一件好事。
请参阅此相关答案如果您遇到诸如交换页面过多和系统冻结之类的问题,而系统已运行一天或更长时间而没有重新启动。此问题的症状非常相似,但原因不同。因此,如果问题再次出现,您可能需要尝试此替代解决方案。
答案4
恶意软件以访客身份运行
如果您曾经启用过 Ubuntu 的访客帐户,后来又启用了 SSH,则可能会有恶意软件使用您的访客帐户运行。
sudo find /home -f kswapd0
我们发现它/home/guest/.configrc/
今天很多人在不需要swap的机器上发现这个问题,看到机器可用内存正常,却发现挖矿软件已经安装并且以guest账户运行,甚至开机自动运行。
加入任何有受感染机器的网络(会议、咖啡馆、城市),或者如果您使用类似的服务ngrok
,同时在系统上打开 SSH,则您的计算机都会暴露于这种简单的客户漏洞。
这里有一篇专门讨论这个问题的条目:kswapd0 进程占用 CPU 100%,尽管不需要交换