Linux 虚拟内存参数配置是系统性能优化的核心环节,其参数分布于/proc/sys/vm目录,通过sysctl命令或/etc/sysctl.conf文件进行调整。以下是关键参数的深度解析及配置策略:
- 作用:控制内存页交换到磁盘的倾向,取值范围 0-100,默认 60。
- 配置逻辑:
- 数据库 / 内存敏感型应用:设置为 10-20,减少交换对性能的影响。
- 内存紧张的服务器:设置为 30-50,平衡内存使用与稳定性。
- 极端场景:设置为 0(内核 3.5+)或 1(Red Hat 2.6.32+)完全禁用交换。
- 调整方法:
sysctl -w vm.swappiness=10
- 作用:系统保留的最小空闲内存(KB),防止内存耗尽。
- 配置逻辑:
- 计算公式:
min_free_kbytes = (总内存GB) * 1024 * 4(经验值)。
- 示例:32GB 内存设置为
131072。
- 风险:设置过小可能导致 OOM,过大则浪费内存。
- 作用:控制内存超额分配策略,取值 0/1/2:
- 0(启发式):默认模式,允许适度超额分配。
- 1(总是允许):适用于科学计算等稀疏内存使用场景。
- 2(严格限制):禁止超额分配,内存分配总量不超过
物理内存 + swap * vm.overcommit_ratio。
- 数据库场景:建议设置为 2,避免 OOM。
- 调整方法:
sysctl -w vm.overcommit_memory=2
echo "vm.overcommit_memory=2" >> /etc/sysctl.conf
- 作用:当
vm.overcommit_memory=2时,允许超额分配的物理内存百分比,默认 50%。
- 调整示例:
sysctl -w vm.overcommit_ratio=70
- 作用:内存中脏页占总内存的百分比阈值,达到时触发同步刷盘。
- 配置逻辑:
- 高并发写入场景:设置为 30-40,减少 I/O 延迟。
- 普通场景:默认 20。
- 风险:过高可能导致系统崩溃。
- 作用:脏页占总内存的百分比阈值,达到时触发后台异步刷盘。
- 配置逻辑:
- 建议值:为
vm.dirty_ratio的 1/2,如 20/10。
- 示例:
sysctl -w vm.dirty_ratio=30 vm.dirty_background_ratio=15
- 作用:单个进程可创建的最大内存映射区域数,默认 65536。
- 应用场景:
- Elasticsearch:需设置为 262144。
- 数据库:根据索引规模调整,建议 1048576。
- 调整方法:
sysctl -w vm.max_map_count=262144
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
- 作用:控制 NUMA 架构下内存回收策略,取值 0-4:
- 数据库场景:设置为 0,减少 swap。
- 作用:控制内核回收文件缓存的倾向,取值 0-1000,默认 100。
- 配置逻辑:
- 高缓存需求:设置为 50,减少缓存回收。
- 内存紧张:设置为 200,加速缓存释放。
- 作用:控制 swap 操作的页面簇大小(2^n 页),默认 3(8 页)。
- 调整示例:
sysctl -w vm.page-cluster=2
- 内存使用:
free -h、top、htop。
- swap 活动:
vmstat 1(关注si/so列)。
- 脏页状态:
cat /proc/meminfo | grep Dirty。
- 参数验证:
sysctl -a | grep vm。
vm.swappiness = 10
vm.overcommit_memory = 2
vm.overcommit_ratio = 70
vm.dirty_ratio = 30
vm.dirty_background_ratio = 15
vm.max_map_count = 262144
vm.zone_reclaim_mode = 0
vm.swappiness = 30
vm.overcommit_memory = 0
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
vfs_cache_pressure = 200
- 参数冲突:
vm.swappiness=0与vm.overcommit_memory=2可能导致内存分配失败。
- 内核版本差异:旧内核(<3.5)的
vm.swappiness=0可能完全禁用 swap。
- 渐进式调整:每次修改 1-2 个参数,避免系统不稳定。
- 监控先行:调整后持续监控内存、I/O、进程状态。