引发系统load飙高原因有以下几点:
- 直接内存回收引起的 load 飙高;
- 系统中脏页积压过多引起的 load 飙高;
- 系统 NUMA 策略配置不当引起的 load 飙高。
1、直接内存回收:
观察:sar -B
中pgscank/s、pgscand/s表示扫描的页面数量,前者表示kswapd扫描结果,后者表示直接扫描。需要让直接扫描越小越好。
解决:设置vm.min_free_kbytes
,尽早开始后台回收。
2、脏页积压:
观察:sar -r
中kbdirty即是脏页大小。
解决:设置vm/dirtyxxx控制脏页个数在合理范围内。
3、NUMA设置不合理:
观察:numactl --hardware
查看是否还有一半内存空闲,但是还是频频发生direct reclaim。
解决:vm.zone_reclaim_mode = 0
# echo 0 > /proc/sys/vm/zone_reclaim_mode
# # 意味着关闭zone_reclaim模式,可以从其他zone或NUMA节点回收内存
# echo 1 > /proc/sys/vm/zone_reclaim_mode
# # 表示打开zone_reclaim模式,这样内存回收只会发生在本地节点内
# echo 2 > /proc/sys/vm/zone_reclaim_mode
# # 在本地回收内存时,可以将cache中的脏数据写回硬盘,以回收内存。
# echo 4 > /proc/sys/vm/zone_reclaim_mode
# # 可以用swap方式回收内存。