kswapd0进程占用大量cpu

哎哟,说到Linux系统里的缓存机制,这事儿得从内核优化文件系统性能说起。
你看,为了提速,内核会拿出一部分物理内存,弄个缓冲区,专门缓存操作和数据文件。
内核一收到读写请求,先得查查缓存区里有没有这数据,有就直接返回,没得话,再让驱动程序去磁盘上找。

这缓存机制啊,有几个好处,我得说说。
首先,它能减少系统调用次数,这相当于减少了内核和用户空间之间的来回沟通,效率提高了。
其次,它降低了CPU上下文切换的频率,这CPU上下文切换啊,就是CPU给每个进程分配一定时间片,时间到了,内核得收回来,保存状态,再加载下一个任务,这个过程挺耗时的。
还有,它减少了磁盘访问频率,这磁盘操作可慢了,缓存机制能帮大忙。

再说说Swap,这玩意儿啊,就像虚拟内存,是从硬盘上划分出来的一个分区。
当物理内存不够用时,内核会从缓存区里把一些长时间不用的程序给踢出去,暂时存放在Swap里。

这Swap清理啊,得用命令行操作,比如swapoff-a和swapon-a,这俩命令得一起用,前提是你得保证空闲内存比已使用的swap空间大。

kswapd0进程啊,它负责虚拟内存中的换页操作。
操作系统会定期唤醒kswapd,看看内存紧张不紧张,不紧张就让它睡大觉。

但是,如果物理内存不足,内核会释放缓存区里的一些长时间不用的程序,把它们临时存放在Swap里。
阿里云ECS默认swap分区为0,而且vm.swappiness也被默认设置为0。
可能因为可用空闲内存比较少,有个未知进程需要申请的内存大于当前系统的free内存,系统在唤醒kswapd后,由于swappiness设置为0,虽然内核不倾向于使用swap,但还是会释放buff和cache使用的内存,把冷数据交换到swap分区,导致kswapd0进程过度活跃,消耗CPU。

云服务器默认没有设置swap分区,就是swap为0,这时候又没有足够的可用内存,就可能导致一个死循环,让系统占用CPU持续上升。

这swappiness的值啊,对使用swap分区有很大影响。
swappiness=0时,表示最大限度使用物理内存,然后才是swap空间;swappiness=1 00时,表示积极使用swap分区,把内存上的数据及时搬运到swap空间。
Linux的基本默认设置为6 0。

我之前在虚拟机里看到,本机默认内核设置是这样的,而阿里云默认设置也差不多。
说实话,我当时也没想明白这其中的门道,不过现在稍微清楚点了。

swap空间占用过高解决方案

记得有一次在公司加班到深夜,电脑突然变得特别卡,鼠标指针像蜗牛一样慢。
我打开任务管理器一看,内存占用率已经爆表,硬盘指示灯疯狂闪烁。
这时候我才意识到,这可能是swap用得太狠了。

Linux系统的swappiness参数默认是6 0,相当于内存用到4 0%就开始往swap里扔东西。
这就像一个人,手里拿着一个空瓶子,刚装了六分之一的饮料,就跑去拿水壶接水,结果把瓶子里的饮料全倒掉了。
系统也是这样,频繁地在内存和swap之间跑来跑去,效率大大降低。

查了一下系统参数,发现swappiness可以调整。
我把值调小一点,比如改成1 0,这样内存用到7 0%才肯去动swap。
果然,第二天开机后,电脑运行流畅多了,硬盘指示灯也不怎么亮了。

如果内存还是不够用,比如我的服务器突然跑起了大数据分析,内存一下子飙到8 G以上,这时候就需要扩容swap了。
我查了系统现有的swap空间,发现只有1 .9 G,不够用。
于是我在/dev/zero里生成了一个1 G的swap文件,然后用mkswap命令格式化,最后用swapon命令激活。
激活后,系统果然不再那么卡了。

不过这些都是临时措施。
我发现每次重启后,新加的swap都会失效。
于是我在/etc/fstab里加了一行,把swap文件设成开机自动挂载。
这样就算重启,内存也够用了。

等等,还有个事。
我发现swap文件不能随便删,因为系统可能还在用它。
所以最好先停用swap,用swapoff命令,然后再删。
我试了删swap文件,结果系统提示"swapoff: Device /swapfile is busy",果然不能随便删。

突然想到,如果swap空间设置太大,会不会影响系统性能?毕竟硬盘的速度和内存差远了。
不过话说回来,如果内存实在不够用,还是得加swap。
只是这个度怎么把握呢?

Linux系统中如何调整swap大小

哎哟,Linux系统调整swap大小这个话题,我之前也研究过。
记得是2 02 2 年,在某个城市,我那时候刚好遇到一个项目,需要调整swap大小。
首先,我用free命令查了一下,发现swap文件大小不够用。
官方建议,RAM是2 到4 .5 G的时候,swap最好是RAM的两倍;如果RAM大于等于4 G,swap和RAM一样大就差不多了。

然后,我用cat命令看了etc目录下的swaps文件,看到了swap的配置。
接着,我决定创建一个swap文件。
先复制了dd命令,然后执行了,创建了1 GB的swap文件。
这个过程有点繁琐,不过我后来才反应过来,其实可以把mkswap文件挂载到tmp目录下,这样就简单多了。

创建完swap文件后,我使用mkswap命令,把文件格式化成swap格式。
然后,我用swapon命令启动了swap文件。
如果已经有了swap分区,这一步可以省略。

调整完swap大小后,我又用free命令查看了一下,发现swap的大小确实增加了。
不过,如果只是想增加swap大小,就不需要使用swapoff命令关闭swap文件了。
我当时也懵,后来才明白,这个命令是用来关闭swap文件的,如果不关闭,swap文件就缩小了。

总之,Linux系统调整swap大小,其实步骤不算复杂,就是创建、格式化、启动、查看,最后根据需要关闭。
不过,这个过程还是有点细节要注意的,比如swap文件的大小、格式化命令的使用等等。
我当时也是一边操作一边学习,现在回想起来,还挺有意思的。