Linux TCP/IP调优实战,性能提升200%
TIME_WAIT状态减少90%:启用后网络吞吐量提升40%:不同业务需要不同的参数策略。:多核CPU利用率提升明显。:选择部分服务器先行部署。:大幅减少网络延迟抖动。:先在测试环境应用配置。:密切关注关键性能指标。:确认无问题后全面推广。
🔧 TCP协议栈核心参数优化
1. TCP连接管理优化
# /etc/sysctl.conf 配置文件
# TCP连接队列长度优化
net.core.somaxconn = 65535 # 增加监听队列长度
net.core.netdev_max_backlog = 30000 # 网卡接收队列长度
net.ipv4.tcp_max_syn_backlog = 65535 # SYN队列长度
# TIME_WAIT状态优化
net.ipv4.tcp_tw_reuse = 1 # 允许重用TIME_WAIT socket
net.ipv4.tcp_fin_timeout = 30 # 减少FIN_WAIT_2状态时间
net.ipv4.tcp_max_tw_buckets = 10000 # 限制TIME_WAIT数量
# 连接保活机制
net.ipv4.tcp_keepalive_time = 600 # 开始发送keepalive探测包的时间
net.ipv4.tcp_keepalive_probes = 3 # keepalive探测包数量
net.ipv4.tcp_keepalive_intvl = 15 # 探测包发送间隔
2. TCP缓冲区优化
# TCP接收/发送缓冲区优化
net.core.rmem_default = 262144 # 默认接收缓冲区大小
net.core.rmem_max = 16777216 # 最大接收缓冲区大小
net.core.wmem_default = 262144 # 默认发送缓冲区大小
net.core.wmem_max = 16777216 # 最大发送缓冲区大小
# TCP套接字缓冲区自动调节
net.ipv4.tcp_rmem = 4096 87380 16777216 # TCP读取缓冲区 min default max
net.ipv4.tcp_wmem = 4096 65536 16777216 # TCP写入缓冲区 min default max
net.ipv4.tcp_mem = 94500000 915000000 927000000 # TCP内存分配 low pressure high
# 启用TCP窗口缩放
net.ipv4.tcp_window_scaling = 1 # 支持更大的TCP窗口
3. TCP拥塞控制优化
# 拥塞控制算法选择
net.ipv4.tcp_congestion_control = bbr # 使用BBR算法(推荐)
# 其他选项:cubic, reno, bic
# 快速重传和恢复
net.ipv4.tcp_frto = 2 # F-RTO算法检测虚假超时
net.ipv4.tcp_dsack = 1 # 启用DSACK支持
net.ipv4.tcp_fack = 1 # 启用FACK拥塞避免
# TCP慢启动阈值
net.ipv4.tcp_slow_start_after_idle = 0 # 禁用空闲后慢启动
🌐 IP协议栈参数优化
1. IP层处理优化
# IP转发和路由优化
net.ipv4.ip_forward = 0 # 非路由器设备关闭转发
net.ipv4.conf.default.rp_filter = 1 # 启用反向路径过滤
net.ipv4.conf.all.rp_filter = 1
# IP分片处理
net.ipv4.ipfrag_high_thresh = 262144 # IP分片高阈值
net.ipv4.ipfrag_low_thresh = 196608 # IP分片低阈值
net.ipv4.ipfrag_time = 30 # 分片重组超时时间
# ICMP优化
net.ipv4.icmp_echo_ignore_broadcasts = 1 # 忽略广播ICMP
net.ipv4.icmp_ignore_bogus_error_responses = 1 # 忽略错误ICMP响应
2. 端口范围优化
# 本地端口范围扩展
net.ipv4.ip_local_port_range = 1024 65535 # 可用端口范围
# UDP端口优化
net.ipv4.udp_mem = 94500000 915000000 927000000
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192
⚡ 网络队列和中断优化
1. 网络设备队列优化
# 增加网络设备处理队列
echo 'echo 4096 > /proc/sys/net/core/netdev_budget' >> /etc/rc.local
echo 'echo 2 > /proc/sys/net/core/netdev_budget_usecs' >> /etc/rc.local
# RPS/RFS优化(多核CPU负载均衡)
echo 'f' > /sys/class/net/eth0/queues/rx-0/rps_cpus # 根据CPU核数调整
2. 中断优化脚本
#!/bin/bash
# network_irq_balance.sh - 网络中断均衡脚本
# 获取网卡中断号
IRQ_LIST=$(grep eth0 /proc/interrupts | awk -F: '{print $1}' | xargs)
# 绑定中断到不同CPU核心
CPU_COUNT=$(nproc)
i=0
for irq in$IRQ_LIST; do
cpu_mask=$((1 << (i % CPU_COUNT)))
printf"%x"$cpu_mask > /proc/irq/$irq/smp_affinity
echo"IRQ $irq -> CPU $((i % CPU_COUNT))"
((i++))
done
🎯 高并发场景专项优化
1. 大连接数优化
# 文件描述符限制
echo'* soft nofile 1048576' >> /etc/security/limits.conf
echo'* hard nofile 1048576' >> /etc/security/limits.conf
# 进程数限制
echo'* soft nproc 1048576' >> /etc/security/limits.conf
echo'* hard nproc 1048576' >> /etc/security/limits.conf
# systemd服务限制
echo'DefaultLimitNOFILE=1048576' >> /etc/systemd/system.conf
echo'DefaultLimitNPROC=1048576' >> /etc/systemd/system.conf
2. 内存管理优化
# 虚拟内存管理
vm.swappiness = 10 # 降低swap使用
vm.dirty_ratio = 15 # 脏页写回比例
vm.dirty_background_ratio = 5 # 后台写回比例
vm.overcommit_memory = 1 # 允许内存过量分配
📈 性能监控和验证
1. 关键指标监控脚本
#!/bin/bash
# network_monitor.sh - 网络性能监控
echo"=== 网络连接状态统计 ==="
ss -s
echo -e "\n=== TCP连接状态分布 ==="
ss -tan | awk 'NR>1{state[$1]++} END{for(i in state) print i, state[i]}'
echo -e "\n=== 网络吞吐量 ==="
sar -n DEV 1 1 | grep -E "eth0|Average"
echo -e "\n=== 内存使用情况 ==="
free -h
echo -e "\n=== 系统负载 ==="
uptime
2. 压测验证命令
# 使用wrk进行HTTP压测
wrk -t12 -c400 -d30s --latency http://your-server-ip/
# 使用iperf3进行网络带宽测试
iperf3 -s # 服务端
iperf3 -c server-ip -t 60 -P 10 # 客户端
# TCP连接数压测
ab -n 100000 -c 1000 http://your-server-ip/
🔥 实战案例:电商系统优化
优化前后对比数据
|
指标 |
优化前 |
优化后 |
提升幅度 |
|
QPS |
15,000 |
45,000 |
200% |
|
平均延迟 |
120ms |
35ms |
71% |
|
99%延迟 |
800ms |
150ms |
81% |
|
并发连接数 |
10,000 |
50,000 |
400% |
|
CPU使用率 |
85% |
45% |
-47% |
关键优化点
-
1. BBR拥塞控制:启用后网络吞吐量提升40%
-
2. TCP缓冲区调优:大幅减少网络延迟抖动
-
3. 连接复用优化:TIME_WAIT状态减少90%
-
4. 中断均衡:多核CPU利用率提升明显
💡 最佳实践建议
1. 分场景调优策略
高并发Web服务器
# 重点优化连接数和快速释放
net.ipv4.tcp_tw_reuse = 1
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
大文件传输服务器
# 重点优化缓冲区和窗口大小
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_window_scaling = 1
数据库服务器
# 重点优化连接保活和稳定性
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_retries2 = 5
2. 生产环境部署流程
-
1. 测试环境验证:先在测试环境应用配置
-
2. 灰度发布:选择部分服务器先行部署
-
3. 监控观察:密切关注关键性能指标
-
4. 全量部署:确认无问题后全面推广
3. 配置持久化
# 应用所有sysctl配置
sysctl -p
# 验证配置是否生效
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.somaxconn
# 设置开机自动生效
echo 'sysctl -p' >> /etc/rc.local
chmod +x /etc/rc.local
⚠️ 注意事项和常见陷阱
1. 参数调优误区
-
• 盲目增大缓冲区:可能导致内存不足
-
• 过度优化TIME_WAIT:可能引起端口耗尽
-
• 忽略业务特性:不同业务需要不同的参数策略
2. 回滚预案
# 备份当前配置
cp /etc/sysctl.conf /etc/sysctl.conf.backup.$(date +%Y%m%d)
# 快速回滚脚本
cat > /root/network_rollback.sh << 'EOF'
#!/bin/bash
cp /etc/sysctl.conf.backup.* /etc/sysctl.conf
sysctl -p
echo "Network config rollback completed!"
EOF
chmod +x /root/network_rollback.sh
Linux内核与网络栈调优:让10万并发系统QPS提升300%延迟降低50%
适用场景 & 前置条件
适用场景:
-
• 高并发 Web/API 服务(QPS 50K+)
-
• 网络密集型应用(CDN/代理/网关)
-
• 数据库/缓存服务器(MySQL/Redis/Kafka)
-
• 容器化平台(Kubernetes 节点优化)
前置条件:
-
• Linux 内核 4.18+(建议 5.10+ LTS)
-
• 具备 root 权限执行 sysctl 配置
-
• 了解当前系统瓶颈(CPU/网络/磁盘)
-
• 已建立性能基线(压测数据)
环境与版本矩阵
|
组件 |
版本要求 |
关键特性依赖 |
测试环境配置 |
|---|---|---|---|
|
OS |
RHEL 8+ / Ubuntu 22.04+ |
- |
RHEL 8.6 / Ubuntu 22.04 |
|
Kernel |
5.10+ LTS |
BBR 拥塞控制、eBPF 跟踪 |
5.15.0-89 |
|
CPU |
8C+ |
多队列网卡支持 |
16C (Intel Xeon) |
|
Network |
10Gbps+ |
RSS/RPS/XPS 支持 |
25Gbps 网卡 |
|
Memory |
16GB+ |
连接跟踪表大小 |
64GB |
实施步骤
Step 1: 建立性能基线
目标: 记录优化前的关键指标,用于对比。
# 系统负载与 CPU
uptime
# 输出: load average: 15.2, 12.8, 10.3 (基线记录)
mpstat -P ALL 1 10 | tee /tmp/cpu-baseline.txt
# 记录 CPU 利用率、%sys、%soft(软中断)
# 网络吞吐与连接数
sar -n DEV 1 10 | tee /tmp/network-baseline.txt
# 记录 rxpck/s、txpck/s、rxkB/s、txkB/s
ss -s
# 记录 TCP 连接数(estab/timewait/orphaned)
# TCP 重传率(关键指标)
netstat -s | grep -E "retransmit|timeout"
# 记录 segments retransmited、timeouts
# 使用 wrk 压测建立基线
wrk -t8 -c1000 -d60s --latency http://192.168.1.10:8080/
# 记录 QPS、P50/P99 延迟
基线示例:
优化前基线:
- QPS: 12000 req/s
- P99 延迟: 850ms
- 重传率: 1.2%
- CPU %sys: 35%
- TCP ESTABLISHED: 8500
Step 2: TCP 协议栈优化
目标: 优化 TCP 连接建立、数据传输、连接回收效率。
TCP 连接队列优化
# /etc/sysctl.d/10-tcp-tuning.conf
# SYN 队列大小(处理大量新连接)
net.ipv4.tcp_max_syn_backlog = 16384 # 默认 1024
net.core.somaxconn = 16384 # 应用层 listen() backlog 上限
# SYN Cookies(防 SYN Flood)
net.ipv4.tcp_syncookies = 1 # 1=开启
# SYN-ACK 重试次数
net.ipv4.tcp_synack_retries = 2 # 默认 5,降低可快速释放资源
# 应用配置立即生效
sysctl -p /etc/sysctl.d/10-tcp-tuning.conf
验证 SYN 队列溢出:
# 压测前后对比
netstat -s | grep -i "SYNs to LISTEN"
# 输出: 1234 SYNs to LISTEN sockets dropped (优化后应接近 0)
TCP 缓冲区优化
# TCP 读写缓冲区(关键性能参数)
net.ipv4.tcp_rmem = 4096 87380 16777216 # min default max (读缓冲,16MB)
net.ipv4.tcp_wmem = 4096 65536 16777216 # 写缓冲
# TCP 自动调整缓冲区
net.ipv4.tcp_moderate_rcvbuf = 1
# 全局 socket 缓冲区限制(单位:页,4KB/页)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144
# 应用配置
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
参数解释:
-
•
tcp_rmem[2]: 接收窗口最大值,影响下载速度(高带宽环境需增大) -
•
tcp_wmem[2]: 发送窗口最大值,影响上传速度 -
•
tcp_moderate_rcvbuf: 自动调整窗口,基于 RTT 与带宽
验证缓冲区:
# 查看连接实际使用的缓冲区
ss -tm | grep -A1 "ESTAB"
# 输出:
# skmem:(r0,rb369280,t0,tb87040,f0,w0,o0,bl0,d0)
# rb=接收缓冲,tb=发送缓冲
TCP TIME_WAIT 优化
# TIME_WAIT 复用与快速回收
net.ipv4.tcp_tw_reuse = 1 # 允许复用 TIME_WAIT socket
net.ipv4.tcp_fin_timeout = 15 # FIN_WAIT2 超时(默认 60s)
# TIME_WAIT bucket 上限
net.ipv4.tcp_max_tw_buckets = 50000 # 默认 16384
# 孤儿连接(未被进程持有)限制
net.ipv4.tcp_max_orphans = 65536 # 默认 16384
# 应用配置
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_fin_timeout=15
注意: tcp_tw_recycle 已在内核 4.12 废弃,使用 tcp_tw_reuse 替代。
验证 TIME_WAIT:
# 压测时监控 TIME_WAIT 数量
watch -n1 'ss -s | grep TIME-WAIT'
# 优化后应显著减少
TCP 拥塞控制算法
# 查看可用算法
sysctl net.ipv4.tcp_available_congestion_control
# 输出: cubic reno bbr
# 切换到 BBR(需内核 4.9+)
modprobe tcp_bbr
echo"tcp_bbr" >> /etc/modules-load.d/bbr.conf
sysctl -w net.ipv4.tcp_congestion_control=bbr
sysctl -w net.core.default_qdisc=fq
# 持久化
cat <<EOF >> /etc/sysctl.d/10-tcp-tuning.conf
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
EOF
# 验证 BBR 生效
sysctl net.ipv4.tcp_congestion_control
lsmod | grep bbr
BBR vs Cubic 对比:
-
• Cubic(默认): 基于丢包检测拥塞,高丢包率下性能下降
-
• BBR: 基于带宽与 RTT,高丢包环境下吞吐提升 10-25%
Step 3: 网络层优化
IP 层参数
# 本地端口范围(客户端连接使用)
net.ipv4.ip_local_port_range = 10000 65000 # 默认 32768-60999
# 连接跟踪表大小(NAT/防火墙环境)
net.netfilter.nf_conntrack_max = 1048576 # 默认 65536
net.netfilter.nf_conntrack_tcp_timeout_established = 600 # 默认 432000(5天)
# ARP 缓存
net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 4096
net.ipv4.neigh.default.gc_thresh3 = 8192
# 应用配置
sysctl -p /etc/sysctl.d/10-tcp-tuning.conf
验证 conntrack 表:
# 查看当前使用量
cat /proc/sys/net/netfilter/nf_conntrack_count
# 输出: 62341
# 查看上限
cat /proc/sys/net/netfilter/nf_conntrack_max
# 输出: 1048576
# 监控溢出(有溢出说明需增大 max)
dmesg | grep "nf_conntrack: table full"
网卡多队列与中断亲和性
# 查看网卡队列数
ethtool -l eth0
# 输出:
# Combined: 8 (当前)
# Combined: 16 (最大支持)
# 增加队列数(需硬件支持)
ethtool -L eth0 combined 16
# 查看中断分布
cat /proc/interrupts | grep eth0
# 理想情况: 每个队列绑定不同 CPU
# 手动绑定中断到 CPU(示例:中断 125 绑定到 CPU 0)
echo 1 > /proc/irq/125/smp_affinity_list # 1 表示 CPU 0
echo 2 > /proc/irq/126/smp_affinity_list # 2 表示 CPU 1
自动化脚本(irqbalance 替代方案):
#!/bin/bash
# set-irq-affinity.sh - 网卡中断均衡分布
IFACE=eth0
QUEUES=$(ls -d /sys/class/net/$IFACE/queues/rx-* | wc -l)
CPU_COUNT=$(nproc)
for ((i=0; i<$QUEUES; i++)); do
IRQ=$(cat /sys/class/net/$IFACE/queues/rx-$i/../../../msi_irqs/* | head -1)
CPU=$((i % CPU_COUNT))
echo$CPU > /proc/irq/$IRQ/smp_affinity_list
echo"IRQ $IRQ -> CPU $CPU"
done
RPS/RFS 软件多队列
# 启用 RPS(Receive Packet Steering,单队列网卡软件实现多队列)
# 对于网卡队列 < CPU 核数的场景
# 配置 RPS(以 eth0 为例)
for i in /sys/class/net/eth0/queues/rx-*/rps_cpus; do
echo"ffff" > $i# ffff=使用所有 16 个 CPU
done
# 启用 RFS(Receive Flow Steering,进一步优化到应用所在 CPU)
sysctl -w net.core.rps_sock_flow_entries=32768
for i in /sys/class/net/eth0/queues/rx-*/rps_flow_cnt; do
echo 2048 > $i
done
Step 4: 中断与 CPU 亲和性
目标: 减少 CPU 上下文切换,降低软中断开销。
软中断监控
# 查看软中断占比
mpstat -P ALL 1 5
# 关注 %soft 列,正常应 <10%
# 详细软中断统计
cat /proc/softirqs
# NET_RX 行显示每 CPU 的网络接收中断数
# 实时监控
watch -n1 'cat /proc/softirqs | grep NET_RX'
应用进程 CPU 绑定
# 查看进程当前 CPU 亲和性
taskset -cp <PID>
# 输出: pid 12345's current affinity list: 0-15
# 绑定 Nginx worker 到特定 CPU
# 编辑 /etc/nginx/nginx.conf
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
# 验证绑定
ps -eLo pid,tid,psr,comm | grep nginx
# psr 列显示当前运行的 CPU 编号
Step 5: 内存与文件描述符
内存管理优化
# 脏页回写优化(减少 I/O 延迟)
vm.dirty_ratio = 10 # 脏页占比达 10% 触发同步写
vm.dirty_background_ratio = 5 # 后台回写起始点
vm.dirty_writeback_centisecs = 100 # 每 1 秒回写一次
# 内存分配策略
vm.overcommit_memory = 1 # 允许超额分配(Redis/MongoDB 推荐)
# 交换分区(生产环境建议禁用或最小化)
vm.swappiness = 10 # 默认 60,降低换页频率
# 应用配置
cat <<EOF >> /etc/sysctl.d/20-memory.conf
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
vm.swappiness = 10
EOF
sysctl -p /etc/sysctl.d/20-memory.conf
文件描述符限制
# 系统级限制
fs.file-max = 2097152
# 进程级限制(/etc/security/limits.conf)
cat <<EOF >> /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000
root soft nofile 100000
root hard nofile 100000
EOF
# 当前 shell 立即生效
ulimit -n 100000
# 验证
ulimit -n
cat /proc/sys/fs/file-max
验证文件描述符使用:
# 系统级使用率
cat /proc/sys/fs/file-nr
# 输出: 12345 0 2097152
# ↑已用 ↑未用 ↑总量
# 进程级使用(以 Nginx 为例)
PID=$(pgrep nginx | head -1)
ls /proc/$PID/fd | wc -l
cat /proc/$PID/limits | grep "open files"
Step 6: 磁盘 I/O 与文件系统
I/O 调度器优化
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 输出: noop [deadline] cfq
# SSD 推荐使用 noop 或 none(内核 5.0+)
echo noop > /sys/block/sda/queue/scheduler
# 持久化(/etc/udev/rules.d/60-scheduler.rules)
cat <<EOF > /etc/udev/rules.d/60-scheduler.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"
EOF
文件系统挂载参数
# /etc/fstab 优化示例(XFS)
/dev/sda1 /data xfs defaults,noatime,nodiratime,nobarrier 0 0
# 参数解释:
# noatime: 不更新访问时间(减少 I/O)
# nodiratime: 不更新目录访问时间
# nobarrier: 禁用写屏障(SSD + UPS 环境可用)
# 重新挂载生效
mount -o remount /data
# 验证挂载参数
mount | grep /data
Step 7: 应用层配合优化
Nginx 配置优化
# /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
worker_rlimit_nofile100000;
worker_cpu_affinity auto;
events {
useepoll;
worker_connections10000;
multi_accepton;
}
http {
sendfileon;
tcp_nopushon;
tcp_nodelayon;
keepalive_timeout65;
keepalive_requests1000;
# 连接池
upstream backend {
server192.168.1.21:8080;
keepalive256;
keepalive_requests1000;
keepalive_timeout60s;
}
}
Java JVM 优化
# JVM 启动参数(堆外内存与 GC)
JAVA_OPTS="-Xms8g -Xmx8g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+ParallelRefProcEnabled \
-XX:+UnlockExperimentalVMOptions \
-XX:G1NewSizePercent=30 \
-XX:InitiatingHeapOccupancyPercent=35 \
-XX:+DisableExplicitGC \
-Djava.net.preferIPv4Stack=true"
# 连接池配置(HikariCP 示例)
spring.datasource.hikari.maximum-pool-size=200
spring.datasource.hikari.minimum-idle=20
spring.datasource.hikari.connection-timeout=5000
Step 8: 验证效果与持久化
性能验证
# 使用相同压测参数对比
wrk -t8 -c1000 -d60s --latency http://192.168.1.10:8080/
# 优化后预期结果:
# QPS: 38000 req/s (提升 316%)
# P99 延迟: 420ms (降低 50%)
# 重传率: 0.3% (降低 75%)
# CPU %sys: 18% (降低 48%)
配置持久化检查
# 合并所有配置到单一文件
cat /etc/sysctl.d/*.conf > /etc/sysctl.conf
# 验证下次重启后生效
sysctl -p /etc/sysctl.conf
# 检查服务自启动
systemctl list-unit-files | grep enabled | grep -E "nginx|network"
监控与告警
关键性能指标
# 实时监控脚本
#!/bin/bash
# perf-monitor.sh
whiletrue; do
echo"=== $(date) ==="
# TCP 连接状态
ss -s | grep TCP
# 重传率
netstat -s | grep -E "segments retransmited" | awk '{print "Retrans: " $1}'
# 软中断
mpstat -P ALL 1 1 | grep Average | awk '{print "CPU Soft IRQ: " $8 "%"}'
# 网络吞吐
sar -n DEV 1 1 | grep eth0 | tail -1 | awk '{print "RX: " $5 " KB/s, TX: " $6 " KB/s"}'
echo"---"
sleep 5
done
Prometheus 指标采集
# node-exporter 关键指标
node_netstat_Tcp_RetransSegs# TCP 重传数
node_netstat_TcpExt_TCPTimeouts# TCP 超时数
node_softnet_dropped_total# 软中断丢包
node_network_receive_drop_total# 网卡接收丢包
告警规则:
groups:
-name:kernel_network_alerts
rules:
-alert:HighTCPRetrans
expr:rate(node_netstat_Tcp_RetransSegs[1m])>100
for:5m
labels:
severity:warning
annotations:
summary:"TCP 重传率异常(>100/s)"
-alert:SoftnetDropped
expr:rate(node_softnet_dropped_total[1m])>10
for:2m
labels:
severity:critical
annotations:
summary:"软中断丢包(内核网络栈过载)"
性能与容量
性能提升对比表
|
指标 |
优化前 |
优化后 |
提升幅度 |
|---|---|---|---|
|
QPS |
12000/s |
38000/s |
+316% |
|
P99 延迟 |
850ms |
420ms |
-50% |
|
TCP 重传率 |
1.2% |
0.3% |
-75% |
|
CPU %sys |
35% |
18% |
-48% |
|
TIME_WAIT 连接数 |
28000 |
8500 |
-69% |
容量规划公式
单机理论并发 = (本地端口数 × 目标 IP 数) / 平均连接时长(s)
实际可用并发 = min(
理论并发,
文件描述符限制,
内存限制(每连接约 4KB),
conntrack 表大小
)
示例(16C64G 服务器):
- 端口范围: 10000~65000(55000 个)
- 目标后端: 10 个
- 平均连接时长: 1s
- 理论并发: (55000 × 10) / 1 = 550,000
- fd 限制: 100,000
- 内存限制: 64GB × 0.5 / 4KB ≈ 8,388,608
- 推荐配置: 80,000 并发(预留 20% buffer)
安全与合规
SYN Flood 防护
# 启用 SYN Cookies
net.ipv4.tcp_syncookies = 1
# 限制 SYN 队列
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_synack_retries = 2
# 配合 iptables 限速
iptables -A INPUT -p tcp --dport 80 --syn -m limit --limit 100/s --limit-burst 200 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 --syn -j DROP
IP 伪造防护
# 启用反向路径过滤(防 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.all.send_redirects = 0
常见故障与排错
|
症状 |
诊断命令 |
可能根因 |
快速修复 |
永久修复 |
|---|---|---|---|---|
|
软中断 CPU 占用 >30% |
mpstat -P ALL 1 |
网卡队列不足/中断分布不均 |
增加网卡队列 |
配置中断亲和性 + RPS/RFS |
|
TCP 重传率 >5% |
netstat -s | grep retrans |
网络丢包/拥塞控制算法不当 |
切换到 BBR 拥塞控制 |
检查网络设备 + 增大缓冲区 |
|
conntrack table full |
dmesg | grep nf_conntrack |
连接跟踪表溢出 |
增大 |
减少连接超时时间 + 扩容 |
|
TIME_WAIT 过多 |
ss -s | grep TIME-WAIT |
短连接过多 |
开启 |
应用层启用 keep-alive |
|
端口耗尽 |
netstat -s | grep "port already in use" |
可用端口不足 |
扩大 |
优化连接复用 + 减少 fin_timeout |
|
文件描述符耗尽 |
cat /proc/sys/fs/file-nr |
fd 限制过低 |
ulimit -n 100000 |
修改 limits.conf + 应用重启 |
最佳实践(10 条)
-
1. 分层优化: 按 TCP→IP→网卡→应用 顺序逐层优化,每层验证效果后再进行下一层
-
2. BBR 默认开启: 生产环境统一使用 BBR 拥塞控制(内核 4.9+)
-
3. 缓冲区自适应: 启用
tcp_moderate_rcvbuf,让内核根据 RTT 自动调整窗口 -
4. 连接复用强制: 应用层必须配置连接池,Nginx upstream 启用 keepalive
-
5. 中断均衡: 多队列网卡每队列绑定独立 CPU,避免单核软中断瓶颈
-
6. 监控四大指标: QPS、P99 延迟、重传率、软中断 CPU 占比,设置 SLO 告警
-
7. 压测验证: 每次调优后使用 wrk/ab 压测验证,建立性能基线对比
-
8. 参数渐进式: 单次调整 1-3 个参数,观察 1 小时稳定后再调整下一批
-
9. TIME_WAIT 控制: 开启
tw_reuse,但勿过度减小fin_timeout(<10s 可能导致连接复用冲突) -
10. 容器环境特殊处理: K8s 节点需额外调优 conntrack、iptables 规则数、overlay 网络 MTU
附录:完整配置文件
生产级 sysctl.conf
# /etc/sysctl.d/99-production-tuning.conf
# 生产环境 Linux 内核调优完整配置
### TCP 协议栈优化 ###
net.ipv4.tcp_max_syn_backlog = 16384
net.core.somaxconn = 16384
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_tw_buckets = 50000
net.ipv4.tcp_max_orphans = 65536
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
### 网络层优化 ###
net.ipv4.ip_local_port_range = 10000 65000
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 600
net.core.netdev_max_backlog = 8192
net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 4096
net.ipv4.neigh.default.gc_thresh3 = 8192
### 内存管理 ###
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
vm.swappiness = 10
vm.overcommit_memory = 1
### 文件系统 ###
fs.file-max = 2097152
### 安全防护 ###
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
### 应用配置 ###
sysctl -p /etc/sysctl.d/99-production-tuning.conf
一键应用脚本
#!/bin/bash
# apply-kernel-tuning.sh - 一键应用内核优化
set -euo pipefail
BACKUP_DIR="/root/kernel-tuning-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p $BACKUP_DIR
echo"==> 备份当前配置"
sysctl -a > $BACKUP_DIR/sysctl-before.txt
cp -r /etc/sysctl.d $BACKUP_DIR/
echo"==> 应用优化配置"
curl -sO https://example.com/99-production-tuning.conf
mv 99-production-tuning.conf /etc/sysctl.d/
sysctl -p /etc/sysctl.d/99-production-tuning.conf
echo"==> 加载 BBR 模块"
modprobe tcp_bbr
echo"tcp_bbr" >> /etc/modules-load.d/bbr.conf
echo"==> 验证关键参数"
sysctl net.ipv4.tcp_congestion_control | grep -q bbr || { echo"BBR 未生效"; exit 1; }
sysctl net.ipv4.tcp_tw_reuse | grep -q "= 1" || { echo"tw_reuse 未生效"; exit 1; }
echo"==> 优化完成,备份保存于 $BACKUP_DIR"
echo"==> 建议重启后验证: reboot"更多推荐


所有评论(0)