# CPU
---
# MEM
---
## 常见的内核参数
```bash
# 关闭swap
vm.swappiness = 0
# vm.watermark_scale_factor 用于动态调整内存水位线(watermarks)的缩放比例。分为三个关键阈值(min、low、high),用于管理物理内存的回收:
# - min: 系统保留的最低空闲内存,触发Direct Reclaim, 会加剧磁盘 IO 压力。
# - low: 当空闲内存低于此值时,内核启动后台回收(kswapd)。
# - high: 当空闲内存达到此值时,停止后台回收。
# 决定min水位线,low = min * 1.5,high = min * 3, 有效范围:0 到 1000(对应 0% 到 10% 的总内存比例)
# 在/proc/zoneinfo中有min、low、high的对应值
vm.watermark_scale_factor = 500
# 可以通过"/proc/vmstat"中的"pageoutrun"和"allocstall"来查看,两者分别代表了kswapd和direct reclaim启动的次数。
(base) [root@zzzz ~]# grep -E "pageoutrun|allocstall" /proc/vmstat
allocstall_dma 0
allocstall_dma32 0
allocstall_normal 28729166
allocstall_movable 10533
pageoutrun 6241380
# 当系统经历高内存压力(如直接内存回收)后,内核会临时提高内存区域(zone)的 min、low、high 水位值。vm.watermark_boost_factor 决定了提升的幅度。
# 预防内存压力:通过更早触发内存回收(kswapd),避免频繁进入直接回收或 OOM(Out-Of-Memory)状态,提高系统稳定性。
vm.watermark_boost_factor = 15000
# 用于查看 物理内存中各个 zone 的空闲页分布的重要命令,尤其在内存碎片化、内存分配失败(如 order 高的分配失败)时非常有用。
# Node: NUMA 节点号
# zone: 内存区域(DMA、DMA32、Normal、Movable 等)
# 接下来的 11 个数字: 分别表示 order=0 到 order=10 的空闲页块数量
# order=0 表示 1 页(4KB), order=1 表示 2 页(8KB)......, order=10 表示 1024 页(4MB)
# 每一个数字表示当前有多少个对应大小的 连续物理内存块 可分配
# 多用于判断内存碎片化, 比如: order=0 有很多,高 order 的数量是 0
(base) [root@zzzz ~]# cat /proc/buddyinfo
Node 0, zone DMA 1 0 0 0 0 0 0 0 1 1 3
Node 0, zone DMA32 6 8 9 6 7 5 3 5 2 5 455
Node 0, zone Normal 13630 18308 90520 123480 213137 198410 152556 107402 64820 56306 0
Node 1, zone Normal 5156 5187 47534 51478 237809 232256 179879 126473 74265 44027 184
# 手动触发内存压缩,将分散的空闲页面整理成连续页面
# compact_memory 不会释放内存,只是重新整理空闲内存页的位置。
echo 1 > /proc/sys/vm/compact_memory
# 后台自动压缩,开启持续性压缩行为
# 1-100:数值越大越“积极压缩”
vm.compaction_proactiveness = 50
# 设置触发后台脏页回写的绝对内存阈值(字节单位)
# 0:禁用绝对值模式,改用 dirty_background_ratio(比例模式)。
# ≥1:指定具体字节数(如 1048576 = 1MB)。
vm.dirty_background_bytes = 0
# 当系统内存中脏页占比 ≥ 设定比例时,触发 异步后台回写(不阻塞应用)
# 配置范围:0 ~ 100(百分比)
# 低值(如 5):频繁小批量回写,减少数据丢失风险,但增加I/O负载
# 高值(如 20):延迟回写,提升写入吞吐,但内存不足时可能突发高I/O
vm.dirty_background_ratio = 10
# 设置触发同步脏页回写的绝对内存阈值(字节单位)
# 0:禁用绝对值模式,改用 dirty_ratio(比例模式)
# ≥1:指定具体字节数
vm.dirty_bytes = 0
# 脏页在内存中驻留的最长时间(单位:1/100秒),超时后强制回写
# 短时间(如 1000=10秒):频繁回写,减少数据丢失,但增加I/O压力
# 长时间(如 3000=30秒):适合批量写入场景(如日志服务器),但崩溃时可能丢失更多数据
vm.dirty_expire_centisecs = 3000
# 当系统内存中脏页占比 ≥ 设定比例时,触发 同步阻塞回写(应用写入被暂停)
# 低值(如 10):快速回写,减少阻塞,但限制写入吞吐
# 高值(如 30):允许更多脏页累积,提升突发写入性能,但可能导致应用卡顿
vm.dirty_ratio = 20
# 内核周期性唤醒回写线程的时间间隔(单位:1/100秒)
# 短间隔(如 100=1秒):实时回写,减少数据驻留时间,适合低延迟存储(如SSD)
# 长间隔(如 500=5秒):降低CPU开销,但可能延迟回写
vm.dirty_writeback_centisecs = 500
# 标记为“脏页”的最长保留时间(秒),超时后可能被优先回收
# 短时间(如 3600=1小时):加速回收长期未访问的脏页,节省内存
# 长时间(如 43200=12小时):减少频繁回收,适合内存充足且需要缓存持久化的场景
vm.dirtytime_expire_seconds = 43200
```

Linux中的内存回收 [一]: https://zhuanlan.zhihu.com/p/70964195
Linux中的内存回收[二]: https://zhuanlan.zhihu.com/p/72998605
Linux内存调节之zone watermark: https://zhuanlan.zhihu.com/p/73539328
内存相关的内核参数: https://www.cnblogs.com/arnoldlu/p/18782680
# DISK
---

操作系统基础知识