Linux设置大内存页解决kswapd0进程过渡消耗CPU的问题

这里写图片描述

    kswapd0进程的作用:它是虚拟内存管理中,负责换页的,操作系统每过一定时间就会唤醒kswapd ,看看内存是否紧张,如果不紧张,则睡眠,在 kswapd 中,有2 个阀值,pages_hige 和 pages_low,当空闲内存页的数量低于 pages_low 的时候,kswapd进程就会扫描内存并且每次释放出32 个free pages,直到 free page 的数量到达pages_high。通过阻止kswapd0进程过渡活跃地消耗CPU的方法是设置大页内存。

一、检查共享内存,查看是否有 locked 的情况

[root@iZ23hh6yk41Z ~]#  ipcs -m

二、检查物理内存是否有空闲,以及swap使用情况

[root@iZ23hh6yk41Z ~]#  free -m
[root@iZ23hh6yk41Z ~]# vmstat -s | grep -i page

这里写图片描述

三、为避免kswapd0进程进行的无谓扫描,来检测是否有能被swap out的页,按照如下步骤启用大内存页(大内存页好处是永远不会被swap out)

1、设定/etc/security/limits.conf

[root@iZ23hh6yk41Z ~]# cat >> /etc/security/limits.conf < END
*   soft   memlock    unlimited
*   hard   memlock    unlimited
END

[root@iZ23hh6yk41Z ~]# ulimit -Hl
unlimited
[root@iZ23hh6yk41Z ~]# ulimit -Sl
unlimited      

2、设置大内存页,计算大内存页的数量,注意执行这一步的时候必须保证实例至少启动到nomount状态

[root@iZ23hh6yk41Z ~]#  ipcs -m
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 1402961920 root       600        524288     17         dest         
0x68013082 993165313  zabbix     600        16777216   29           locked         
0x68011f60 1529741314 zabbix     600        1560281088   29         locked         
0x48013082 993198083  zabbix     600        4194304    29           locked         

[root@iZ23hh6yk41Z ~]#  cat /proc/meminfo | grep Hugepagesize
Hugepagesize:       2048 kB

最终需要的hugepages=(16777216/2048/1024+1)+(1560281088/2048/1024+1)+(4194304/2048/1024+1)=757

[root@iZ23hh6yk41Z ~]# echo "vm.nr_hugepages=757" >> /etc/sysctl.conf

[root@iZ23hh6yk41Z ~]# sysctl -p

[root@iZ23hh6yk41Z ~]# sysctl -n vm.nr_hugepages
757

[root@iZ23hh6yk41Z ~]# grep HugePages /proc/meminfo
AnonHugePages:     45056 kB
HugePages_Total:     757
HugePages_Free:      757
HugePages_Rsvd:        0
HugePages_Surp:        0

[root@iZ23hh6yk41Z ~]# ipcs -m    #重新检查共享内存,发现locked已经没有了

[root@iZ23hh6yk41Z ~]#  grep HugePages /proc/meminfo
AnonHugePages:     75776 kB
HugePages_Total:     757
HugePages_Free:      624  
HugePages_Rsvd:      621
HugePages_Surp:        0

备注:Free < Total,说明已经有huge page被使用了


扩展

问题:events/0 大量消耗CPU

中断的底半部机制有三种:软中断、tasklet和工作队列。其中软中断很少使用,内核中只有网络在使用,它的延时是最小的。

tasklet是软中断的一个应用,所有线程注册的tasklet都会顺序被执行。因此tasklet的执行环境是软中断上下文,所以不能阻塞或者睡眠。一般情况下,tasklet的延迟也很小,可以满足大部分需求。

要是底半部中可能睡眠,那么只好使用工作队列了。工作队列其实是把要做的底半部的函数交给内核的专门线程去调用。这样工作队列就运行于线程环境了,不怕睡眠。当然,睡眠会影响注册到同一线程的其它底半部的执行,但不会引起大的问题。每个CPU都有一个线程(events/n,n是编号)负责执行工作队列,第一个CPU的线程是events/0,如果是双核的,还会有一个events/1线程。程序使用了工作队列,所以每次执行都会多出一个events/0(第一个CPU上工作线程)。

内核的软中断辅助处理线程ksoftirqd/n(n是CPU编号),它们负责出发软中断中触发的软中断。它们将重新触发软中断放在系统空闲时调用,而不是马上。这样用户空间不至于饥饿,重新触发的软中断也得以尽快执行。

物理内存不足,引起 swap 频繁。其实这也是 VPS 使用上的一个常见的问题了,通常是由 Apache/Nginx 占用内存过多引起的。kswapd0 是系统的虚拟内存管理程序,如果物理内存不够用,系统就会唤醒 kswapd0 进程,由 kswapd0 分配磁盘交换空间作缓存,因而占用大量的 CPU 资源。重启Apache/Nginx,释放内存,问题就会消失。但这不是长久之计,最好的方法还是花点钱升级下内存。

  • 2
    点赞
  • 12
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:程序猿惹谁了 设计师:我叫白小胖 返回首页
评论 2

打赏作者

7*24 工作者

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值