引发系统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方式回收内存。
本文探讨了系统load飙升的三大原因:内存回收问题、脏页积累以及NUMA配置不当。通过监控pgscank/s和pgscand/s,调整vm.min_free_kbytes和脏页限制,以及合理配置zone_reclaim_mode来解决这些问题。
174

被折叠的 条评论
为什么被折叠?



