2024-01-21
温故知新
00
请注意,本文编写于 304 天前,最后修改于 239 天前,其中某些信息可能已经过时。

目录

简介
详解
如何解决?
虚拟机案例
top指令显示
临时解决方案
永久解决方案(待找到)?
计划任务
赞助请求

简介

原帖:stackoverflow: kswapd0-is-taking-a-lot-of-cpu

  • 以前:在几年以前,计算机配置普遍偏低,对于游戏玩家来说,可能经常出现了这个问题,导致电脑直接卡死,但现在用于游戏的计算机配置一般比较高,不会出现该问题。

  • 现在:游戏玩家可能比较少见这个问题了,但对于现在的互联网垃圾佬来说,可能变得比较常见这个问题了。对于低配置的VPS虚拟服务器来说,尤其是内存配置比较低的服务器,可能经常出现该问题。

kswapd0 进程 99.9%CPU 时,导致系统卡死,这到底时怎么回事呢?通过上面的例子,你大概也能猜到了,简单来说那就是 内存不足!

更详细的解释请往下看:

详解

进程 kswapd0 是管理虚拟内存的进程。您的机器应该有 RAMSWAP 以及 HDD/SSD 上的 EXT4ext4 是存储所有内容的地方,访问它总是比 RAM 慢。RAM 就像是程序快速访问信息的中途运行空间。大多数计算机至少有4GB RAM,在正常情况下已经足够了。然而,在玩游戏时,您的 RAM 空间可能会不足,这就是 SWAP 发挥作用的地方。

SWAP 是一个假 RAM,位于 HDD/SSDEXT4 旁边。它的访问速度比 EXT4 快,但比实际 RAM 慢得多。当内存不足时,kswapd0 会将您不使用/不像其他程序那样频繁使用的程序移动到 SWAP,这会导致这些进程出现极大的延迟。如果您的游戏需要 5GB RAM,则至少需要 1GB 内存用于交换。这意味着当它尝试访问该信息时,必须等待更长的时间才能获取。

如何解决?

整个过程导致 CPU 使用率极高,在 SWAPRAM 之间移动信息并同时处理信息请求。如何解决这个问题?

  1. 告诉 kswapd0 仅当 RAM 完全耗尽时才将内容移至 SWAP。这是解决 SWAP 问题的最有效的方法。运行:
sh
echo vm.swappiness=0 | sudo tee -a /etc/sysctl.conf

其中0是应该使用 SWAP 的剩余百分比100(当 RAM 剩余 0% 时,SWAP 将开始接收数据)。您也可以根据自己的喜好编辑 /etc/sysctl.conf,而不是每次使用 geditnano 或其他任何方式都将此命令添加到其末尾,但请务必使用 sudo,该文件是 root 拥有的。重新启动即可设置!

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

  2. 购买更多内存。安装 RAM 并不像听起来那么难。小隔间上的一两个螺丝(如果您使用的是笔记本电脑),然后轻轻一按即可。只要确保您购买的是正确的类型即可!

  3. CPU 的较低进程与 RAM 的处理非常相似。这将有助于 RAMSWAP 突发的顺利进行。

这是你能做的最好的事情了。其他人可能会说完全禁用交换,但这很危险,我不建议这样做。如果存在内存泄漏或运行的应用程序过多,可能会导致整个系统冻结。只要意识到 SWAPRAM 的故障保护装置即可。它绝对不如 RAM 快或高效,但它比 WindowPagefile 更好!(达到同样的目的)

PS:如果您有兴趣了解有关 SWAP 的更多信息,请参阅此处

kswapd0 以 99.9% 的 CPU 利用率运行,但实际上根本不进行交换 对我来说,这种情况有时会发生在 Ubuntu 14.04 上,内核为 3.19.0-50-generic(及更早版本),在 VMware 虚拟机中运行。我不知道是什么让它出现,但它是在空闲时间出现的。

虚拟机案例

Ubuntu 虚拟机好像比较常见这个问题,对我来说,一般是由于运行了一些占用内存较高的程序,导致内存不足,然后使 kswapd0 占用了极高的 CPU,此时你的虚拟机可能处于极度卡断甚至卡死的状态。

top指令显示

bash
top - 12:32:49 up 1:07, 2 users, load average: 37.44, 34.58, 23.84 Tasks: 131 total, 1 running, 129 sleeping, 1 stopped, 0 zombie %Cpu(s): 0.1 us, 92.7 sy, 0.0 ni, 0.0 id, 6.7 wa, 0.0 hi, 0.4 si, 0.1 st MiB Mem : 949.7 total, 63.8 free, 822.6 used, 63.4 buff/cache MiB Swap: 0.0 total, 0.0 free, 0.0 used. 17.3 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 42 root 20 0 0 0 0 S 99.9 0.0 10:33.85 kswapd0 1662 root 20 0 51.9g 318704 128 D 1.1 32.8 0:40.20 node 2418 root 20 0 926288 226560 128 S 0.9 23.3 0:06.01 esbuild

临时解决方案

重新启动虚拟机(服务器)可以暂时解决问题。当然希望你没有设置那个很吃内存的程序开机自启。。。否则你就要赶在服务器卡死之前连上并停止那个程序了。。。

最简单的方法时直接在云服务商控制台重启虚拟机。

按照 serverfault 上的答案(当使用交换时,kswapd 通常使用 100% CPU),我的系统上有相同的设置:

sh
# 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 用户身份运行:

sh
# 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

永久解决方案(待找到)?

但由于实际原因尚不清楚,而且我在网上也没有找到任何合适的解释,所以这不是一个永久的解决方案。事实上,所选择的答案可能是永久的解决方案。我只是想添加此内容以供将来参考,因为重新启动肯定不是最好的解决方案。

另一种解决方案可能是将 THP 设置为 或 madvice(never请参阅poige对他的答案的评论,How do I edit “/sys/kernel/mm/transparent_hugepage/enabled” 以及引用的关于禁用透明大页 (THP) 的MongoDB 手册)

计划任务

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

sh
#!/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 -ewith 调用

sh
# m h dom mon dow command * * * * * /bin/bash /path/to/batch/drop_caches.sh >> /var/log/syslog 2>&1

注意:上面的 cron 作业脚本已被修改以包含 Fredrik Erlandsson 的建议:一种更简单、更有效的方法来确定 kswapd0CPU 使用情况。谢谢!

赞助请求

建站不易,以下是一个广告,还请动动您的小拇指,点击一次以示鼓励,谢谢!

就目前的访问量,即便每个访客都点一次广告,收入也不足以支付运营成本,如果看不到广告,可能是网络原因或被拦截了,那就算了吧。祝你生活愉快~~

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:DingDangDog

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!