当前位置: 首页>>技术教程>>正文


kernel – kswapd0 正在占用大量 CPU

,

问题描述

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 移入和移入,并同时处理信息请求。如何解决这个问题?

  1. 告诉 kswapd0 只有当你完全没有 RAM 时才将东西移动到 SWAP。这是解决 SWAP 问题的最有效的方法。运行 \n echo vm.swappiness=0 | sudo tee -a /etc/sysctl.conf \n,其中 0100 中应该使用 SWAP 的百分比(当剩余 0% RAM 时,SWAP 将开始接收数据)。您也可以根据自己的喜好编辑 /etc/sysctl.conf 而不是每次使用 gedit 或 nano 或其他任何东西都将此命令添加到它的末尾,但是一定要 sudo,这个文件是 root 拥有的。重新启动,你就设置好了!

  2. 减少其他进程对 RAM 的消耗或在运行高内存程序时关闭其他程序。这就是为什么大多数游戏会告诉您在玩之前关闭所有其他窗口,或者安装程序也会这样做。文件同步服务之类的东西往往会占用大量内存。

  3. 购买更多内存。安装 RAM 并不像听起来那么难。一个小隔间上的一个或两个螺丝(如果您使用的是笔记本电脑),然后简单地点击一下。只要确保您购买的是正确的种类!

  4. 像处理 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 设置为 madvicenever(请参阅 poige’s 对他的 answerHow 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 Erlandssonsuggestion:一种确定 kswapd0 的 CPU 使用率的更简单、更有效的方法。谢谢!

16.04 14.04 swap

第三种方法

更永久的解决方案是 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,因此磁盘性能不是问题。但是,如果内存不足,交换几乎总是一件好事。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13373.html,未经允许,请勿转载。