LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

sysctl:vm参数设置

1 vm.admin_reserve_kbytes = 8192

参数作用:
- 功能:为系统管理员(root)进程保留 8MB 内存,防止内存耗尽时关键管理进程(如 SSH、systemd)崩溃。
- 默认值:通常为 256(0.25MB)或 8192(8MB,因系统而异)。

影响分析:

场景  影响 
内存充足时 无显著影响,保留内存可被普通进程使用。
内存不足时 确保至少 8MB 内存专供 root 进程,避免系统管理功能失效(如无法登录修复)。
调整过高(如 64MB) 浪费可用内存,可能加剧普通进程的 OOM(内存溢出)风险。
调整过低(如 1MB) 内存紧张时,关键管理进程可能因内存不足被 OOM Killer 终止,导致系统失控。

 

建议:
- 默认值适用性:若无特殊需求(如极端内存限制环境),保持默认值即可。
- 监控工具:搭配 free -m 或 htop 观察内存使用情况,再决定是否需要调整。

2 vm.dirty_background_bytes = 0
3 vm.dirty_background_ratio = 10
4 vm.dirty_bytes = 0
5 vm.dirty_expire_centisecs = 3000
6 vm.dirty_ratio = 20
7 vm.dirty_writeback_centisecs = 500
8 vm.dirtytime_expire_seconds = 43200

参数说明

1. vm.dirty_background_bytes = 0
- 作用:设置触发后台脏页回写的绝对内存阈值(字节单位)
- 配置范围:
- 0:禁用绝对值模式,改用 dirty_background_ratio(比例模式)
- ≥1:指定具体字节数(如 1048576 = 1MB)。
- 影响:
- 设为 0 时,依赖 dirty_background_ratio 触发后台回写。
- 非零时优先级高于 dirty_background_ratio。

 

2. vm.dirty_background_ratio = 10
- 作用:当系统内存中脏页占比 ≥ 设定比例时,触发 异步后台回写(不阻塞应用)。
- 配置范围:0 ~ 100(百分比)。
- 影响:
- 低值(如 5):频繁小批量回写,减少数据丢失风险,但增加I/O负载。
- 高值(如 20):延迟回写,提升写入吞吐,但内存不足时可能突发高I/O。

 

3. vm.dirty_bytes = 0
- 作用:设置触发同步脏页回写的绝对内存阈值(字节单位)
- 配置范围:
- 0:禁用绝对值模式,改用 dirty_ratio(比例模式)。
- ≥1:指定具体字节数。
- 影响:
- 非零时优先级高于 dirty_ratio,适合精确控制内存占用。
- 设为 0 时依赖 dirty_ratio 触发同步回写。

 

4. vm.dirty_expire_centisecs = 3000
- 作用:脏页在内存中驻留的最长时间(单位:1/100秒),超时后强制回写。
- 配置范围:0 ~ INT_MAX(约 21474836 秒 ≈ 248天)。
- 影响:
- 短时间(如 1000=10秒):频繁回写,减少数据丢失,但增加I/O压力。
- 长时间(如 3000=30秒):适合批量写入场景(如日志服务器),但崩溃时可能丢失更多数据。

 

5. vm.dirty_ratio = 20
- 作用:当系统内存中脏页占比 ≥ 设定比例时,触发 同步阻塞回写(应用写入被暂停)
- 配置范围:0 ~ 100(百分比)。
- 影响:
- 低值(如 10):快速回写,减少阻塞,但限制写入吞吐。
- 高值(如 30):允许更多脏页累积,提升突发写入性能,但可能导致应用卡顿。

 

6. vm.dirty_writeback_centisecs = 500
- 作用:内核周期性唤醒回写线程的时间间隔(单位:1/100秒)
- 配置范围:0 ~ INT_MAX(设为 0 禁用周期性回写)。
- 影响:
- 短间隔(如 100=1秒):实时回写,减少数据驻留时间,适合低延迟存储(如SSD)。
- 长间隔(如 500=5秒):降低CPU开销,但可能延迟回写。

 

7. vm.dirtytime_expire_seconds = 43200
- 作用:标记为“脏页”的最长保留时间(秒),超时后可能被优先回收
- 配置范围:0 ~ INT_MAX(约 68年)。
- 影响:
- 短时间(如 3600=1小时):加速回收长期未访问的脏页,节省内存。
- 长时间(如 43200=12小时):减少频繁回收,适合内存充足且需要缓存持久化的场景。

配置建议与工具

1. 监控命令:

grep "Dirty:" /proc/meminfo # 查看当前脏页大小
vmstat 1 # 观察内存和I/O状态
iostat -x 1 # 监控磁盘I/O负载

2. 调优方向:
- 高吞吐场景:提高 dirty_ratio + 延长 dirty_expire_centisecs。
- 数据安全场景:降低 dirty_ratio + 缩短 dirty_expire_centisecs。
- 低延迟存储:缩短 dirty_writeback_centisecs。

通过合理配置,可平衡 性能、内存占用 和 数据可靠性。

9 vm.laptop_mode = 0

作用

控制系统的磁盘 I/O 和缓存回写策略,针对笔记本电脑等移动设备优化电源管理。
- 启用时(值 >0):延迟磁盘写入操作,合并多次 I/O 请求以减少磁盘唤醒次数,从而降低功耗。
- 禁用时(值 =0):立即处理磁盘写入,优先保证数据安全性和响应速度。

配置范围

- 典型值:
- 0:禁用笔记本电脑模式(默认值,常见于服务器/台式机)。
- 1~5:启用并设置优化强度(值越大,延迟写入越激进,不同内核版本可能范围不同)。

配置影响

场景 laptop_mode=0(禁用) laptop_mode>0(启用)
数据安全性 脏页更快回写磁盘,崩溃时数据丢失风险低。 脏页延迟回写,崩溃可能丢失更多未保存数据。
磁盘 I/O 频率 写入操作更频繁,磁盘活动量高。 合并写入请求,减少磁盘唤醒次数,延长 SSD/HDD 寿命。
功耗 磁盘频繁唤醒,增加功耗(对笔记本续航不利)。 减少磁盘活动,显著降低功耗(适合电池供电场景)。
性能表现 响应更快,适合高吞吐场景(如数据库写入)。 轻微延迟可能影响实时性要求高的任务。

使用场景建议

1. 禁用(=0)场景:
- 服务器、台式机(无需省电)。
- 高数据安全需求(如金融交易系统)。
- 需要低延迟写入的应用(如实时日志处理)。

2. 启用(>0)场景:
- 笔记本电脑(需延长电池续航)。
- 对磁盘寿命敏感的环境(如 SSD 频繁写入优化)。
- 非关键数据的离线任务(如文档编辑、轻度开发)。

10 vm.legacy_va_layout = 0

作用
控制虚拟内存地址空间布局模式:
- 0:启用 新版布局(默认),将内存映射区域(如堆、栈)放置在更高地址空间,提升 ASLR(地址空间随机化)安全性
- 1:启用 传统布局(旧版),兼容早期内核版本或特定老旧应用。

配置范围
- 可选值:0(禁用传统布局)或 1(启用传统布局)。

影响
- 设为 0:
- 增强安全性(ASLR 更有效),但对极少数依赖传统地址布局的应用可能导致崩溃(需重新编译)。
- 设为 1:
- 兼容老旧程序,但降低内存随机化防护能力(增加漏洞利用风险)。

11 vm.lowmem_reserve_ratio = 32 0

作用
控制低端内存区域(ZONE_DMA、ZONE_NORMAL)的保留内存比例,防止内核因内存耗尽而崩溃。
- 格式:按内存区域顺序设置比例值(如 32 0 表示 ZONE_DMA 保留比例为 1/32,ZONE_NORMAL 不保留)。

配置范围
- 值范围:每个区域值为 ≥0 的整数(0 表示不保留)。
- 典型配置:32 32 0(三区域:DMA、DMA32、NORMAL)。

影响
- 高比例(如 32):保留更多内存供内核使用,减少用户态进程 OOM(内存溢出)风险,但用户可用内存减少。
- 设为 0:关闭指定区域的内存保留,可能导致内核关键功能(如网络栈)在内存紧张时失效。

12 vm.max_map_count = 65530

作用
限制单个进程可创建的内存映射区域(如文件映射、共享内存)的最大数量

配置范围
- 最小值:0(禁止映射,系统不可用)。
- 默认值:65530(多数 Linux 发行版)。
- 最大值:内核允许的最大值(通常 1048576)。

影响
- 调高(如 262144):支持需要大量内存映射的应用(如 Oracle 数据库、JVM),避免 ENOMEM 错误。
- 调低(如 32768):减少内核元数据开销,但可能导致应用崩溃(如 Elasticsearch、Redis)。

13 vm.memfd_noexec = 0

作用
控制通过 memfd_create() 创建的内存文件是否允许执行代码(安全防护)
- 0:允许执行(默认)。
- 1:禁止执行,防范代码注入攻击(如容器环境)。

配置范围
- 可选值:0 或 1。

影响
- 设为 0:
- 允许内存文件执行代码,兼容传统应用(如 JIT 编译器),但存在安全风险。
- 设为 1:
- 增强安全性(阻止恶意代码在内存中运行),但依赖内存执行的程序(如某些语言解释器)可能崩溃。

14 vm.min_free_kbytes = 4008

1. 参数作用
- 定义:指定内核应保留的最小空闲内存(以 KB 为单位),确保系统在内存压力下仍有足够内存处理紧急操作(如中断处理、内核分配等)。
- 目标:防止内存耗尽导致的系统不稳定或进程被 OOM Killer 终止

2. 默认值计算
- 自动计算:内核根据系统总内存动态计算默认值,通常为:
默认值 ≈ √总物理内存 × 16 (不同内核版本可能有差异)
- 例如:64GB 内存的系统,默认值约为√(64 × 1024) ×16 ≈ 8192 KB(即 8MB)。
- 查看当前值:

cat /proc/sys/vm/min_free_kbytes

3. 配置建议

(1) 合理范围
- 经验值:通常设置为总内存的 1%~3%。
- 例如:64GB(即 65536MB)内存,建议值为 655MB ~ 1966MB(即 65536KB ~ 196608KB)。
- 调整命令:

#临时修改
sysctl -w vm.min_free_kbytes=65536

#永久修改(写入 /etc/sysctl.conf)
echo "vm.min_free_kbytes=65536" >> /etc/sysctl.conf
sysctl -p

(2) 场景优化
- 内存敏感型应用(如数据库、虚拟机):
- 适当提高值(如 3%),增强内存不足时的稳定性。
- 嵌入式/低内存设备:
- 降低值(如 0.5%),避免过多内存浪费。

4. 影响分析
(1) 设置过低的后果
- 内存碎片增加:内核难以找到连续内存块,可能触发频繁的内存回收(直接回收或 Compaction)。
- OOM 风险:紧急内存需求无法满足,导致进程被终止或系统冻结。

(2) 设置过高的后果
- 内存浪费:用户空间可用内存减少,可能影响应用程序性能。
- 频繁唤醒 kswapd:过早触发内存回收,增加 CPU 开销。

5. 监控与调试
(1) 监控工具
-free 命令:观察free 内存是否接近min_free_kbytes。

free -k 以 KB 为单位显示

-/proc/zoneinfo:查看各内存区域的空闲页和保留页。

grep -A10 "Node 0" /proc/zoneinfo

(2) 关键指标
-pages min:在/proc/zoneinfo 中,表示每个 Zone 的最小保留页数。
-lowmem_reserve_ratio:影响保留内存的分布,需与min_free_kbytes 协调。

6. 与其他参数的关联
-vm.swappiness:控制交换分区使用倾向,高min_free_kbytes 可配合低swappiness 减少交换。
-vm.watermark_scale_factor:调整内存回收阈值,与min_free_kbytes 共同决定何时触发回收。
-vm.extra_free_kbytes:额外保留的内存,用于优化突发内存需求。

7. 注意事项
- 逐步调整:避免一次性大幅修改,建议按 10%~20% 步长调整并观察效果。
- 测试验证:在生产环境调整前,通过压力测试(如stress-ng)模拟内存负载。
- 内核版本差异:不同内核版本的内存管理策略可能不同,需参考对应文档。

示例配置
对于 128GB 内存的服务器(假设默认值为 16384 KB):
1. 计算建议值:1% 为 131072 KB(128GB × 0.01 = 1.28GB)。
2. 临时调整:

sysctl -w vm.min_free_kbytes=131072

3. 监控效果:

watch -n 1 "grep -E 'min|free' /proc/zoneinfo" 

总结
- 平衡点:vm.min_free_kbytes 需在内存浪费与系统稳定间找到平衡。
- 动态调整:根据实际负载和业务需求定期评估,避免静态设置。
- 全局视角:结合其他内存参数(如swappiness)和监控工具,全面优化内存管理。

15 vm.mmap_min_addr = 4096

作用
设置用户空间进程进行内存映射(如 mmap)时的 最低允许地址(字节单位),防止恶意程序映射低地址内存(如 0x0),增强系统安全性。

配置范围
- 最小值:0(允许映射到 0x0,极不安全)。
- 典型值:4096(即 0x1000,默认值,与内存页对齐)。
- 最大值:由架构决定(通常不超过 65536)。

影响
- 设为 4096:
- 阻止映射 0x0 地址,防御空指针解引用攻击(如 NULL pointer dereference)。
- 兼容多数现代应用,但极少数老旧程序(依赖低地址映射)可能崩溃。
- 设为 0:
- 允许映射任意低地址,存在安全风险(仅用于调试或兼容性需求)。
- 设为更高值(如 65536):
- 进一步限制内存映射范围,可能误伤合法应用(需谨慎测试)。

16 vm.mmap_rnd_bits = 17

作用
控制 mmap 内存映射的 地址随机化位数(ASLR 的一部分),增加攻击者预测内存地址的难度,提升安全性。
- 值越大:随机化范围越广,地址越难预测。
- 值越小:随机化范围越窄,节省内存但降低安全性。

配置范围
- 32 位系统:8 ~ 16(默认 8)。
- 64 位系统:16 ~ 32(默认 28)。
- 特殊说明:vm.mmap_rnd_bits=17 是针对 64 位系统 的合理值(需确认内核支持)。

影响
- 调高(如 24):
- 增强安全性(如防御 ROP 攻击),但可能略微增加内存碎片化。
- 对性能影响可忽略(现代 CPU 处理随机化开销低)。
- 调低(如 16):
- 减少内存地址分散,但易被攻击者预测内存布局。
- 超出范围:
- 内核可能自动调整为最大/最小值(如 64 位系统设置 33 → 回退到 32)。

17 vm.oom_dump_tasks = 1

作用
控制在系统触发 OOM(内存耗尽)时,是否在日志中 转储所有进程的内存使用信息,帮助诊断 OOM Killer 选择终止进程的原因。

配置范围
- 0:禁用 OOM 时进程信息转储(默认)。
- 1:启用转储,记录所有进程的 pid、内存占用、oom_score 等详细信息。

影响
- 设为 1:
- 优点:提供详细的调试信息,便于分析内存泄漏或异常进程。
- 缺点:可能生成大体积内核日志(尤其在进程数多时),轻微增加 OOM 处理延迟。
- 设为 0:
- 日志仅记录被终止的进程名,节省存储和计算资源。

18 vm.oom_kill_allocating_task = 0

作用
控制 OOM Killer 是否优先杀死 正在申请内存的进程(触发 OOM 的进程)。
- 0:禁用,根据 oom_score 选择最优进程终止(默认)。
- 1:启用,直接杀死当前申请内存的进程。

配置范围
- 0 或 1。

影响
- 设为 0:
- 优点:公平选择高内存占用或低优先级的进程终止,保护关键服务(如数据库)。
- 缺点:决策延迟稍高(需遍历进程计算评分)。
- 设为 1:
- 优点:快速终止当前请求内存的进程(如内存泄漏的进程),立即缓解内存压力。
- 缺点:可能误杀合法进程(如突发内存需求的正常应用)。

19 vm.overcommit_kbytes = 0
20 vm.overcommit_memory = 0
21 vm.overcommit_ratio = 50

内存的 Overcommit(超量提交) 是 Linux 内核的一种内存管理机制,允许系统分配比物理内存(RAM)和交换空间(Swap)总和更多的内存给进程。这种机制基于一个假设:并非所有进程会同时完全使用其申请的内存。通过 Overcommit,系统可以更灵活地管理内存资源,提高内存利用率,但也可能引入内存耗尽的风险。

Overcommit 的核心逻辑

1. 允许“超额承诺”
进程可以通过 malloc() 等函数申请大量内存,但实际使用时可能仅占用部分内存(例如稀疏数组、预分配但未填充的缓冲区)。
Overcommit 允许内核接受这些请求,即使当前物理内存 + Swap 不足。

2. 内核的策略判断
内核通过 vm.overcommit_memory 参数控制是否允许 Overcommit,并决定如何检查内存请求的合法性。

Linux 的 Overcommit 策略

通过 vm.overcommit_memory 参数配置:

参数值 策略 行为
0 启发式 Overcommit(默认) 内核根据经验公式判断是否允许分配:若 空闲内存 + 可回收内存 ≥ 请求内存,则允许;否则拒绝(返回 ENOMEM)。
1 总是允许 Overcommit 无条件接受所有内存申请请求(除非超过进程地址空间限制)。
2 禁止 Overcommit 严格限制内存分配总量,不得超过 物理内存 × overcommit_ratio% + Swap + overcommit_kbytes。

Overcommit 的典型场景

1. 稀疏内存使用
进程申请 1GB 内存,但仅实际写入 100MB(如哈希表的预分配)。
Overcommit 允许此类请求,避免物理内存浪费。

2. 多进程分时占用内存
多个进程申请大量内存,但不同时活跃使用(如批处理任务)。
内核可通过分时调度避免内存耗尽。

3. 内存泄漏容忍
允许短期内存泄漏,依赖进程退出后自动释放(如临时脚本)。

Overcommit 的风险

当进程实际使用的内存总量超过 物理内存 + Swap 时,系统触发 OOM(Out-Of-Memory) Killer,强制终止进程以释放内存。这可能导致:
- 关键服务被终止(如数据库、Web 服务器)。
- 数据丢失或业务中断。

Overcommit 的配置与监控

1. 关键参数
- vm.overcommit_memory:定义 Overcommit 策略(0/1/2)。
- vm.overcommit_ratio(默认 50%):策略 2 下,允许分配的内存比例。
- vm.overcommit_kbytes:策略 2 下,允许分配的绝对内存值(优先级高于 overcommit_ratio)。

2. 监控工具
- free -h:查看内存和 Swap 使用情况。
- dmesg | grep "Out of memory":检查 OOM 事件。
- sar -r:监控内存分配趋势。

3. 配置示例
- 允许所有 Overcommit(高风险):

sysctl vm.overcommit_memory=1

- 严格限制 Overcommit(高稳定):

sysctl vm.overcommit_memory=2
sysctl vm.overcommit_ratio=80 # 允许分配总量 = 物理内存 × 80% + Swap

Overcommit 的优缺点

优点 缺点
 提高内存利用率,支持更多进程并发。 内存耗尽时触发 OOM Killer,可能导致服务中断。
适应稀疏内存使用场景,减少物理内存浪费。 需要合理配置策略,否则可能频繁拒绝合法内存请求。
 简化内存管理(无需精确预判进程内存需求)。 调试内存问题时复杂度增加(如隐藏的内存泄漏)。

适用场景建议

- 启用 Overcommit(策略 0 或 1):
- 多数通用服务器、桌面环境。
- 内存需求波动大但峰值不同时出现的场景(如云计算虚拟机)。

- 禁用 Overcommit(策略 2):
- 对稳定性要求极高的关键服务(如金融交易系统)。
- 内存需求可精准预测的应用(如嵌入式设备)。

总结

内存的 Overcommit 是一种以弹性换风险的机制,通过“超额承诺”提高资源利用率,但需结合业务场景谨慎配置。理解其原理并合理监控,可在性能与稳定性之间找到最佳平衡。

22 vm.page-cluster = 3

作用
控制文件预读(Read-ahead)的页面数量,优化顺序读取性能。
- 计算公式:预读页数 = 2^page-cluster(例如 3 → 预读 8 页)。

配置范围
- 典型值:0 ~ 5(对应预读 1 ~ 32 页)。

影响
- 高值(如 3~5):提升顺序读性能(如大文件读取),但增加内存占用。
- 低值(如 0~2):减少内存浪费,适合随机读取场景(如数据库)。

23 vm.page_lock_unfairness = 5

作用
调整内存页锁的公平性策略,控制多线程竞争锁时的优先级分配。
- 值越大:允许更多“不公平”锁分配(高优先级线程更快获取锁)。

配置范围
- 典型值:1 ~ 10(默认值因内核版本而异)。

影响
- 高值(如 5~10):提升高优先级线程性能,但可能导致低优先级线程饥饿。
- 低值(如 1~3):更公平的锁竞争,但可能增加调度开销。

24 vm.panic_on_oom = 0

作用
控制系统在内存耗尽(OOM)时是否触发内核崩溃(panic)。
- 0:不触发 panic,由 OOM Killer 终止进程(默认)。
- 1:触发 panic,直接重启系统。

配置范围
- 可选值:0 或 1。

影响
- 设为 0:允许系统继续运行(依赖 OOM Killer),但可能终止关键进程。
- 设为 1:确保系统快速复位,避免数据不一致,但导致服务中断。

25 vm.percpu_pagelist_high_fraction = 0

作用
控制每个 CPU 的页列表(Pagelist)高水位线,影响内存回收策略。
- 0:禁用按 CPU 的高水位限制,使用全局内存管理策略。

配置范围
- 值范围:0 ~ 100(百分比,默认值因内核版本而异)。

影响
- 设为 0:简化内存管理,减少碎片化,但可能降低 NUMA 架构性能。
- 设为非零(如 5):优化多 CPU 内存分配,但增加管理开销。

26 vm.stat_interval = 1

作用
设置内核更新内存统计信息(如缓存、脏页)的时间间隔(秒)。

配置范围
- 最小值:1(1秒,默认)。
- 最大值:600(10分钟)。

影响
- 短间隔(如 1):监控数据更实时,但轻微增加 CPU 开销。
- 长间隔(如 10):减少开销,但监控工具(如 free、top)数据更新延迟。

27 vm.swappiness = 60

vm.swappiness 是 Linux 内核中用于调节内存交换行为的重要参数,以下是其关键信息及使用建议:

作用

- 控制内核在物理内存不足时使用交换空间(Swap)的倾向。值越高,内核越积极使用 Swap;值越低,越倾向于保留在物理内存中。

取值范围

- 0~100,默认值为 60。
- 0:尽可能避免交换匿名内存(应用程序内存),但不禁止交换(极端内存压力下仍会触发)。
- 100:积极使用 Swap,可能增加 I/O 负载。

适用场景

1. 数据库/高性能服务(如 MySQL、Redis):
- 建议设为 1~10,减少交换延迟,确保关键数据驻留物理内存。
2. 桌面环境:
- 默认值 60 或稍低(如 30),平衡响应速度与内存压力。
3. SSD 存储:
- 可适当降低(如 10),因 SSD 虽快但频繁写入可能影响寿命。
4. 内存充足环境:
- 设为 0 或更低值(需内核支持),优先使用物理内存。

检查与配置

- 查看当前值:

sysctl vm.swappiness # 或 cat /proc/sys/vm/swappiness

- 临时修改:

sysctl -w vm.swappiness=10

- 永久生效:
编辑 /etc/sysctl.conf,添加:

vm.swappiness=10

执行 sysctl -p 生效。

与其他参数的关系

- vfs_cache_pressure:控制文件系统缓存回收倾向(默认 100)。若系统依赖文件缓存(如 Web 服务器),可适当降低此值以减少缓存回收,与 swappiness 配合优化内存策略。
- cgroups:某些场景下可为控制组单独设置 memory.swappiness,优先级高于全局参数。

常见误解

- swappiness=0 是否禁用 Swap?
否!内核仍可能在内存严重不足时触发交换。完全禁用需结合 swapoff -a。
- 高内存占用是否需调高 swappiness?
不一定,物理内存未耗尽时,Swap 使用可能无必要。建议监控后再调整(如使用 free 或 vmstat)。

内核版本差异

- 3.5+ 版本:引入更积极的内存回收策略,swappiness=0 可能仍比旧内核更频繁交换。
- 调整前建议测试:不同工作负载下,参数效果可能差异显著。

总结建议

- 优先物理内存:对延迟敏感的服务,降低 swappiness。
- 监控再调整:通过 sar、vmstat 观察 Swap 使用率及 SI/SO(交换入/出)频率。
- 结合存储类型:机械硬盘慎用高 swappiness,SSD 可适度放宽但避免极端值。

通过合理配置 vm.swappiness,可显著优化系统性能与稳定性,尤其在内存密集型场景中效果显著。

28 vm.user_reserve_kbytes = 31169

作用
为用户态(非 root)进程保留 31,169 KB(约 31MB)内存,防止内存耗尽时关键用户进程(如 Web 服务、数据库客户端)被 OOM Killer 强制终止。

 

配置范围
- 最小值:0(不保留,默认值通常为 0 或基于系统内存动态计算)。
- 合理范围:根据系统总内存调整,通常为总内存的 0.1%~1%(例如 32GB 内存可设为 32768 KB)。
- 最大值:理论上无上限,但需避免过度占用可用内存。

 

影响分析
| 场景 | 影响 |
||--|
| 内存充足时 | 保留内存仍可被用户进程使用,无实际限制。 |
| 内存不足时 | 用户进程最多只能使用 总内存 - 保留内存,降低关键服务被 OOM Killer 终止的概率。 |
| 配置过高(如 128MB) | 浪费可用内存,可能加剧普通进程的 OOM 风险。 |
| 配置过低(如 8MB) | 内存紧张时,用户进程可能因保留内存不足被终止,影响服务可用性。 |

29 vm.vfs_cache_pressure = 100

vm.vfs_cache_pressure 是 Linux 内核中用于调节虚拟文件系统(VFS)缓存回收行为的参数,主要影响 dentry(目录项) 和 inode(索引节点) 缓存的回收策略。以下是对其作用、配置及影响的详细说明:

作用与原理

1. 缓存类型:
- dentry 缓存:加速文件路径查找,缓存目录结构信息。
- inode 缓存:存储文件元数据(如权限、大小、时间戳等),减少磁盘读取。

2. 参数功能:
- 控制内核回收 VFS 缓存的倾向性。值越大,内核越积极回收缓存;值越小,越保留缓存。

配置方式

1. 临时调整(重启失效):

sysctl -w vm.vfs_cache_pressure=200 # 设置为 200

2. 永久生效:

- 编辑 /etc/sysctl.conf,添加:

vm.vfs_cache_pressure=50

- 应用配置:

sysctl -p

参数影响

值范围 行为表现 适用场景
< 100 内核减缓回收 VFS 缓存,提升重复文件访问速度,但可能占用更多内存。 文件密集型服务(如 Web 服务器、数据库)。
100(默认) 按默认比例回收 VFS 缓存与其他内存。 通用场景。
 > 100 内核加速回收 VFS 缓存,释放内存供应用使用,但可能增加磁盘 I/O。 内存紧张或需优先保障应用内存的场景。

 调优建议

1. 监控工具:
- free -h:观察 Slab 内存占用(包含 dentry/inode 缓存)。
- slabtop:实时查看 dentry 和 inode_cache 的缓存大小。
- vmstat 或 iostat:检查 I/O 压力变化。

2. 场景示例:
- 提升文件性能:降低值(如 50),适用于频繁访问相同文件的场景。
- 缓解内存压力:提高值(如 150),适用于内存不足且文件缓存可牺牲的情况。

3. 注意事项:
- 与 swappiness 参数协同调整(后者控制匿名内存与文件缓存的回收优先级)。
- 极端值可能导致性能波动,需结合监控逐步调整。

示例配置

# 优化文件服务器缓存保留
sysctl -w vm.vfs_cache_pressure=50

# 内存紧张环境,优先释放缓存
sysctl -w vm.vfs_cache_pressure=150

通过合理配置 vm.vfs_cache_pressure,可在文件访问速度和内存利用率之间实现平衡,适应不同工作负载需求。

30 vm.watermark_boost_factor = 15000

vm.watermark_boost_factor 是 Linux 内核中用于动态调整内存水印(watermark)的参数,影响内存回收的触发策略。以下是对其作用、配置和影响的详细说明:

作用

- 动态提升水印值:当系统经历高内存压力(如直接内存回收)后,内核会临时提高内存区域(zone)的 min、low、high 水印值。vm.watermark_boost_factor 决定了提升的幅度。
- 预防内存压力:通过更早触发内存回收(kswapd),避免频繁进入直接回收或 OOM(Out-Of-Memory)状态,提高系统稳定性。

配置

- 路径:
/proc/sys/vm/watermark_boost_factor
- 默认值:
通常为 0(不启用动态提升)或较小整数(如 15000,具体取决于内核版本)。
- 修改方式:

# 临时修改
echo <value> | sudo tee /proc/sys/vm/watermark_boost_factor

# 永久修改(在 /etc/sysctl.conf 中添加)
vm.watermark_boost_factor = <value>

 

- 取值范围:
非负整数。典型值为 0(禁用)到 100000,表示水印提升的百分比或倍数(具体公式因内核版本而异)。

影响

1. 调高参数值:
- 优点:更积极的内存回收,减少直接回收和 OOM 风险,适合需要高稳定性的场景(如数据库、实时系统)。
- 缺点:增加后台回收频率,可能导致 CPU 开销上升,空闲内存减少,影响应用性能。

2. 调低参数值:
- 优点:减少内存回收频率,最大化应用可用内存,适合内存密集型负载(如缓存服务)。
- 缺点:可能频繁触发直接回收,增加应用延迟,甚至引发 OOM。

工作机制

- 触发条件:当发生直接内存回收时,内核根据 watermark_boost_factor 动态提升水印值。
- 计算公式(示例):
提升后的水印值 = 原始水印值 × (1 + watermark_boost_factor / 10000)
(具体实现可能因内核版本不同而有所调整)
- 恢复机制:水印值会随时间逐步恢复至原始值,避免长期过度回收。

与其他参数的关系

- vm.min_free_kbytes:设置静态的最小空闲内存。若两者均配置较高,可能导致过度内存保留。
- vm.swappiness:控制回收匿名页与文件页的倾向性,与水印策略协同影响回收行为。

应用建议

- 监控工具:使用 vmstat、sar -B、/proc/vmstat(关注 pgscan_kswapd、pgsteal_kswapd、oom_kill)评估内存压力。
- 优化步骤:
1. 观察默认配置下的内存回收频率和 OOM 事件。
2. 逐步调整 watermark_boost_factor,平衡性能与稳定性。
3. 结合 vm.min_free_kbytes 和 vm.swappiness 进行综合调优。

示例场景

- Web 服务器:适度调高(如 10000),确保快速响应请求时内存充足。
- 大数据处理:调低(如 0 或 5000),优先保障应用内存使用,容忍短暂延迟。

通过合理配置 vm.watermark_boost_factor,可在内存利用率和系统稳定性间取得平衡,适应多样化的工作负载需求。

31 vm.watermark_scale_factor = 10

vm.watermark_scale_factor 是 Linux 内核中与内存管理相关的一个参数,用于动态调整内存水印(watermarks)的缩放比例。内存水印决定了系统何时触发内存回收机制(如 kswapd 或直接内存回收),其作用、配置方式及影响如下:

作用说明

1. 内存水印的作用
内存水印是内核定义的三个关键阈值(min、low、high),用于管理物理内存的回收:
- min: 系统保留的最低空闲内存,用于紧急情况(如原子内存分配)。
- low: 当空闲内存低于此值时,内核启动后台回收(kswapd)。
- high: 当空闲内存达到此值时,停止后台回收
vm.watermark_scale_factor 通过缩放因子动态调整 low 和 high 水印的位置,影响内存回收的触发时机。

2. 动态调整机制
- 默认情况下,low = min * 1.5,high = min * 3。
- 通过 vm.watermark_scale_factor,内核会基于总内存的百分比重新计算 low 和 high 水印。
- 该参数允许内核根据系统内存压力动态调整水印,更灵活地平衡内存使用与回收效率。

配置方法

1. 查看当前值

cat /proc/sys/vm/watermark_scale_factor

- 默认值:通常为 10(即 0.1% 的总内存比例)。

2. 临时修改

echo <value> > /proc/sys/vm/watermark_scale_factor

- 例如:echo 200 > /proc/sys/vm/watermark_scale_factor 设置为 2% 的总内存比例。

3. 永久生效
在 /etc/sysctl.conf 中添加:

vm.watermark_scale_factor = <value>

执行 sysctl -p 生效。

4. 取值范围
- 有效范围:0 到 1000(对应 0% 到 10% 的总内存比例)。
- 推荐值:默认 10(0.1%),可根据内存压力和性能需求调整。

影响分析

1. 调大该参数(例如设为 200)
- 效果:提高 high 和 low 水印,使内核更早触发内存回收(kswapd 更积极)。
- 优点:减少内存耗尽风险,降低直接内存回收(可能阻塞进程)的概率。
- 缺点:可能增加 CPU 开销(频繁内存回收),降低缓存利用率。

2. 调小该参数(例如设为 5)
- 效果:降低 high 和 low 水印,延迟内存回收。
- 优点:减少 CPU 开销,提高缓存命中率。
- 缺点:可能因内存不足触发直接回收,导致进程延迟(卡顿)。

3. 与 min_free_kbytes 的关系
- min_free_kbytes 设置静态的 min 水印(单位为 KB),而 watermark_scale_factor 动态调整 low 和 high。
- 两者需配合使用:若 min_free_kbytes 设置过大,可能浪费内存;若过小,watermark_scale_factor 的调整范围受限。

适用场景

1. 内存敏感型应用(如数据库、虚拟机)
- 适当增大 watermark_scale_factor,避免内存不足导致性能骤降。

2. CPU 敏感型场景
- 调小参数以减少内存回收的 CPU 开销,但需监控内存压力。

3. 默认配置
- 多数场景下,默认值 10 已足够平衡性能与稳定性。

注意事项

- 修改前需监控内存压力(如 vmstat、sar -B)及直接回收事件(grep "pgsteal" /proc/vmstat)。
- 避免极端值(如 0 或 1000),可能导致系统不稳定。
- 结合 vm.swappiness 和 vm.vfs_cache_pressure 综合优化内存行为。

通过合理配置 vm.watermark_scale_factor,可以在内存利用率与系统响应速度之间找到最佳平衡点。

内核中min、low、high的计算

setup_per_zone_wmarks
  pages_min = min_free_kbytes >> (PAGE_SHIFT - 10);
  tmp = pages_min * zone_managed_pages()
  do_div(tmp, lowmem_pages)--当lowmem_pages等于zone_managed_pages()时,tmp等于pages_min。
  tmp = max_t(u64, tmp >> 2, mult_frac(zone_managed_pages(zone), watermark_scale_factor, 10000))--取tmp的1/4,zone管理内存的water_scale_factor千分比的最大值。
  zone->watermark_boost = 0
  zone->_watermark[WMARK_LOW] = min_wmark_pages(zone) + tmp;--当water_scale_factor比较小时,tmp最终即为pages_min的1/4。增大watermark_scale_factor的值,即增大low和high的值,更早进行内存回收,回收更多内存。
  zone->_watermark[WMARK_HIGH] = low_wmark_pages(zone) + tmp;--从上面计算的结果tmp,然后MIN->LOW->HIGH->PROMO递增。
  zone->_watermark[WMARK_PROMO] = high_wmark_pages(zone) + tmp;

 在/proc/zoneinfo中有上述项的对应值:

比如我需要保证free最小值为4096KB,则watermark_scale_factor=(4096/4 - 256(min))*10000(万分比)/12701(managed)=605。

设置完后结果如下:

/proc/zoneinfo相关字段说明如下:

  • free:当前空闲内存页数。
  • boost:临时提高的 `min` 水印。
  • min:触发直接回收的最低阈值。
  • low:触发后台回收的阈值。
  • high:停止回收的阈值。
  • spanned:内存区域总地址跨度页数(含空洞)。
  • present:实际存在的物理页数。
  • managed:伙伴系统管理的可用页数。
  • cma:连续内存分配器保留的页数。
  • protection:内存区域保护机制(如 NUMA 节点间内存隔离限制)。

posted on 2025-03-22 23:59  ArnoldLu  阅读(428)  评论(0)    收藏  举报

导航