
Linux 系统内存优化不是“调大 swap 就完事”,关键在于理解内核内存管理机制,再结合实际负载做针对性调整。盲目修改可能适得其反,比如过度降低 swappiness 导致 OOM killer 频繁触发。
合理配置 swappiness 参数
swappiness(取值 0–100)控制内核倾向使用 swap 还是回收 page cache。默认值 60 适合通用服务器,但对数据库、内存密集型应用往往偏高。
- 数据库服务(如 PostgreSQL、MySQL)建议设为 1–10:优先保留文件缓存和脏页,避免因换出工作集导致性能陡降
- 内存充足(>64GB)且无长期 swap 需求的计算节点,可设为 1:仅在极端内存不足时才换出匿名页
- 不要设为 0:这会完全禁用 swap 分配(除 cgroup v2 的 memory.swap.max 外),但某些内核路径(如 kswapd 唤醒逻辑)仍依赖 swap 框架,可能导致回收延迟或OOM
- 临时生效:sudo sysctl vm.swappiness=10;永久生效:写入 /etc/sysctl.conf 或 /etc/sysctl.d/99-custom.conf
优化 dirty 页面回写行为
大量写操作(如日志服务、ETL 任务)易因 dirty_ratio / dirty_background_ratio 触发同步刷盘,造成 I/O 阻塞。
乐彼多用户商城系统,采用ASP.NET分层技术和AJAX技术,运营于高速稳定的微软.NET+MSSQL 2005平台;完全具备搭建超大型网络购物多用户网上商城的整体技术框架和应用层次LBMall 秉承乐彼软件优秀品质,后台人性化设计,管理窗口识别客户端分辨率自动调整,独立配置的菜单操作锁,使管理操作简单便捷。待办事项1、新订单、支付、付款、短信提醒2、每5分钟自动读取3、新事项声音提醒 店铺管理1
- vm.dirty_background_ratio(默认 10):后台回写启动阈值(占可用内存%)。写负载高时可适当提高(如 15–20),让 pdflush 更早介入
- vm.dirty_ratio(默认 20):强制同步刷盘阈值。建议不超过 30,否则进程会卡在 write() 等待,影响响应
- 搭配 vm.dirty_expire_centisecs(默认 3000,即 30 秒)和 vm.dirty_writeback_centisecs(默认 500,即 5 秒):缩短脏页生命周期,避免积压
- SSD 场景可适度放宽 dirty_ratio(如 25),但 HDD 环境应更保守(≤18)
限制用户态内存过度分配(Overcommit)
Linux 默认允许 overcommit(vm.overcommit_memory=0),即 malloc 成功不保证物理内存立即可用,OOM killer 在真正缺内存时才介入——这对突发性内存申请风险较高。
- 生产环境推荐设为 2:启用严格模式,按 vm.overcommit_ratio(默认 50)+ swap 大小计算可提交上限,避免虚假分配
- 需同步设置 vm.overcommit_ratio:例如 128GB 内存 + 8GB swap,设为 80 表示最多承诺约 128×0.8 + 8 = 110GB
- 注意:Java 应用开启 UseContainerSupport(JDK 10+)后,会读取 cgroup memory limit 自动调堆;若未启用且容器内存受限,仍需配合 overcommit=2 防止容器外 OOM
善用 cgroup v2 细粒度管控(现代发行版首选)
相比 cgroup v1,v2 提供统一层级与更精准的内存控制,尤其适合容器化或混部环境。
- 启用 v2:内核启动参数添加 systemd.unified_cgroup_hierarchy=1,确认 /proc/cgroups 中 systemd 是否为 1
- 限制某进程组内存上限:echo 4G > /sys/fs/cgroup/myapp/memory.max
- 设置软限制(memory.low)和 swap 上限(memory.swap.max):避免低优先级服务挤占关键服务内存
- 监控实时用量:cat /sys/fs/cgroup/myapp/memory.current 和 memory.stat 查看 pgpgin/pgpgout、oom_kill 等指标









