kswapd0占用100%CPU
## 简介 > 原帖:[stackoverflow: kswapd0-is-taking-a-lot
渲染中...
## 简介
> 原帖:[stackoverflow: kswapd0-is-taking-a-lot-of-cpu](https://askubuntu.com/questions/259739/kswapd0-is-taking-a-lot-of-cpu)
- 以前:在几年以前,计算机配置普遍偏低,对于游戏玩家来说,可能经常出现了这个问题,导致电脑直接卡死,但现在用于游戏的计算机配置一般比较高,不会出现该问题。
- 现在:游戏玩家可能比较少见这个问题了,但对于现在的互联网垃圾佬来说,可能变得比较常见这个问题了。对于低配置的VPS虚拟服务器来说,尤其是内存配置比较低的服务器,可能经常出现该问题。
当 `kswapd0` 进程 `99.9%` 的 `CPU` 时,导致系统卡死,这到底时怎么回事呢?通过上面的例子,你大概也能猜到了,简单来说那就是 **内存不足!**
更详细的解释请往下看:
<!-- more -->
## 详解
进程 `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` 内存用于交换。这意味着当它尝试访问该信息时,必须等待更长的时间才能获取。
<!-- 文章内嵌广告位 -->
<div class="article-ads"></div>
## 如何解决?
整个过程导致 `CPU` 使用率极高,在 `SWAP` 和 `RAM` 之间移动信息并同时处理信息请求。如何解决这个问题?
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`,而不是每次使用 `gedit` 或 `nano` 或其他任何方式都将此命令添加到其末尾,但请务必使用 `sudo`,该文件是 `root` 拥有的。重新启动即可设置!
2. 减少其他进程对 `RAM` 的消耗或在运行高内存程序时关闭其他程序。这就是为什么大多数游戏会告诉您在玩之前关闭所有其他窗口,或者安装也会执行相同的操作。文件同步服务之类的东西往往会占用大量内存。
3. 购买更多内存。安装 `RAM` 并不像听起来那么难。小隔间上的一两个螺丝(如果您使用的是笔记本电脑),然后轻轻一按即可。只要确保您购买的是正确的类型即可!
4. `CPU` 的较低进程与 `RAM` 的处理非常相似。这将有助于 `RAM` 到 `SWAP` 突发的顺利进行。
这是你能做的最好的事情了。其他人可能会说完全禁用交换,但这很危险,我不建议这样做。如果存在内存泄漏或运行的应用程序过多,可能会导致整个系统冻结。只要意识到 `SWAP` 是 `RAM` 的故障保护装置即可。它绝对不如 RAM 快或高效,但它比 `Window` 的 `Pagefile` 更好!(达到同样的目的)
> PS:如果您有兴趣了解有关 `SWAP` 的更多信息,请[参阅此处](https://help.ubuntu.com/community/SwapFaq#What_is_swappiness_and_how_do_I_change_it.3F)。
kswapd0 以 99.9% 的 CPU 利用率运行,但实际上根本不进行交换
对我来说,这种情况有时会发生在 Ubuntu 14.04 上,内核为 3.19.0-50-generic(及更早版本),在 VMware 虚拟机中运行。我不知道是什么让它出现,但它是在空闲时间出现的。
<!-- 文章内嵌广告位 -->
<div class="article-ads"></div>
## 虚拟机案例
`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
```
<!-- 文章内嵌广告位 -->
<div class="article-ads"></div>
### 永久解决方案(待找到)?
但由于实际原因尚不清楚,而且我在网上也没有找到任何合适的解释,所以这不是一个永久的解决方案。事实上,所选择的答案可能是永久的解决方案。我只是想添加此内容以供将来参考,因为重新启动肯定不是最好的解决方案。
另一种解决方案可能是将 `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` 使用情况。谢谢!
## 赞助请求
**建站不易,以下是一个广告,还请动动您的小拇指,点击一次以示鼓励,谢谢!**
<!-- 文章内嵌广告位 -->
<div class="article-ads"></div>
> 就目前的访问量,即便每个访客都点一次广告,收入也不足以支付运营成本,`如果看不到广告,可能是网络原因或被拦截了,那就算了吧。祝你生活愉快~~`END
评论
登录后查看和发表评论
前往登录