修改/etc/sysctl.conf后需运行sysctl -p手动重载,否则不生效;注意注释、语法错误及/etc/sysctl.d/下同名参数的优先级覆盖。
修改 /etc/sysctl.conf 后不生效?先确认加载机制
改完 /etc/sysctl.conf 没反应,大概率是没触发重载。linux 不会自动监听文件变化,必须显式应用。
-
sysctl -p是最常用方式,它读取默认配置文件并立即生效;如果指定了路径(如sysctl -p /etc/sysctl.conf),会精确加载该文件 - 注意:若配置行开头有
#或格式错误(比如等号前后缺空格、值含非法字符),sysctl -p会报错并中断后续加载,常见错误信息:error: "xxx" is an unknown key或syntax error - 某些发行版(如较新版本的 Ubuntu)启用了
systemd-sysctl,此时还需检查/etc/sysctl.d/*.conf是否存在同名参数——后者优先级更高,可能覆盖你写的值
kernel.shmmax 和 kernel.shmall 到底设多大?看实际需求别硬套公式
这两个参数控制共享内存段上限,PostgreSQL、Oracle、Redis 等常依赖它们。设小了会报 Cannot allocate memory;设太大又浪费或触发 OOM killer。
-
kernel.shmmax:单个共享内存段最大字节数,建议不超过物理内存的 80%,且不能超过2^32-1(约 4GB)在 32 位系统上;64 位系统可设到64G甚至更高,但 PostgreSQL 通常用不到超过32G -
kernel.shmall:系统能使用的共享内存总页数(一页 = 4KB),值 =shmmax / 4096(向上取整),但需确保不超/proc/sys/kernel/shmall当前上限 - 验证是否生效:
ipcs -l查看 “Maximum total shared memory” 是否匹配你设的shmall * 4096
vm.swappiness 调成 0 真的更稳?得看 workload 类型
这个参数影响内核倾向使用 swap 还是回收 page cache。很多人无脑设成 0,结果反而引发 IO 尖峰或 OOM。
- 数据库类服务(如 PostgreSQL、MySQL)适合设为
1~10:既避免频繁 swap,又保留一点缓冲余地应对突发内存压力 - 纯计算型或内存充足的服务可设为
0,但要注意:Linux 4.5+ 内核中swappiness=0并非完全禁用 swap,只是跳过匿名页回收,file-backed page 仍可能被换出 - 设为
0后若内存耗尽,OOM killer 更容易被触发,而不是优雅降级;建议搭配vm.vfs_cache_pressure(默认 100)适当调高(如 150),加速 inode/dentry 缓存回收
调整 vm.dirty_* 参数时,SSD 和 HDD 的取舍逻辑完全不同
这些参数决定脏页写回策略,直接影响磁盘 IO 行为和数据持久性风险。
-
vm.dirty_ratio(默认 20)和vm.dirty_background_ratio(默认 10):单位是内存百分比。HDD 建议保持默认或略降(如 5/15),避免后台刷盘太猛拖慢响应;SSD 可适当提高(如 15/30),利用其高 IOPS 吞吐 -
vm.dirty_expire_centisecs(默认 3000,即 30 秒):脏页“保质期”。对延迟敏感服务(如实时日志采集),建议降到500(5 秒)以内,防止大量脏页堆积后集中刷盘 - 关键提醒:修改
vm.dirty_ratio>vm.dirty_background_ratio是必须的,否则内核行为未定义;且所有dirty_*值都以 centiseconds(厘秒)为单位,别误写成毫秒或秒
内核参数不是调得越激进越好,尤其是涉及内存回收和 IO 调度的项,微小改动可能在高负载下放大成雪崩效应。最稳妥的做法是每次只改一个参数,配合 sysctl -w 临时生效 + stress-ng 或真实业务压测验证,再写入 sysctl.conf。

















