个人名片
作者简介:java领域优质创作者
个人主页:码农阿豪
工作室:新空间代码工作室(提供各种软件服务)
个人邮箱:[[email protected]]
个人微信:15279484656
个人导航网站:www.forff.top
座右铭:总有人要赢。为什么不能是我呢?
码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用
Redis专栏:Redis从零到一学习分享,经验总结,案例实战
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有
在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃。本文基于真实案例分析,从参数解读、问题诊断到优化实践,手把手教你如何调优Linux网络参数,支撑百万级并发连接。
vCPU: 8核 | 内存: 16GB | 网络带宽: 4Gbps | PPS: 80万
TIME_WAIT
连接堆积(2464个)CLOSE_WAIT
连接(4个)通过sysctl
查看到的原始配置:
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 131072
net.ipv4.ip_local_port_range = 1024 61999
关键缺陷:半连接队列小、端口范围窄、缓冲区限制严。
watch -n 1 'netstat -ant | awk '\''/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'\'''
输出示例:
ESTABLISHED 790
TIME_WAIT 2464
SYN_RECV 32 # 半连接重点关注!
# 查看SYN_RECV连接详情
ss -ntp state syn-recv
# 监控队列溢出
netstat -s | grep -i 'listen drops'
参数 | 作用 | 默认值问题 |
---|---|---|
tcp_max_syn_backlog |
半连接队列长度 | 8192(突发流量易满) |
somaxconn |
全连接队列长度 | 需与应用backlog参数匹配 |
tcp_tw_reuse |
快速复用TIME_WAIT端口 | 默认关闭(导致端口耗尽) |
tcp_rmem /tcp_wmem |
读写缓冲区大小 | 最大值仅6MB(影响吞吐) |
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_tw_buckets = 262144" >> /etc/sysctl.conf
echo "net.ipv4.ip_local_port_range = 1024 65000" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 65535" >> /etc/sysctl.conf
echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf
echo "net.core.netdev_max_backlog = 10000" >> /etc/sysctl.conf
cat >> /etc/sysctl.conf <<EOF
net.ipv4.tcp_mem = 8388608 12582912 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
EOF
echo "net.ipv4.tcp_keepalive_time = 600" >> /etc/sysctl.conf
echo "net.ipv4.tcp_keepalive_intvl = 30" >> /etc/sysctl.conf
#!/bin/bash
while true; do
clear
date
echo "---- TCP状态 ----"
netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
echo "---- 半连接队列 ----"
ss -ltn | awk 'NR>1 {print "Listen队列: Recv-Q="$2", Send-Q="$3}'
echo "---- 端口使用率 ----"
echo "已用端口: $(netstat -ant | grep -v LISTEN | awk '{print $4}' | cut -d: -f2 | sort -u | wc -l)/$((65000-1024))"
sleep 5
done
alert: TCP_SYN_Dropped
expr: increase(node_netstat_Tcp_Ext_SyncookiesFailed{job="node"}[1m]) > 0
for: 5m
labels:
severity: critical
annotations:
summary: "SYN队列溢出 (实例 {{ $labels.instance }})"
使用wrk
模拟高并发:
wrk -t16 -c10000 -d60s http://service:8080
监控重点指标:
SYN_RECV
数量波动netstat -s
中的丢包计数free -m
)盲目启用tcp_tw_recycle
NAT环境下会导致连接失败(已从Linux 4.12移除)
缓冲区过大引发OOM
需根据内存调整tcp_mem
:
# 计算安全值(单位:页,1页=4KB)
echo $(( $(free -m | awk '/Mem:/ {print $2}') * 1024 / 4 / 3 )) >> /proc/sys/net/ipv4/tcp_mem
somaxconn
需≥应用层的backlog
listen 80 backlog=65535;
通过本文的调优实践,我们实现了:
最终建议配置已汇总至Github Gist。记住:调优不是一次性的,需持续监控和迭代!
延伸阅读:
- 《Linux Kernel Networking》 by Rami Rosen
- C1000K Server Guide