linux kernel 内存回收水位线调整方法
调整Linux内核的内存回收水位线可以通过以下步骤完成,确保系统在内存管理方面更符合特定需求:
1. 理解内存水位线
-
min:系统保留的最小空闲内存,低于此值会触发直接内存回收(同步回收),可能导致进程阻塞。
-
low:当可用内存低于此值时,内核开始后台回收(kswapd进程),直到达到high水位。
-
high:内存充足时的阈值,回收过程停止。
2. 查看当前水位线
使用/proc/zoneinfo
查看各内存区域(zone)的水位线:
cat /proc/zoneinfo | grep -E "Node|min|low|high"
输出示例(单位为页面数,页面大小通常为4KB):
Node 0, zone Normalpages free 30387min 1485low 1856high 2227
3. 调整水位线参数
方法一:修改 vm.min_free_kbytes
-
该参数设置系统保留的全局最小空闲内存(KB),直接影响
min
水位线,low
和high
基于此计算。 -
设置方法:
sysctl -w vm.min_free_kbytes=65536 # 临时生效
-
永久生效:将
vm.min_free_kbytes=65536
写入/etc/sysctl.conf
,执行sysctl -p
。
-
方法二:调整 watermark_scale_factor
-
控制
high
和low
之间的间隔(默认10,范围1-1000),值越大间隔越宽,减少回收频率。 -
设置方法:
echo 500 > /proc/sys/vm/watermark_scale_factor # 临时生效
-
永久生效:将
vm.watermark_scale_factor=500
写入/etc/sysctl.conf
,执行sysctl -p
。
-
4. 验证调整结果
重新检查/proc/zoneinfo
确认水位线是否更新:
cat /proc/zoneinfo | grep -E "Node|min|low|high"
5. 注意事项
-
性能影响:增大
min_free_kbytes
会减少可用内存,可能导致频繁回收;过小则增加OOM风险。 -
NUMA系统:在NUMA架构中需分别调整各节点的水位线,参数路径如
/proc/sys/vm/numa_zonelist_order
。 -
内核版本差异:不同内核版本参数可能不同,建议参考对应版本的文档(如
Documentation/sysctl/vm.txt
)。
示例配置
若希望系统保留64MB最小内存,并扩大回收间隔:
# 设置最小保留内存为65536KB(64MB)
sysctl -w vm.min_free_kbytes=65536# 扩大high-low间隔至默认的50倍(更少但更大量的回收)
echo 500 > /proc/sys/vm/watermark_scale_factor
通过合理调整这些参数,可优化系统在内存压力下的行为,平衡性能与稳定性。
# cat /proc/zoneinfo
Node 0, zone DMAper-node statsnr_inactive_anon 23nr_active_anon 1494nr_inactive_file 1696nr_active_file 1938nr_unevictable 0nr_slab_reclaimable 3212nr_slab_unreclaimable 3257nr_isolated_anon 0nr_isolated_file 0workingset_refault 0workingset_activate 0workingset_nodereclaim 0nr_anon_pages 1511nr_mapped 834nr_file_pages 3665nr_dirty 5nr_writeback 0nr_writeback_temp 0nr_shmem 34nr_shmem_hugepages 0nr_shmem_pmdmapped 0nr_anon_transparent_hugepages 0nr_unstable 0nr_vmscan_write 0nr_vmscan_immediate_reclaim 0nr_dirtied 49nr_written 44pages free 460692min 1378low 1852high 2326spanned 520192present 520192managed 475127protection: (0, 0, 0)nr_free_pages 460692nr_zone_inactive_anon 23nr_zone_active_anon 1494nr_zone_inactive_file 1696nr_zone_active_file 1938nr_zone_unevictable 0nr_zone_write_pending 5nr_mlock 0nr_page_table_pages 65nr_kernel_stack 1104nr_bounce 0nr_free_cma 294073pagesetscpu: 0count: 122high: 186batch: 31vm stats threshold: 20cpu: 1count: 128high: 186batch: 31vm stats threshold: 20node_unreclaimable: 0start_pfn: 4096node_inactive_ratio: 0
Node 0, zone Normalpages free 0min 0low 0high 0spanned 0present 0managed 0protection: (0, 0, 0)
Node 0, zone Movablepages free 0min 0low 0high 0spanned 0present 0managed 0protection: (0, 0, 0)
#
#
# free -mtotal used free shared buff/cache available
Mem: 1855 28 1800 0 26 1804
Swap: 0 0 0
# freetotal used free shared buff/cache available
Mem: 1900508 29220 1843752 136 27536 1848160
Swap: 0 0 0
# cat /proc/vm
vmallocinfo vmstat
# cat /proc/meminfo
MemTotal: 1900508 kB
MemFree: 1843628 kB
MemAvailable: 1848036 kB
Buffers: 3852 kB
Cached: 10828 kB
SwapCached: 0 kB
Active: 13580 kB
Inactive: 6876 kB
Active(anon): 5808 kB
Inactive(anon): 92 kB
Active(file): 7772 kB
Inactive(file): 6784 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 8 kB
Writeback: 0 kB
AnonPages: 5848 kB
Mapped: 3332 kB
Shmem: 136 kB
Slab: 24060 kB
SReclaimable: 12856 kB
SUnreclaim: 11204 kB
KernelStack: 1088 kB
PageTables: 236 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 950252 kB
Committed_AS: 10700 kB
VmallocTotal: 263159744 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
CmaTotal: 1179648 kB
CmaFree: 1176292 kB
#