kswapd0正在占用大量的CPU资源

kswapd0占用了我的CPU的99.9%,如top所示,这个问题是在玩游戏时出现的,第一次持续了6分钟后消失,现在已经持续了大约20分钟。如何解决这个问题?是什么导致了这个问题?

1这也发生在我身上的18.04版本。详细信息请参阅此处:https://askubuntu.com/questions/1118932/kswapd0-taking-100-cpu-time-on-ubuntu-18-04 - Yuvraj Jaiswal
1这主要发生在我唤醒电脑后尝试在Steam客户端上进行操作时。我的机器上有32GB的内存,安装了Kubuntu,且关闭了交换分区。真是令人费解,kswapd0居然会超负荷运行,以至于系统几乎完全冻结!!! - Lord Alveric
如果您没有使用交换空间,请使用swapoff -a来禁用它。请以超级用户身份运行该命令。 - vhs
2我最近遇到了这个问题,可能是由于一个加密矿工的原因。更多信息请参考:https://yoroi.company/research/outlaw-is-back-a-new-crypto-botnet-targets-european-organizations/。希望这能对某些人有所帮助! - krishna chaitanya
@flajann,听起来你的RAM可能快用完了。除非绝对必要,否则禁用swap几乎从来不是解决方案,因为swappiness可以防止系统冻结,除非你的swap空间用尽。 - mchid
@KrishnaChaitanyaKodur说的是实话。我在/temp/.Xsomething~/.ssh/authorized_key发现了特洛伊木马脚本的修改。这导致云服务器关机。请查看上面的链接,它对这个问题进行了严肃的分析。如果你的电脑突然开始表现奇怪,我认为你最好小心加密货币挖矿程序或病毒。 - KH Kim
请确保您的计算机没有被黑客用于挖掘比特币。请参阅https://www.reddit.com/r/valheim/comments/zltnqb/dedicated_server_hacked_for_bitcoin_mining/。 - Cesar Morillas
相关(有点类似):https://askubuntu.com/questions/33640/kworker-what-is-it-and-why-is-it-hogging-so-much-cpu - Jesse Nickles
4个回答

kswapd0是管理虚拟内存的进程。您的机器应该有RAM、SWAP和HDD/SSD上的EXT4。EXT4是存储所有内容的地方,但访问速度始终比RAM慢。RAM就像程序快速访问信息的中间运行空间。大多数计算机至少有4GB的RAM,在正常情况下足够使用。然而,在玩游戏时,您可能会出现RAM空间不足的情况,这就是SWAP的作用。
SWAP是位于EXT4旁边的虚拟RAM,它比EXT4更快访问,但比实际RAM慢得多。当内存不足时,kswapd0将您不使用或使用较少的程序移动到SWAP中,这会导致这些进程极其卡顿。如果您的游戏需要5GB RAM,至少1GB将在SWAP中。这意味着当它尝试访问该信息时,必须等待更长时间才能获取。
整个过程会导致极高的CPU使用率,同时从SWAP和RAM之间移动信息,并处理信息请求。如何解决这个问题?
告诉kswapd0只有在完全没有RAM可用时才将数据移动到SWAP。这是解决SWAP问题最有效的方法。运行以下命令: ``` echo vm.swappiness=0 | sudo tee -a /etc/sysctl.conf ``` 其中的`0`表示当RAM剩余百分比为`100`时开始使用SWAP(即当RAM剩余为0%时,SWAP将开始接收数据)。你也可以通过编辑`/etc/sysctl.conf`文件来自定义设置,而不是每次都在末尾添加该命令,可以使用gedit、nano或其他编辑器,但记得要使用sudo,因为该文件属于root所有。重新启动后,设置就生效了!
在运行高内存程序时,减少其他进程的RAM消耗或关闭其他程序。这就是为什么大多数游戏在玩之前要求关闭所有其他窗口,或者安装程序也会做同样的要求。像文件同步服务这样的程序往往会占用大量内存。
购买更多的RAM。安装RAM并不像听起来那么困难。只需打开一个小隔间上的一两颗螺丝(如果你使用的是笔记本电脑),然后简单地插入即可。只要确保购买的是正确的类型!
降低CPU的进程,就像你对RAM所做的那样。这将有助于使RAM到SWAP的传输更加顺畅。
那是你能做的最好的了。其他人可能会建议完全禁用交换空间,但那是危险的,我不推荐这样做。如果存在内存泄漏或运行过多应用程序,这可能导致整个系统冻结。只要意识到交换空间是RAM的备份措施就可以了。它绝对不如RAM快速和高效,但比Windows的页面文件要好!(它们实现了相同的目的)
编辑:如果你对交换空间感兴趣,可以在这里了解更多信息。

我已经记不清楚是什么解决了我的问题,但是我感谢你提供的详细回答,解释得非常清楚。 - Kaspar
根据您的回答,我终止了一些进程以减少交换空间的使用。现在进程 kwapd0 已经消失了。谢谢。 - mtoloo
在使用swap时,请考虑您的用例。例如,如果运行Kubernetes,官方文档要求禁用swap以确保系统管理所使用的kublet服务的正常功能。 - vhs
将swappiness更改为0并没有任何效果。即使在更改此设置并重新启动后,仍然会有时候kswapd0使用了大量的CPU资源,即使有可用的RAM并且交换文件使用了0 MB。 - Andrew Koster
1@AndrewKoster 有趣,我会确保重新启动您的系统并确保swappiness设置正确。如果您想确保永远不使用交换空间,我建议关闭您的交换分区/文件。由于您的问题可能与此处所问的问题不同(考虑到这个问题最初是在8年前提出的),您应该提出自己的问题,并附上一些关于您遇到的问题的内存统计数据。 - AlwaysTalkingAboutMyDog
1@AndrewKoster那是因为swappiness并没有禁用交换,它决定内核在提前进行交换(在RAM用完之前将数据交换到虚拟内存)时的侵略性程度。将其设置为零意味着在RAM用尽之前不会尝试进行交换。一些进程总是会分配虚拟内存(特别是Java进程)。禁用交换的最佳方式是使用swapoff -a命令。 - Coder Guy
在大多数使用情况下(我想说绝大多数,但谁知道呢...),允许交换只会带来麻烦。就像我见过的因为用户或服务行为不当而导致服务器崩溃一样。如果没有交换,调度程序会首先杀死有问题的进程,至少在我的经验中是这样的。一旦一个长时间运行的进程激活了交换性能,服务器就会变得无响应,并且需要亲自处理。然而,交换分区本身对于休眠是有用的。 - dawid
@dawid 对于典型的桌面用户来说,如果他们的RAM不足,交换空间可以提高系统的性能。这取决于具体情况,但是这个问题提供了一些相关信息:https://askubuntu.com/questions/291378/do-we-still-need-swap-partitions-on-desktops请记住,这个问题是针对在Ubuntu桌面上进行游戏的背景下提出的,并非管理Ubuntu服务器。交换空间的概念仍然相同,但是交换空间的有用性取决于您的具体情况。还有比依赖OOM killer(例如cgroups)更好的限制内存使用的方法。 - AlwaysTalkingAboutMyDog
我已经给你的答案点了赞,但是它有一些缺陷。Swappiness现在是0到200,而不是0到100(参见我的答案,直接引用自Linux内核源代码),而且你引用的where 0 is the percent left out of 100 at which SWAP should be used (when you have 0% RAM left, SWAP will start taking in data).是错误的。 - Gabriel Staples
@GabrielStaples 从历史上看,就像你提到的那样,它一直是100。你可以考虑修改Ubuntu的社区维基(https://help.ubuntu.com/community/SwapFaq)。我想知道为什么他们将它改成了200,同时保持默认值为60...这似乎很不寻常,因为它会破坏/改变行为。 - AlwaysTalkingAboutMyDog
不需要重新启动,可以使用sudo sysctl -w vm.swappiness=10命令,并通过sysctl.conf文件使其持久化。 - Donn Lee

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经常使用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

解决方案实际上是以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

或者,正如指出theTuxRacer(谢谢!),如果您没有以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设置为madvicenever(请参见poige的评论和他的答案如何修改“/sys/kernel/mm/transparent_hugepage/enabled”以及MongoDB手册中关于禁用透明大页面(THP)的引用)

cron job

我已经将以下批处理设置为一个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作业脚本已经进行了修改,包括Fredrik Erlandsson建议:一种更简单和更高效的方法来确定kswapd0的CPU使用情况。谢谢!


非常好的答案,谢谢。RPi内核已经更新,这就是我得到的结果,疯狂的kswap。 - Paul B
感谢你,@PaulB。我在我的回答中添加了我在我的系统上使用的cron job,作为一个永久的解决方案。 - Martin Rüegg
正如@Veger所指出的那样,这在16.04上也适用。因为我目前正在使用它。所以我添加了标签。谢谢! - Martin Rüegg
再次感谢,@Veger!- 我已经在脚本的Sha-Bang中纠正了缺失的感叹号。 - Martin Rüegg
2"echo 1 > /proc/sys/vm/drop_caches" 对我来说解决了高CPU使用率的问题,效果明显!kswapd0的CPU占用从100%降到了0%。能够提供一个原因解释和永久解决方案将会非常好。(顺便说一下:我正在运行Linux内核4.8.0-36-generic,拥有16GB内存和16GB交换空间。) - josephdpurcell
josephdpurcell,感谢您的评论。我不知道原因,我的永久解决方案是按照答案中所示运行 cron 作业。希望可以帮到您。 - Martin Rüegg
这个解决方案对于今天(2017年)的UBUNTU 16 LTS有效吗?这不是一个内核错误吗?还有这个其他解决方案,应该忽略吗? - Peter Krauss
2我建议将 (( $cpu >= 90 )) \ 更改为 (( $(printf %.0f \/bin/ps -o pcpu= -C kswapd0`) >= 90 )) \ ` 并删除上面的所有内容。 - Fredrik Erlandsson
2@PeterKrauss,现在我正在运行Ubuntu 18.04.4 LTS(GNU/Linux 4.15.0-74-generic x86_64)和20.04 LTS(GNU/Linux 5.4.0-21-generic x86_64),我再也没有遇到这个问题,并且也没有运行这个答案中提到的cron job。 - Martin Rüegg
1如果您没有以root身份登录,并且终端运行缓慢,可以执行以下命令:echo 1 | sudo tee /proc/sys/vm/drop_caches - theTuxRacer

一个更持久的解决方案是增加交换文件的大小
当搜索不存在的交换空间时(如果您的交换分区已满),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

单击此处以获取这些命令的更详细说明

假设您已经在使用交换文件(默认Ubuntu设置),并且/swapfile/etc/fstab中被引用。此外,您的交换文件的大小可能会根据您的RAM而有所不同,因此请相应地进行调整。

* 需要注意的是我使用的是SSD,所以磁盘性能不是问题。然而,如果您的RAM不足,交换空间几乎总是一个好选择。


如果你的系统在运行了一天或更长时间后出现过多的交换分页和系统冻结等问题,可以参考查看这个相关答案。这个问题有非常相似的症状,但是原因不同。因此,如果问题再次出现,你可能需要尝试这个替代解决方案。

2kswapd在搜索不存在的交换空间时将占用100%的CPU”:确实,例如当您的交换分区未挂载时!^^" - Skippy le Grand Gourou

作为访客运行的恶意软件

如果您曾经启用过Ubuntu的访客账户,并且后来启用了SSH,那么可能会有恶意软件在使用您的访客账户运行。

sudo find /home -f kswapd0

我们一直在/home/guest/.configrc/下找到它。

许多人今天在不需要交换的机器上遇到了这个问题,他们发现可用内存正常,却发现挖矿软件已经安装并在guest账户下运行,甚至在启动时自动运行。

加入任何一个存在受损机器的网络(会议、咖啡馆、城市),或者如果您使用像ngrok这样的服务,同时在您的系统上开放SSH,都会使您的计算机暴露于这种简单的guest漏洞。

关于这个问题的详细信息请参考:CPU 100% with kswapd0 process, although no swap is needed


1这也发生在我身上,但是它发生在我托管的云服务器上。你可以在这里找到有关此恶意软件的更多信息:https://yoroi.company/research/outlaw-is-back-a-new-crypto-botnet-targets-european-organizations/ 我还找到了一篇有关如何移除它的简短文章:https://nitifilter.com/en/ive-been-hacked/ - SapuSeven