6月21日 21:21

Linux 内核参数调优常用网络内存参数有哪些?

Linux 内核参数调优先看什么?

Linux 内核参数调优常见入口是 sysctl,参数主要分布在网络、内存、文件系统、进程资源和安全几个方向。它不是把网上的配置复制一遍就完事,而是要结合业务负载、机器规格、连接量、磁盘类型和监控数据逐项验证。

最稳妥的做法是:先记录当前值,再小步修改,观察指标,最后写入 /etc/sysctl.d/*.conf 持久化。

bash
sysctl net.core.somaxconn sysctl -w net.core.somaxconn=4096 sysctl -a | grep tcp

持久化示例:

bash
cat >/etc/sysctl.d/99-app-tuning.conf <<'EOF' net.core.somaxconn = 4096 net.ipv4.tcp_max_syn_backlog = 8192 vm.swappiness = 10 fs.file-max = 2097152 EOF sysctl --system

网络参数常调哪些?

网络参数通常是 Web 服务、网关、长连接服务最先碰到的瓶颈。重点看监听队列、半连接队列、缓冲区、Keepalive、端口范围和 SYN 防护。

net.core.somaxconn 控制监听 socket 的最大连接队列上限。Nginx、Node.js、Java 服务的 backlog 即使设置得很大,也会被这个内核上限截断。net.ipv4.tcp_max_syn_backlog 控制 TCP 半连接队列大小。突发连接多、握手阶段排队明显时,这个参数很关键。

conf
net.core.somaxconn = 4096 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_syncookies = 1

吞吐量高、跨机房传输、延迟较大的链路,常会调整收发缓冲区:

conf
net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216

长连接服务常调 TCP Keepalive:

conf
net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 5

高并发短连接场景要关注本地临时端口范围和 TIME_WAIT:

conf
net.ipv4.ip_local_port_range = 10240 65535 net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_tw_reuse = 1

需要特别注意:net.ipv4.tcp_tw_recycle 已经在新内核中移除,老资料里还会看到它,但线上应避免使用。它和 NAT 环境兼容性很差,可能导致同一出口后的客户端连接异常。

内存参数常调哪些?

vm.swappiness 控制内核使用 swap 的倾向,值越高越容易换出匿名页。数据库、缓存、延迟敏感服务通常会把它调低,例如 1-10。

conf
vm.swappiness = 10

脏页参数决定文件写入后什么时候触发后台回写、什么时候阻塞前台写入:

conf
vm.dirty_background_ratio = 5 vm.dirty_ratio = 20

大内存机器也可以使用字节级参数,让阈值更可控:

conf
vm.dirty_background_bytes = 268435456 vm.dirty_bytes = 1073741824

内存超分相关参数:

conf
vm.overcommit_memory = 0 vm.overcommit_ratio = 50

Redis、数据库、大型 JVM 服务要谨慎修改,避免 fork、AOF rewrite、备份任务时因为内存承诺失败而出问题。

HugePages 适合部分数据库、虚拟化或高性能计算场景:

conf
vm.nr_hugepages = 1024

它能减少页表开销,但也会预留固定内存。不是所有服务都能受益,配置前要确认应用是否支持。

文件系统与进程参数有哪些?

高并发服务常见报错是 Too many open files,这通常不只和应用有关,也和系统文件句柄上限有关。

conf
fs.file-max = 2097152 fs.nr_open = 1048576

实际还要配合 ulimit -n、systemd 的 LimitNOFILE、容器运行参数一起看。

inotify 适合文件监听多的场景,例如前端构建、日志采集、配置中心 Agent:

conf
fs.inotify.max_user_watches = 524288 fs.inotify.max_user_instances = 1024 fs.inotify.max_queued_events = 32768

数据库或存储服务使用 native AIO 时,可关注:

conf
fs.aio-max-nr = 1048576

进程数、线程数、共享内存和信号量在数据库、中间件、容器宿主机上比较常见:

conf
kernel.pid_max = 4194304 kernel.threads-max = 2060000 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 kernel.sem = 250 32000 100 128

安全相关参数有哪些?

安全参数不能为了“能连通”随意关闭,尤其是边界机器、网关、云主机。

conf
net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 kernel.dmesg_restrict = 1 kernel.kptr_restrict = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0

rp_filter 可减少 IP 欺骗风险,但多网卡、多出口、策略路由场景可能需要按网卡单独调整。

如何按业务负载调优?

Web 网关通常优先看 somaxconntcp_max_syn_backlog、端口范围、Keepalive、文件句柄。数据库通常优先看 swappiness、dirty 参数、overcommit、HugePages、aio、共享内存和信号量。容器宿主机通常关注文件句柄、inotify、PID/线程上限、网络 backlog、conntrack 与 cgroup 限制。

修改后要验证:

bash
sysctl net.core.somaxconn vm.swappiness fs.file-max ss -s cat /proc/sys/fs/file-nr vmstat 1 iostat -x 1 dmesg -T | tail journalctl -k -n 100

内核参数调优的结果应该能在监控里看到,而不是只停留在配置文件里。真正可靠的调优,是知道每个参数影响什么、适合什么负载、修改后用什么指标验证,并且能快速回滚。

标签:Linux