以前:在几年以前,计算机配置普遍偏低,对于游戏玩家来说,可能经常出现了这个问题,导致电脑直接卡死,但现在用于游戏的计算机配置一般比较高,不会出现该问题。
现在:游戏玩家可能比较少见这个问题了,但对于现在的互联网垃圾佬来说,可能变得比较常见这个问题了。对于低配置的VPS虚拟服务器来说,尤其是内存配置比较低的服务器,可能经常出现该问题。
当 kswapd0
进程 99.9%
的 CPU
时,导致系统卡死,这到底时怎么回事呢?通过上面的例子,你大概也能猜到了,简单来说那就是 内存不足!
更详细的解释请往下看:
进程 kswapd0
是管理虚拟内存的进程。您的机器应该有 RAM
、SWAP
以及 HDD/SSD
上的 EXT4
。ext4
是存储所有内容的地方,访问它总是比 RAM
慢。RAM
就像是程序快速访问信息的中途运行空间。大多数计算机至少有4GB RAM
,在正常情况下已经足够了。然而,在玩游戏时,您的 RAM
空间可能会不足,这就是 SWAP
发挥作用的地方。
SWAP
是一个假 RAM
,位于 HDD/SSD
上 EXT4
旁边。它的访问速度比 EXT4
快,但比实际 RAM
慢得多。当内存不足时,kswapd0
会将您不使用/不像其他程序那样频繁使用的程序移动到 SWAP
,这会导致这些进程出现极大的延迟。如果您的游戏需要 5GB RAM
,则至少需要 1GB
内存用于交换。这意味着当它尝试访问该信息时,必须等待更长的时间才能获取。
整个过程导致 CPU
使用率极高,在 SWAP
和 RAM
之间移动信息并同时处理信息请求。如何解决这个问题?
kswapd0
仅当 RAM
完全耗尽时才将内容移至 SWAP
。这是解决 SWAP
问题的最有效的方法。运行:
shecho vm.swappiness=0 | sudo tee -a /etc/sysctl.conf
其中
0
是应该使用SWAP
的剩余百分比100(当RAM
剩余 0% 时,SWAP
将开始接收数据)。您也可以根据自己的喜好编辑/etc/sysctl.conf
,而不是每次使用gedit
或nano
或其他任何方式都将此命令添加到其末尾,但请务必使用sudo
,该文件是root
拥有的。重新启动即可设置!
减少其他进程对 RAM
的消耗或在运行高内存程序时关闭其他程序。这就是为什么大多数游戏会告诉您在玩之前关闭所有其他窗口,或者安装也会执行相同的操作。文件同步服务之类的东西往往会占用大量内存。
购买更多内存。安装 RAM
并不像听起来那么难。小隔间上的一两个螺丝(如果您使用的是笔记本电脑),然后轻轻一按即可。只要确保您购买的是正确的类型即可!
CPU
的较低进程与 RAM
的处理非常相似。这将有助于 RAM
到 SWAP
突发的顺利进行。
这是你能做的最好的事情了。其他人可能会说完全禁用交换,但这很危险,我不建议这样做。如果存在内存泄漏或运行的应用程序过多,可能会导致整个系统冻结。只要意识到 SWAP
是 RAM
的故障保护装置即可。它绝对不如 RAM 快或高效,但它比 Window
的 Pagefile
更好!(达到同样的目的)
PS:如果您有兴趣了解有关
SWAP
的更多信息,请参阅此处。
kswapd0 以 99.9% 的 CPU 利用率运行,但实际上根本不进行交换 对我来说,这种情况有时会发生在 Ubuntu 14.04 上,内核为 3.19.0-50-generic(及更早版本),在 VMware 虚拟机中运行。我不知道是什么让它出现,但它是在空闲时间出现的。
Ubuntu
虚拟机好像比较常见这个问题,对我来说,一般是由于运行了一些占用内存较高的程序,导致内存不足,然后使 kswapd0
占用了极高的 CPU
,此时你的虚拟机可能处于极度卡断甚至卡死的状态。
bashtop - 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 -e
从 with
调用
sh# m h dom mon dow command
* * * * * /bin/bash /path/to/batch/drop_caches.sh >> /var/log/syslog 2>&1
注意:上面的 cron
作业脚本已被修改以包含 Fredrik Erlandsson
的建议:一种更简单、更有效的方法来确定 kswapd0
的 CPU
使用情况。谢谢!
建站不易,以下是一个广告,还请动动您的小拇指,点击一次以示鼓励,谢谢!
就目前的访问量,即便每个访客都点一次广告,收入也不足以支付运营成本,
如果看不到广告,可能是网络原因或被拦截了,那就算了吧。祝你生活愉快~~
本文作者:DingDangDog
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!