问题描述
kswapd0 占用了我 99.9% 的 CPU,正如上面显示的那样,问题出现在今天玩游戏时,第一次它在 6 分钟后消失,现在它已经持续了大约 20 分钟。这是如何解决的,是什么原因造成的?
最佳方法
进程kswapd0是管理虚拟内存的进程。您的机器应该有 RAM、SWAP 和 HDD/SSD 上的 EXT4。 ext4 是存储所有内容的地方,访问它总是比 RAM 慢。 RAM 就像一个 half-way 运行空间,供程序快速访问信息。大多数计算机至少有 4GB 的 RAM,这在正常情况下足够了。但是,在玩游戏时,RAM 空间可能不足,这就是 SWAP 的用武之地。
SWAP 是位于 EXT4 旁边的 HDD/SSD 上的假 RAM。它比 EXT4 访问速度更快,但比实际 RAM 慢得多。当您的内存不足时,kswapd0 会将您不使用/不使用的程序移动到 SWAP,这会导致这些进程出现极度滞后。如果您的游戏需要 5GB 内存,则 SWAP 中至少需要 1GB。这意味着当它试图访问该信息时,它必须等待更长的时间才能获得它。
整个过程会导致 CPU 使用率过高,同时将信息从 SWAP 和 RAM 移入和移入,并同时处理信息请求。如何解决这个问题?
-
告诉 kswapd0 只有当你完全没有 RAM 时才将东西移动到 SWAP。这是解决 SWAP 问题的最有效的方法。运行 \n
echo vm.swappiness=0 | sudo tee -a /etc/sysctl.conf
\n,其中0
是100
中应该使用 SWAP 的百分比(当剩余 0% RAM 时,SWAP 将开始接收数据)。您也可以根据自己的喜好编辑 /etc/sysctl.conf 而不是每次使用 gedit 或 nano 或其他任何东西都将此命令添加到它的末尾,但是一定要 sudo,这个文件是 root 拥有的。重新启动,你就设置好了! -
减少其他进程对 RAM 的消耗或在运行高内存程序时关闭其他程序。这就是为什么大多数游戏会告诉您在玩之前关闭所有其他窗口,或者安装程序也会这样做。文件同步服务之类的东西往往会占用大量内存。
-
购买更多内存。安装 RAM 并不像听起来那么难。一个小隔间上的一个或两个螺丝(如果您使用的是笔记本电脑),然后简单地点击一下。只要确保您购买的是正确的种类!
-
像处理 RAM 一样降低 CPU 的进程。这将帮助那些 RAM 到 SWAP 突发更加平滑。
那是你能做的最好的。其他人可能会说完全禁用交换,但那很危险,我不建议这样做。如果存在内存泄漏或运行的应用程序太多,这可能会导致整个系统死机。只需意识到 SWAP 是 RAM 的故障保险。它绝对不如 RAM 快或高效,但它比 Window 的 Pagefile 好! (达到同样的目的)
编辑:如果您有兴趣了解有关 SWAP 的更多信息,请参阅 here 。
次佳方法
kswapd0 以一个 CPU 的 99.9% 运行,但实际上根本没有交换
对我来说,它有时会发生在 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
临时解决方案
重新启动解决了问题 – 暂时。
按照 serverfault (kswapd often uses 100% CPU when swap is in use) 上的答案,我的系统上有相同的设置:
# cat /proc/sys/vm/swappiness
60
# cat /proc/sys/vm/vfs_cache_pressure
100
# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
该解决方案实际上是以 root 用户身份运行 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
或者,作为 pointed out by theTuxRacer(谢谢!),如果您未以根用户身份登录,请使用以下命令:
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
永久解决方案(有待发现)?
但由于目前还不知道真正的原因,而且我在网上也没有找到合适的解释,所以这不是长久之计。实际上,选择的 answer 可能是永久性的解决方案。我只是想添加这个以供将来参考,因为重启(使 sysctl 生效)并不总是可能的。
另一种解决方案可能是将 THP 设置为 madvice
或 never
(请参阅 poige’s 对他的 answer 、 How do I modify \u201c/sys/kernel/mm/transparent_hugepage/enabled\u201d 的评论以及 Disable Transparent Huge Pages (THP) 上引用的 MongoDB 手册)
定时作业
我已经将以下批次设置为 cron 作业作为 “permanent” 解决方案:
#!/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 作业脚本已经过调整以包括 Fredrik Erlandsson 的 suggestion:一种确定 kswapd0 的 CPU 使用率的更简单、更有效的方法。谢谢!
第三种方法
更永久的解决方案是 increase the size of your swap file 。
kswapd 在搜索不存在的交换空间时会占用 100% 的 CPU(如果你的交换分区已满)。 htop
将在屏幕顶部显示交换空间是否已满,或者您可以使用 free -h
命令检查已用交换空间。
使用以下命令将我的交换文件的大小从 4GB 增加到 8GB 后,kswapd 现在以 0% CPU 运行,swappiness 设置为 60*。
sudo swapoff /swapfile
sudo rm /swapfile
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Click here for a more detailed description of these commands
这假设您已经在使用交换文件(默认 Ubuntu 设置)并且 /swapfile
在 /etc/fstab
中被引用。此外,您的交换文件可能会更大或更小,具体取决于您有多少 RAM,因此请相应地进行调整。
* 请注意,我使用的是 SSD,因此磁盘性能不是问题。但是,如果内存不足,交换几乎总是一件好事。