Linux性能优化实战 19-20:内存回收与swap

一、内存回收的两种方式

1. 在内存资源紧张时,Linux 通过直接内存回收和定期扫描的方式,来释放 文件页 和 匿名页

2. 文件页的回收:直接清空,或者把脏数据写回磁盘后再释放。

    缓存和缓冲区(前面说的buffer和cache的综合),就属于可回收内存,通常被叫做文件页

3. 匿名页的回收:通过 Swap 换出到磁盘中,下次访问时,再从磁盘换入到内存中。

    应用程序动态分配的堆内存,被叫做匿名页。

 

二、swap机制

1. 有一个专门的内核线程用来定期回收内存,也就是kswapd0。

    kswapd0 定义了三个内存阈值,如下图:

Linux性能优化实战 19-20:内存回收与swap

    低于pages_min:进程可用内存都耗尽了,只有内核才可以分配内存。

    高于上面但  低于pages_low:kswapd0 会执行内存回收,直到剩余内存大于高阈值为止。

    高于pages_low: 可以满足新内存请求,无需处理

2. NUMA架构与Swap

(1)  为什么剩余内存还多,但仍然存在swap?

      因为NUMA 架构下,多个处理器被划分到不同 Node 上,且每个 Node 都拥有自己的本地内存空间。

      分析内存的使用时,应该针对每个 Node 单独分析。

(2) 可以通过/proc/zoneinfo 来查看前面提到的三个内存阈值(pages_min、pages_low和pages_hight)

Linux性能优化实战 19-20:内存回收与swap

    内存的管理机制同上面1。

3. 关闭和打开swap

swapoff -a && swapon -a

 

三、swappiness: 选择文件页回收还是匿名页回收

1. Linux 提供了一个 /proc/sys/vm/swappiness 选项,用来调整使用 Swap 的积极程度。

2. swappiness 的范围是 0-100,数值越大,越积极使用 Swap。

3. 就算swappiness 设置成 0,但当剩余内存 + 文件页小于页高阈值时,还是会发生Swap

4. 可以设置 /proc/sys/vm/min_free_kbytes ,来调整系统定期回收内存的阈值。

 

四、swap高时的查看方法

用 sar、/proc/zoneinfo、/proc/pid/status 等方法,查看系统和进程的内存使用情况,进而找出导致 Swap 升高的进程。

1. sar

Linux性能优化实战 19-20:内存回收与swap

2. /proc/zoneinfo

Linux性能优化实战 19-20:内存回收与swap

3. /proc/pid/status

Linux性能优化实战 19-20:内存回收与swap

 

五、降低 Swap 的使用,可以提高系统的整体性能

1. 禁止 Swap,现在服务器的内存足够大,不需要swap。大部分云平台中的虚拟机都默认禁止 Swap。

2. 实在需要用到 Swap,可以尝试降低 swappiness 的值,减少内存回收时 Swap 的使用倾向。

3. 用库函数 mlock() 或者 mlockall() 锁定内存,阻止它们的内存换出。