面对突发的流量洪峰,你的服务器是否曾因连接数暴涨而拒绝服务?或是数据库在压力下出现令人头疼的性能抖动?很多时候,问题的根源并非应用代码,而在于操作系统内核的“默认设置”未能跟上业务发展的步伐。对 /etc/sysctl.conf 进行针对性调优,是释放系统潜力、保障服务稳定的关键一步。
本文将为你提供一份从诊断、优化到验证的完整清单,覆盖高并发 Web 服务器、数据库以及容器(K8s/Docker)宿主机等核心生产场景。
适用场景 & 前置条件
适用业务:高并发 Web/API 服务器、数据库服务器、负载均衡器、容器宿主机(QPS > 1000)
前置条件:
- Linux 内核 ≥ 3.10(RHEL 7)/ ≥ 4.15(Ubuntu 18.04)
- Root 权限或可 sudo
- 现有配置备份(
/etc/sysctl.conf 或 /etc/sysctl.d/*.conf)
- 了解当前业务类型(CPU 密集/网络密集/内存密集)
环境与版本矩阵
| 内核版本 |
OS 支持 |
典型应用场景 |
关键差异 |
| 3.10.x |
RHEL/CentOS 7 |
传统 Web/数据库 |
BBR 不可用,需升级内核 |
| 4.9.x |
Ubuntu 16.04, Debian 9 |
通用服务器 |
BBR 可用(需手动启用) |
| 4.15.x |
Ubuntu 18.04 |
容器宿主机 |
cgroup v1,net.core 参数更多 |
| 5.4.x+ |
RHEL 8, Ubuntu 20.04/22.04 |
高性能计算/K8s |
cgroup v2,TCP 拥塞控制增强 |
快速清单(Checklist)
- 备份当前内核参数(
sysctl -a 导出)
- 识别业务类型与瓶颈(CPU/网络/内存/磁盘 I/O)
- 应用网络连接数优化(高并发 TCP 连接)
- 优化 TCP 协议栈(快速回收/TIME_WAIT/BBR)
- 调整内存与 Swap 策略(OOM/脏页回写)
- 优化文件描述符与 IPC 限制(ulimit/共享内存)
- 应用参数并验证(
sysctl -p 与回显确认)
- 压测验证性能提升(wrk/ab/sysbench)
- 监控关键指标变化(连接数/丢包率/延迟)
- 持久化配置并文档化(版本管理与变更记录)
实施步骤
Step 1:备份当前内核参数
导出所有当前参数:
# 导出到文件
sysctl -a > /root/sysctl-backup-$(date +%Y%m%d-%H%M%S).txt
# 备份配置文件
cp /etc/sysctl.conf /etc/sysctl.conf.backup
cp -r /etc/sysctl.d/ /etc/sysctl.d.backup/
验证备份完整性:
wc -l /root/sysctl-backup-*.txt
# 预期输出:800-1200 行(根据内核版本)
查看当前关键参数:
sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog net.ipv4.ip_local_port_range
Step 2:识别业务类型与瓶颈
诊断网络连接数瓶颈:
# 查看当前连接数
ss -s
# 查看 TIME_WAIT 连接数
ss -tan | grep TIME_WAIT | wc -l
# 查看 SYN_RECV 连接数(半连接队列)
ss -tan | grep SYN_RECV | wc -l
# 查看监听队列溢出统计
netstat -s | grep -E "listen|overflow"
预期问题特征:
TIME_WAIT > 5000:需优化快速回收
SYN_RECV > 100:需增大半连接队列
listen queue overflow:需增大 somaxconn
诊断内存瓶颈:
free -h
cat /proc/meminfo | grep -E "Dirty|Writeback|Committed"
预期问题特征:
Dirty > 1GB:脏页过多影响 I/O
Committed_AS > MemTotal:内存超卖严重
Step 3:应用网络连接数优化(高并发场景)
创建 /etc/sysctl.d/90-network-tuning.conf:
# === 网络核心参数 ===
# 增大监听队列长度(应用层 listen() 的 backlog 上限)
# 默认 128,高并发场景建议 4096-65535
net.core.somaxconn = 65535
# 增大网卡接收队列(防止网卡丢包)
# 默认 1000,建议 10000-65535
net.core.netdev_max_backlog = 65535
# 增大系统默认接收/发送缓冲区(单位:字节)
# 默认 ~200KB,建议 4MB
net.core.rmem_default = 4194304
net.core.wmem_default = 4194304
# 增大系统最大接收/发送缓冲区
# 默认 ~4MB,建议 16MB
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# === TCP 协议栈优化 ===
# 增大 TCP 半连接队列(SYN_RECV 状态)
# 默认 128/256,高并发建议 8192-65535
net.ipv4.tcp_max_syn_backlog = 65535
# 扩大本地端口范围(客户端连接可用端口)
# 默认 32768-60999,建议 10000-65535(支持 55535 个并发连接)
net.ipv4.ip_local_port_range = 10000 65535
# 增大全局最大连接数(所有 TCP 连接的跟踪表)
# 默认根据内存动态计算,手动设置可避免自动限制
net.netfilter.nf_conntrack_max = 1048576
net.nf_conntrack_max = 1048576 # 旧版内核兼容
# 增大连接跟踪表 bucket 数量(优化查找性能)
# 建议为 nf_conntrack_max 的 1/4
net.netfilter.nf_conntrack_buckets = 262144
# === TCP 缓冲区自动调优 ===
# TCP 读缓冲区(min/default/max,单位:字节)
# 第 3 值为单连接最大值,建议 16MB(支持高带宽长肥网络)
net.ipv4.tcp_rmem = 4096 87380 16777216
# TCP 写缓冲区
net.ipv4.tcp_wmem = 4096 65536 16777216
# TCP 内存限制(min/pressure/max,单位:页,1 页 = 4KB)
# 计算公式:(总内存 GB × 0.25) / 4 × 1024 × 1024
# 示例:32GB 内存 → max = 2097152 页 = 8GB
net.ipv4.tcp_mem = 786432 1048576 2097152
应用配置:
sysctl -p /etc/sysctl.d/90-network-tuning.conf
验证生效:
sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog net.ipv4.ip_local_port_range
预期输出:
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 10000 65535
Step 4:优化 TCP 协议栈(连接复用与快速回收)
继续编辑 /etc/sysctl.d/90-network-tuning.conf:
# === TCP TIME_WAIT 优化 ===
# 启用 TIME_WAIT 快速回收(客户端场景,如反向代理/负载均衡)
# 注意:不适用于 NAT 环境(可能导致连接失败)
net.ipv4.tcp_tw_reuse = 1
# TIME_WAIT 超时时间(秒)
# 默认 60s,可降低到 30s(需确保网络延迟 < 15s)
# 注意:内核 4.12+ 已移除此参数,改为固定 60s
# net.ipv4.tcp_tw_timeout = 30 # 仅旧内核支持
# 减少 TIME_WAIT 连接数(通过启用快速回收 + 端口复用)
# 已通过 tcp_tw_reuse 实现
# === TCP 连接保活 ===
# TCP keepalive 探测间隔(秒)
# 默认 75s,建议 30s(快速检测死连接)
net.ipv4.tcp_keepalive_intvl = 30
# TCP keepalive 探测次数
# 默认 9 次,建议 3 次(90 秒内检测出死连接)
net.ipv4.tcp_keepalive_probes = 3
# TCP keepalive 空闲时间(秒)
# 默认 7200s(2 小时),建议 600s(10 分钟)
net.ipv4.tcp_keepalive_time = 600
# === TCP 拥塞控制(BBR 算法)===
# 查看可用拥塞控制算法
# sysctl net.ipv4.tcp_available_congestion_control
# 启用 BBR(需要内核 4.9+)
# BBR 可显著提升带宽利用率与降低延迟
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq # BBR 依赖 FQ 队列调度
# === TCP 快速打开(TFO)===
# 启用 TCP Fast Open(客户端 + 服务端)
# 0=禁用, 1=客户端, 2=服务端, 3=全部启用
# 建议值:3(需应用层支持,如 Nginx 1.5.8+)
net.ipv4.tcp_fastopen = 3
# === FIN_WAIT 超时优化 ===
# 减少 FIN_WAIT2 超时时间(秒)
# 默认 60s,建议 30s
net.ipv4.tcp_fin_timeout = 30
# === SYN Cookie(防 SYN Flood 攻击)===
# 启用 SYN Cookie
# 当 SYN 队列溢出时,使用 Cookie 机制避免拒绝连接
net.ipv4.tcp_syncookies = 1
# 增大 SYN Cookie 的重试次数
# 默认 5,建议 2(减少握手延迟)
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
关键参数解释:
tcp_tw_reuse:允许新连接复用 TIME_WAIT 状态的端口(仅客户端)
tcp_congestion_control = bbr:使用 BBR 算法替代 CUBIC(需内核 4.9+)
tcp_fastopen:首次握手时携带数据(减少 1 RTT 延迟)
验证 BBR 启用:
# 检查当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control
# 检查 BBR 模块是否加载
lsmod | grep tcp_bbr
如 BBR 未加载(需手动加载):
# 加载 BBR 模块
modprobe tcp_bbr
# 持久化加载
echo "tcp_bbr" >> /etc/modules-load.d/bbr.conf
应用配置:
sysctl -p /etc/sysctl.d/90-network-tuning.conf
Step 5:调整内存与 Swap 策略
创建 /etc/sysctl.d/91-memory-tuning.conf:
# === Swap 策略 ===
# 降低 Swap 使用倾向(swappiness)
# 默认 60,建议值:
# - 0-10:数据库/缓存服务器(避免性能抖动)
# - 10-30:通用服务器
# - 60:桌面系统
vm.swappiness = 10
# === 脏页回写优化 ===
# 脏页占总内存的百分比阈值(触发后台回写)
# 默认 10-20%,建议 5%(避免突发 I/O)
vm.dirty_background_ratio = 5
# 脏页占总内存的百分比阈值(触发阻塞回写)
# 默认 20-40%,建议 10%
vm.dirty_ratio = 10
# 脏页最长存活时间(厘秒,1/100 秒)
# 默认 3000(30 秒),建议 1500(15 秒)
vm.dirty_expire_centisecs = 1500
# 脏页回写间隔(厘秒)
# 默认 500(5 秒),建议 200(2 秒)
vm.dirty_writeback_centisecs = 200
# === 内存分配策略 ===
# 内存超卖策略(overcommit)
# 0=严格检查, 1=允许超卖, 2=允许超卖但限制在 overcommit_ratio
# 建议值:容器宿主机=0,通用服务器=1
vm.overcommit_memory = 1
# 超卖比例(百分比)
# 默认 50,仅当 overcommit_memory=2 时生效
vm.overcommit_ratio = 80
# === OOM Killer 策略 ===
# 内核 Panic 行为(OOM 时是否重启)
# 0=不重启, 1=重启
# 生产环境建议 0(避免自动重启)
vm.panic_on_oom = 0
# OOM Killer 触发阈值(0-100)
# 默认 0(内存完全耗尽时触发)
# 可设置为 5-10(预留缓冲)
# vm.admin_reserve_kbytes = 8192 # 预留 8MB 给 root 用户
# === 透明大页(THP)===
# 禁用透明大页(数据库场景建议禁用)
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 通过 systemd 持久化(需创建 systemd 服务)
关键参数解释:
vm.swappiness:值越低,内核越倾向使用物理内存
vm.dirty_ratio:脏页达到此阈值时,写入进程会被阻塞(影响性能)
vm.overcommit_memory=1:允许申请超过物理内存的空间(适合 fork 密集场景)
禁用透明大页(数据库/Redis 场景):
# 临时禁用
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 持久化禁用(通过 systemd)
cat > /etc/systemd/system/disable-thp.service << EOF
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service mysql.service redis.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'
[Install]
WantedBy=basic.target
EOF
systemctl enable disable-thp.service
systemctl start disable-thp.service
应用配置:
sysctl -p /etc/sysctl.d/91-memory-tuning.conf
验证生效:
sysctl vm.swappiness vm.dirty_ratio vm.overcommit_memory
cat /sys/kernel/mm/transparent_hugepage/enabled
Step 6:优化文件描述符与 IPC 限制
创建 /etc/sysctl.d/92-limits-tuning.conf:
# === 文件描述符限制 ===
# 系统级最大文件描述符数量
# 默认 ~100000,高并发建议 1000000-10000000
fs.file-max = 2097152
# 单个进程最大文件描述符数(需配合 ulimit)
# 通过 /etc/security/limits.conf 设置
# === 共享内存限制(数据库/消息队列场景)===
# 单个共享内存段最大字节数
# 默认 32MB,数据库建议设置为物理内存的 50%
# 计算公式:物理内存(GB) × 0.5 × 1024^3
# 示例:32GB 内存 → 17179869184(16GB)
kernel.shmmax = 68719476736 # 64GB
# 系统范围共享内存总量(页数,1 页 = 4KB)
# 默认值较低,建议设置为 shmmax / 4096
kernel.shmall = 16777216 # 64GB / 4KB
# 共享内存段最大数量
# 默认 4096,大规模容器宿主机建议 65536
kernel.shmmni = 65536
# === 信号量限制 ===
# 信号量参数(数据库场景)
# 格式:SEMMSL SEMMNS SEMOPM SEMMNI
# SEMMSL:每个信号量集最大信号量数
# SEMMNS:系统范围最大信号量数
# SEMOPM:每次 semop 调用最大操作数
# SEMMNI:系统范围最大信号量集数
kernel.sem = 250 32000 100 128
# === IPC 消息队列 ===
# 单个消息最大字节数
# 默认 8192,建议 65536
kernel.msgmax = 65536
# 单个队列最大字节数
# 默认 16384,建议 1048576(1MB)
kernel.msgmnb = 1048576
配合 ulimit 调整进程级限制:
编辑 /etc/security/limits.conf:
# 格式:<domain> <type> <item> <value>
# 所有用户打开文件数限制
* soft nofile 1048576
* hard nofile 1048576
# 特定用户(如 nginx/mysql)
nginx soft nofile 1048576
nginx hard nofile 1048576
mysql soft nofile 1048576
mysql hard nofile 1048576
# 进程数限制
* soft nproc 65536
* hard nproc 65536
# 核心转储文件大小(调试用,生产环境可设为 0)
* soft core 0
* hard core 0
验证 ulimit 生效(需重新登录):
# 查看当前会话限制
ulimit -a
# 查看特定进程的限制
cat /proc/$(pidof nginx | awk '{print $1}')/limits
应用配置:
sysctl -p /etc/sysctl.d/92-limits-tuning.conf
Step 7:容器宿主机专用优化(K8s/Docker)
创建 /etc/sysctl.d/93-container-tuning.conf:
# === 网桥与 iptables ===
# 允许 iptables 处理桥接流量(K8s 必需)
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
# 启用 IP 转发(容器间路由)
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
# === Netfilter 连接跟踪 ===
# 增大连接跟踪表(容器密集场景)
net.netfilter.nf_conntrack_max = 2097152
# 连接跟踪超时(秒)
# TCP 已建立连接超时,默认 432000(5 天),建议 3600(1 小时)
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
# TIME_WAIT 连接跟踪超时,默认 120s,建议 30s
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
# === ARP 缓存 ===
# 增大 ARP 缓存表(大量 Pod 场景)
# 默认 ~256,建议 8192
net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 4096
net.ipv4.neigh.default.gc_thresh3 = 8192
# === 内核线程数 ===
# 增大内核线程数限制(容器密集场景)
kernel.threads-max = 1048576
kernel.pid_max = 4194304
# === 虚拟内存 ===
# 降低容器场景的内存回收激进度
vm.min_free_kbytes = 1048576 # 预留 1GB 空闲内存
关键参数解释:
net.bridge.bridge-nf-call-iptables:K8s Service 流量经过 iptables 规则
nf_conntrack_max:容器化场景连接数通常 > 虚拟机
vm.min_free_kbytes:预留内存避免内存碎片导致 OOM
应用配置:
# 加载 br_netfilter 模块(K8s 必需)
modprobe br_netfilter
echo "br_netfilter" >> /etc/modules-load.d/k8s.conf
sysctl -p /etc/sysctl.d/93-container-tuning.conf
Step 8:压测验证性能提升
Web 服务器压测(使用 wrk):
# 安装 wrk
# Ubuntu
sudo apt install -y wrk
# RHEL/CentOS(需要 EPEL)
sudo yum install -y epel-release && sudo yum install -y wrk
# 压测前记录基线
wrk -t 8 -c 1000 -d 60s --latency http://localhost/
# 应用内核参数调优后重新压测
wrk -t 8 -c 1000 -d 60s --latency http://localhost/
预期性能提升(高并发场景):
- QPS 提升:15-30%
- P99 延迟降低:20-40%
- 连接错误率:从 5% → < 0.1%
数据库压测(使用 sysbench):
# 安装 sysbench
# Ubuntu
sudo apt install -y sysbench
# RHEL/CentOS
sudo yum install -y sysbench
# OLTP 读写混合压测
sysbench oltp_read_write \
--mysql-host=localhost \
--mysql-user=test \
--mysql-password=password \
--tables=10 \
--table-size=100000 \
--threads=64 \
--time=60 \
run
预期性能提升(数据库场景):
- TPS 提升:10-20%
- 查询延迟降低:10-25%
Step 9:监控关键指标变化
网络连接数监控:
# 实时监控连接状态分布
watch -n 1 'ss -s'
# 监控 TIME_WAIT 连接数
watch -n 1 'ss -tan | grep TIME_WAIT | wc -l'
连接跟踪表使用率:
# 当前连接数 / 最大连接数
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max
# 计算使用率
echo "scale=2; $(cat /proc/sys/net/netfilter/nf_conntrack_count) / $(cat /proc/sys/net/netfilter/nf_conntrack_max) * 100" | bc
内存与 Swap 监控:
# 实时监控内存使用
watch -n 1 free -h
# 监控脏页数量
watch -n 1 'cat /proc/meminfo | grep -E "Dirty|Writeback"'
Prometheus 监控指标:
# 连接跟踪表使用率
node_nf_conntrack_entries / node_nf_conntrack_entries_limit > 0.8
# TIME_WAIT 连接数
node_sockstat_TCP_tw > 10000
# 监听队列溢出
rate(node_netstat_TcpExt_ListenOverflows[5m]) > 0
# 脏页占比
node_memory_Dirty_bytes / node_memory_MemTotal_bytes > 0.1
Step 10:持久化配置并文档化
合并所有配置到单文件(可选):
# 合并到 /etc/sysctl.d/99-production.conf
cat /etc/sysctl.d/90-network-tuning.conf \
/etc/sysctl.d/91-memory-tuning.conf \
/etc/sysctl.d/92-limits-tuning.conf \
/etc/sysctl.d/93-container-tuning.conf \
> /etc/sysctl.d/99-production.conf
版本管理:
cd /etc
git init
git add sysctl.conf sysctl.d/*.conf security/limits.conf
git commit -m "Initial kernel tuning configuration"
创建变更记录文档 /etc/sysctl.d/README.md:
# 内核参数调优记录
## 变更日期:2025-10-31
## 变更人:SRE Team
## 业务场景:高并发 Web 服务器(Nginx + K8s)
### 关键变更:
1. 增大监听队列:somaxconn 65535
2. 启用 BBR 拥塞控制
3. TIME_WAIT 快速回收:tcp_tw_reuse=1
4. 降低 Swap 使用:swappiness=10
5. 禁用透明大页(THP)
### 性能基线:
- 调优前:QPS 15000, P99 50ms, 连接错误率 3%
- 调优后:QPS 22000, P99 30ms, 连接错误率 0.05%
### 回滚命令:
```bash
cp /etc/sysctl.conf.backup /etc/sysctl.conf
sysctl -p
监控与告警
关键内核指标监控
# 监听队列溢出
netstat -s | grep "times the listen queue of a socket overflowed"
# SYN 丢弃统计
netstat -s | grep "SYNs to LISTEN sockets dropped"
# TCP 重传率
netstat -s | grep "segments retransmitted"
**Prometheus 告警规则**:
```yaml
groups:
- name: kernel-tuning
rules:
- alert: HighConntrackUsage
expr: node_nf_conntrack_entries / node_nf_conntrack_entries_limit > 0.9
for: 5m
annotations:
summary: "连接跟踪表使用率超过 90%"
- alert: ListenQueueOverflow
expr: rate(node_netstat_TcpExt_ListenOverflows[5m]) > 0
for: 1m
annotations:
summary: "监听队列溢出,需增大 somaxconn"
- alert: HighSwapUsage
expr: (node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) / node_memory_SwapTotal_bytes > 0.5
for: 10m
annotations:
summary: "Swap 使用率超过 50%,检查内存泄漏"
性能与容量
不同业务场景推荐配置
| 场景 |
关键参数 |
推荐值 |
| 高并发 Web |
somaxconn |
65535 |
|
tcp_max_syn_backlog |
65535 |
|
ip_local_port_range |
10000-65535 |
|
tcp_tw_reuse |
1 |
| 数据库 |
swappiness |
1-10 |
|
shmmax |
物理内存 × 0.5 |
|
THP |
disabled |
| 负载均衡器 |
nf_conntrack_max |
2097152 |
|
tcp_tw_reuse |
1 |
|
tcp_congestion_control |
bbr |
| 容器宿主机 |
nf_conntrack_max |
2097152 |
|
pid_max |
4194304 |
|
bridge-nf-call-iptables |
1 |
| CDN 边缘节点 |
tcp_congestion_control |
bbr |
|
tcp_fastopen |
3 |
|
tcp_rmem/wmem |
最大值 32MB |
安全与合规
防 DDoS 参数
# 启用 SYN Cookie(防 SYN Flood)
net.ipv4.tcp_syncookies = 1
# 减少 SYN 重试次数(快速丢弃攻击连接)
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
# 启用反向路径过滤(防 IP 欺骗)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 禁用 ICMP 重定向(防中间人攻击)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# 禁用源路由(防路由劫持)
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 启用 TCP 时间戳(防序列号猜测)
net.ipv4.tcp_timestamps = 1
# 记录可疑数据包(Martian Packets)
net.ipv4.conf.all.log_martians = 1
合规核对点
- [ ] 参数变更通过变更管理流程(CAB 审批)
- [ ] 生产环境变更前在测试环境完整验证
- [ ] 配置纳入版本控制(Git)并记录变更原因
- [ ] 关键参数调整建立回滚剧本(5 分钟内可回退)
- [ ] 压测验证性能提升(基线对比报告)
- [ ] 监控告警规则同步更新(如 conntrack 阈值)
常见故障与排错
| 症状 |
诊断命令 |
可能根因 |
快速修复 |
永久修复 |
| 连接被拒绝(ECONNREFUSED) |
ss -lnt |
somaxconn 过小 |
sysctl -w net.core.somaxconn=65535 |
写入配置文件 |
| 大量 TIME_WAIT |
ss -tan \| grep TIME_WAIT \| wc -l |
短连接过多 |
启用 tcp_tw_reuse |
应用层改长连接 |
| 连接跟踪表满 |
dmesg \| grep nf_conntrack |
nf_conntrack_max 过小 |
增大 nf_conntrack_max |
定期清理 NAT 规则 |
| OOM Killer 触发 |
dmesg \| grep oom |
内存超卖 |
降低 overcommit_ratio |
增加物理内存 |
| 磁盘 I/O 卡顿 |
iostat -x 1 |
脏页过多 |
降低 dirty_ratio |
优化应用写入 |
| BBR 未生效 |
sysctl net.ipv4.tcp_congestion_control |
内核版本过低 |
升级内核到 4.9+ |
- |
| 端口耗尽 |
ss -tan \| wc -l |
ip_local_port_range 过小 |
扩大端口范围 |
使用长连接 |
变更与回滚剧本
维护窗口
推荐时间:凌晨 2:00 - 4:00(业务低峰期)
变更前置条件:
- [ ] 备份当前所有内核参数(
sysctl -a)
- [ ] 在测试环境完成全部变更验证与压测
- [ ] 准备回滚脚本与配置文件备份
- [ ] 通知业务方与监控团队
灰度策略
阶段 1:单服务器验证(1 台)
# 应用配置
sysctl -p /etc/sysctl.d/99-production.conf
# 压测验证
wrk -t 8 -c 1000 -d 300s http://localhost/
# 监控 24 小时(连接数/延迟/错误率)
阶段 2:批量发布(剩余服务器)
# Ansible 批量应用
ansible webservers -m copy -a "src=/etc/sysctl.d/99-production.conf dest=/etc/sysctl.d/"
ansible webservers -m command -a "sysctl -p /etc/sysctl.d/99-production.conf"
健康检查
# 检查参数是否生效
sysctl -a | grep -E "somaxconn|tcp_max_syn_backlog|tcp_congestion_control"
# 检查连接状态
ss -s
# 检查系统日志错误
dmesg | grep -iE "error|fail|oom" | tail -20
回退条件与命令
触发条件:
- 应用层连接错误率 > 5%
- 系统平均负载 > CPU 核心数 × 3
- OOM Killer 触发
回退操作:
# 恢复备份配置
cp /etc/sysctl.conf.backup /etc/sysctl.conf
rm /etc/sysctl.d/9*.conf
# 重新加载
sysctl -p
# 验证回退成功
sysctl -a | grep -E "somaxconn|tcp_max_syn_backlog" | head -5
最佳实践
- 先备份后修改:所有生产变更前必须导出
sysctl -a 与备份配置文件
- 分文件管理:按场景拆分配置文件(90-network, 91-memory, 92-limits)便于维护
- 版本控制:配置纳入 Git,变更通过 PR 审查
- 测试先行:新参数必须在测试环境压测验证 24 小时
- 监控先行:调整阈值类参数(如 conntrack_max)同步更新告警规则
- 保守调整:首次调优增幅不超过 2 倍(如 somaxconn 128 → 4096,而非 65535)
- 避免过度优化:默认值已优化的参数(如 tcp_rmem)无需盲目增大
- 内核版本适配:BBR/TFO 等新特性需检查内核版本支持
- 容器场景注意:宿主机参数影响所有容器,需考虑容器密度
- 定期审查:每半年审查一次配置,清理无效参数
附录
完整生产配置模板(通用 Web 服务器)
/etc/sysctl.d/99-production.conf:
# ============================================
# 生产环境内核参数调优配置
# 适用场景:高并发 Web 服务器 + 容器宿主机
# 测试环境:RHEL 8.8, Ubuntu 22.04
# 测试日期:2025-10-31
# ============================================
# === 网络核心参数 ===
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.core.rmem_default = 4194304
net.core.wmem_default = 4194304
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# === TCP 协议栈 ===
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 10000 65535
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 786432 1048576 2097152
# === TCP 连接优化 ===
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
# === TCP 拥塞控制 ===
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
net.ipv4.tcp_fastopen = 3
# === TCP 安全 ===
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
# === 连接跟踪 ===
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
# === 内存管理 ===
vm.swappiness = 10
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_expire_centisecs = 1500
vm.dirty_writeback_centisecs = 200
vm.overcommit_memory = 1
# === 文件系统 ===
fs.file-max = 2097152
# === 容器支持(K8s)===
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
# === 安全加固 ===
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
Ansible 自动化部署 Playbook
---
- name: 生产环境内核参数调优
hosts: all
become: yes
vars:
sysctl_config: /etc/sysctl.d/99-production.conf
backup_dir: /root/sysctl-backup
tasks:
- name: 创建备份目录
file:
path: "{{ backup_dir }}"
state: directory
- name: 备份当前参数
shell: sysctl -a > {{ backup_dir }}/sysctl-$(date +%Y%m%d-%H%M%S).txt
- name: 部署调优配置
copy:
src: files/99-production.conf
dest: "{{ sysctl_config }}"
owner: root
group: root
mode: '0644'
- name: 加载 br_netfilter 模块
modprobe:
name: br_netfilter
state: present
- name: 持久化模块加载
lineinfile:
path: /etc/modules-load.d/k8s.conf
line: br_netfilter
create: yes
- name: 应用内核参数
command: sysctl -p {{ sysctl_config }}
register: sysctl_result
- name: 验证关键参数
command: sysctl net.core.somaxconn net.ipv4.tcp_congestion_control
register: verify_result
- name: 显示验证结果
debug:
msg: "{{ verify_result.stdout_lines }}"
测试环境:RHEL 8.8 / Ubuntu 22.04 LTS, Kernel 4.18.0 / 5.15.0
测试日期:2025-10-31
维护周期:参数每半年审查,内核每年升级评估
本文由 云栈社区 技术编辑整理,专注于提供高质量的运维与系统调优干货。关于更多网络/系统底层原理与实战,欢迎访问社区交流讨论。