kswapd0定期回收内存

kswapd0定期回收内存

Content #

专门的内核线程用来定期回收内存,也就是 kswapd0。为了衡量内存的使用情况, kswapd0 定义了三个内存阈值(watermark,也称为水位),分别是:

  1. 页最小阈值(pages_min)
  2. 页低阈值(pages_low)
  3. 页高阈值(pages_high)

剩余内存,则使用 pages_free 表示。

kswapd0 定期扫描内存的使用情况,并根据剩余内存落在这三个阈值的空间位置,进行内存的回收操作。

  1. 剩余内存小于页最小阈值,说明进程可用内存都耗尽了,只有内核才可以分配内存。
  2. 剩余内存落在页最小阈值和页低阈值中间,说明内存压力比较大,剩余内存不多了。这时 kswapd0 会执行内存回收,直到剩余内存大于高阈值为止。
  3. 剩余内存落在页低阈值和页高阈值中间,说明内存有一定压力,但还可以满足新内存请求。
  4. 剩余内存大于页高阈值,说明剩余内存比较多,没有内存压力。

一旦剩余内存小于页低阈值,就会触发内存的回收。这个页低阈值,其实可以通过内核选项 /proc/sys/vm/min_free_kbytes 来间接设置。min_free_kbytes 设置了页最小阈值,而其他两个阈值,都是根据页最小阈值计算生成的,计算方法如下 :

pages_low = pages_min*5/4
pages_high = pages_min*3/2

Viewpoints #

From #

19 | 案例篇:为什么系统的Swap变高了(上)