真正生效需修改/etc/sysctl.conf并执行sysctl -p加载;vm.swappiness=10适用于数据库,Redis建议设1,K8s节点设0;端口范围应扩至1024–65000并配合tcp_fin_timeout=30和tcp_tw_reuse=1;SSD需改I/O调度器为noop且挂载加noatime。

直接改 /etc/sysctl.conf 才算真正生效
临时用 sysctl -w 改参数,重启就丢——生产环境必须写进 /etc/sysctl.conf。改完别忘了运行 sysctl -p 加载,否则配置只是躺在文件里。常见错误是只执行了 echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf 却漏掉 sysctl -p,结果压测时 TIME_WAIT 还是堆满。
vm.swappiness=10 不是万能,但数据库必须设
这个值控制内核多“想”用 swap。默认 60 太激进,内存稍有压力就开始换页;设成 0 表示“完全不用”,但可能触发 OOM killer 杀进程;vm.swappiness=10 是折中选择,尤其对 MySQL、PostgreSQL 等内存敏感服务:
- Redis 建议设为
1(几乎不用 swap) - Kubernetes 节点常强制设为
0(kubelet 要求) - Web 服务器可设为
30,平衡缓存与稳定性
注意:修改后用 cat /proc/sys/vm/swappiness 验证,不是看 free -h 的 swap 使用率。
高并发场景下,net.ipv4.ip_local_port_range 必须扩
默认端口范围是 32768 65535,仅约 3.2 万个可用端口。单机做反向代理或短连接客户端时,很容易耗尽,表现为 Cannot assign requested address 错误。正确做法是:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 把范围扩到
1024 65000(避开 1–1023 特权端口) - 配合
net.ipv4.tcp_fin_timeout = 30缩短 FIN_WAIT2 状态时间 - 若大量主动发起连接,再加
net.ipv4.tcp_tw_reuse = 1
不要盲目调 net.ipv4.tcp_tw_recycle——它在 NAT 环境下会导致连接失败,已被 4.12+ 内核移除。
磁盘 I/O 优化绕不开调度器和挂载选项
SSD 或 NVMe 盘必须换调度器,否则默认 cfq 会引入无谓延迟:
- 查当前调度器:
cat /sys/block/sda/queue/scheduler - 临时切到
noop:echo noop > /sys/block/sda/queue/scheduler - 永久生效:在
/etc/default/grub的GRUB_CMDLINE_LINUX加elevator=noop,然后update-grub && reboot
同时挂载时加 noatime,nodiratime,避免每次读文件都更新访问时间戳——这对日志、数据库目录特别有效。但注意:relatime 是更安全的替代方案,兼顾兼容性。
真正难的不是记参数,而是判断哪些该动、哪些不该碰。比如 vm.dirty_ratio 调太高可能让写操作突然卡住几秒,而 sched_latency_ns 改错反而增加小包延迟。每项调整前,先用 sysctl -a | grep xxx 看当前值,再结合业务类型和监控数据下结论。


















