Linux性能优化实战 19-20:内存回收与swap
一、内存回收的两种方式
1. 在内存资源紧张时,Linux 通过直接内存回收和定期扫描的方式,来释放 文件页 和 匿名页。
2. 文件页的回收:直接清空,或者把脏数据写回磁盘后再释放。
缓存和缓冲区(前面说的buffer和cache的综合),就属于可回收内存,通常被叫做文件页。
3. 匿名页的回收:通过 Swap 换出到磁盘中,下次访问时,再从磁盘换入到内存中。
应用程序动态分配的堆内存,被叫做匿名页。
二、swap机制
1. 有一个专门的内核线程用来定期回收内存,也就是kswapd0。
kswapd0 定义了三个内存阈值,如下图:
低于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)
内存的管理机制同上面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
2. /proc/zoneinfo
3. /proc/pid/status
五、降低 Swap 的使用,可以提高系统的整体性能
1. 禁止 Swap,现在服务器的内存足够大,不需要swap。大部分云平台中的虚拟机都默认禁止 Swap。
2. 实在需要用到 Swap,可以尝试降低 swappiness 的值,减少内存回收时 Swap 的使用倾向。
3. 用库函数 mlock() 或者 mlockall() 锁定内存,阻止它们的内存换出。