LinuxTCP并发请求溢出调优指南

admin 2026-01-17 01:51:19 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文档提供LinuxTCP并发溢出调优指南,涵盖内核参数如somaxconn与backlog的优化、Nginx配置及系统资源限制调整。包含连接监控与压力测试脚本,详述网络接口及防火墙策略,有效提升服务器高并发处理能力。 综合评分: 90 文章分类: 网络安全,解决方案,安全运营,安全工具


cover_image

Linux TCP并发请求溢出调优指南

原创

刘军军 刘军军

运维星火燎原

2026年1月16日 00:00 北京

一、问题诊断与监控

1.1 诊断TCP连接状态

#!/bin/bash
# tcp-connection-check.sh

echo"=== TCP连接状态诊断 $(date) ==="

# 1. 当前TCP连接统计
echo"1. 📊 当前TCP连接统计:"
ss -s | head -3

# 2. 连接状态分布
echo -e "\n2. 🔍 TCP连接状态分布:"
ss -t -a | awk '{print $1}' | sort | uniq -c | sort -nr

# 3. 查看连接队列
echo -e "\n3. 📈 连接队列监控:"
netstat -tn | awk '
    $6 == "ESTABLISHED" {established++}
    $6 == "SYN_RECV" {syn_recv++}
    $6 == "TIME_WAIT" {time_wait++}
    END {
        printf "ESTABLISHED: %d, SYN_RECV: %d, TIME_WAIT: %d\n",
        established, syn_recv, time_wait
    }'

# 4. 检查连接溢出
echo -e "\n4. ⚠️  连接溢出检查:"
# 检查是否因为队列满而丢弃连接
if dmesg | grep -i "drop" | grep -i "tcp" | tail -3; then
    echo"检测到TCP连接丢弃!"
else
    echo"未发现明显的连接丢弃日志"
fi

# 5. 端口使用情况
echo -e "\n5. 🔢 本地端口使用情况:"
ss -tn src :80 | wc -l | awk '{print "HTTP连接数: "$1}'
ss -tn src :443 | wc -l | awk '{print "HTTPS连接数: "$1}'

1.2 实时连接监控脚本

#!/bin/bash
# tcp-realtime-monitor.sh

INTERVAL=2
DURATION=30

echo"开始TCP连接实时监控,间隔 ${INTERVAL}s,持续 ${DURATION}s..."
end=$((SECONDS+DURATION))

while [ $SECONDS -lt $end ]; do
    clear
    echo"=== TCP连接实时监控 $(date) ==="

    # 连接总数
    total=$(ss -s | awk '/TCP:/ {print $2}')
    established=$(ss -s | awk '/ESTAB/ {print $4}')

    echo"连接总数: $total, ESTABLISHED: $established"

    # 状态分布
    echo"状态分布:"
    ss -t -a | awk '{print $1}' | sort | uniq -c | sort -nr | head -5

    # 队列监控
    syn_queue=$(netstat -tn | awk '$6 == "SYN_RECV" {count++} END {print count}')
    accept_queue=$(ss -tn state syn-recv | wc -l)

    echo"SYN队列: $syn_queue, Accept队列: $accept_queue"

    # 端口使用
    echo"端口使用 - HTTP: $(ss -tn src :80 | wc -l), HTTPS: $(ss -tn src :443 | wc -l)"

    sleep $INTERVAL
done

二、内核参数调优

2.1 TCP内核参数优化配置

#!/bin/bash
# tcp-kernel-optimization.sh

echo"=== TCP内核参数优化配置 ==="

# 备份当前配置
cp /etc/sysctl.conf /etc/sysctl.conf.backup.$(date +%Y%m%d)

echo"应用TCP并发优化参数..."

# 添加到sysctl.conf
cat >> /etc/sysctl.conf <<&nbsp;'EOF'

# ==================== TCP并发优化配置 ====================
# 连接队列相关
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 32768
net.core.netdev_max_backlog = 30000

# 连接建立优化
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_abort_on_overflow = 0

# 连接重用和快速回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0 &nbsp; &nbsp;# 在NAT环境下建议为0
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 2000000

# 内存缓冲区优化
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 786432 1048576 1572864

# 拥塞控制算法
net.ipv4.tcp_congestion_control = cubic

# 保活机制
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5

# 时间戳和窗口缩放
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_window_scaling = 1

# 快速打开
net.ipv4.tcp_fastopen = 3

# 连接跟踪
net.netfilter.nf_conntrack_max = 524288
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
EOF

# 应用配置
sysctl -p

echo&nbsp;"TCP内核参数优化完成!"

2.2 参数详解与验证

#!/bin/bash
# tcp-parameter-verification.sh

echo"=== TCP参数验证与监控 ==="

# 验证当前参数值
echo"当前TCP参数值:"
echo"1. somaxconn:&nbsp;$(sysctl -n net.core.somaxconn)"
echo"2. tcp_max_syn_backlog:&nbsp;$(sysctl -n net.ipv4.tcp_max_syn_backlog)"
echo"3. netdev_max_backlog:&nbsp;$(sysctl -n net.core.netdev_max_backlog)"
echo"4. tcp_max_tw_buckets:&nbsp;$(sysctl -n net.ipv4.tcp_max_tw_buckets)"
echo"5. nf_conntrack_max:&nbsp;$(sysctl -n net.netfilter.nf_conntrack_max)"

# 监控连接跟踪表
if&nbsp;sysctl -n net.netfilter.nf_conntrack_max >/dev/null 2>&1;&nbsp;then
&nbsp; &nbsp; current=$(cat /proc/sys/net/netfilter/nf_conntrack_count 2>/dev/null ||&nbsp;echo"N/A")
&nbsp; &nbsp; max=$(sysctl -n net.netfilter.nf_conntrack_max)
&nbsp; &nbsp;&nbsp;echo"连接跟踪表使用:&nbsp;$current/$max"
fi

# 检查端口范围
echo"本地端口范围:&nbsp;$(sysctl -n net.ipv4.ip_local_port_range)"

# 监控队列状态
echo&nbsp;-e&nbsp;"\n队列监控:"
echo"SYN队列:&nbsp;$(netstat -tn | grep SYN_RECV | wc -l)"
echo"Accept队列:&nbsp;$(ss -tn state syn-recv | wc -l)"

# 检查是否有连接丢弃
echo&nbsp;-e&nbsp;"\n连接丢弃统计:"
if&nbsp;[ -f /proc/net/netstat ];&nbsp;then
&nbsp; &nbsp; awk&nbsp;'/TcpExt/ {print "TCP扩展统计可用"}'&nbsp;/proc/net/netstat
fi

三、应用程序级优化

3.1 Nginx高并发配置

# nginx-tcp-optimization.conf

# 工作进程配置
worker_processes&nbsp;auto;
worker_cpu_affinity&nbsp;auto;
worker_rlimit_nofile100000;

# 事件模块配置
events&nbsp;{
&nbsp; &nbsp;&nbsp;worker_connections50000;
&nbsp; &nbsp;&nbsp;useepoll;
&nbsp; &nbsp;&nbsp;multi_accepton;
&nbsp; &nbsp;&nbsp;accept_mutexoff;
}

# HTTP配置
http&nbsp;{
&nbsp; &nbsp;&nbsp;# 连接超时优化
&nbsp; &nbsp;&nbsp;keepalive_timeout30;
&nbsp; &nbsp;&nbsp;keepalive_requests1000;

&nbsp; &nbsp;&nbsp;# 缓冲区优化
&nbsp; &nbsp;&nbsp;client_header_buffer_size4k;
&nbsp; &nbsp;&nbsp;large_client_header_buffers416k;
&nbsp; &nbsp;&nbsp;client_max_body_size100m;
&nbsp; &nbsp;&nbsp;client_body_buffer_size128k;
&nbsp; &nbsp;&nbsp;client_body_timeout12;
&nbsp; &nbsp;&nbsp;client_header_timeout12;

&nbsp; &nbsp;&nbsp;# TCP优化
&nbsp; &nbsp;&nbsp;sendfileon;
&nbsp; &nbsp;&nbsp;tcp_nopushon;
&nbsp; &nbsp;&nbsp;tcp_nodelayon;

&nbsp; &nbsp;&nbsp;# 文件传输优化
&nbsp; &nbsp;&nbsp;output_buffers432k;
&nbsp; &nbsp;&nbsp;postpone_output1460;

&nbsp; &nbsp;&nbsp;# 连接限制
&nbsp; &nbsp;&nbsp;limit_conn_zone$binary_remote_addr&nbsp;zone=addr:10m;
&nbsp; &nbsp;&nbsp;limit_conn&nbsp;addr&nbsp;100;
}

# 服务器配置
server&nbsp;{
&nbsp; &nbsp;&nbsp;listen80&nbsp;backlog=32768&nbsp;reuseport;
&nbsp; &nbsp;&nbsp;listen443&nbsp;backlog=32768&nbsp;reuseport ssl http2;

&nbsp; &nbsp;&nbsp;# 启用TCP Fast Open
&nbsp; &nbsp;&nbsp;listen80&nbsp;fastopen=256;
&nbsp; &nbsp;&nbsp;listen443&nbsp;fastopen=256&nbsp;ssl http2;
}

3.2 系统限制优化

#!/bin/bash
# system-limits-optimization.sh

echo"=== 系统限制优化 ==="

# 备份当前limits配置
cp /etc/security/limits.conf /etc/security/limits.conf.backup.$(date +%Y%m%d)

# 优化文件描述符限制
echo"优化文件描述符限制..."
cat >> /etc/security/limits.conf <<&nbsp;'EOF'

# 高并发连接优化
* soft nofile 100000
* hard nofile 100000
* soft nproc 65535
* hard nproc 65535
root soft nofile 100000
root hard nofile 100000

# 进程限制优化
* soft memlock unlimited
* hard memlock unlimited
EOF

# 优化系统级限制
echo"fs.file-max = 1000000"&nbsp;>> /etc/sysctl.conf
echo"kernel.pid_max = 4194303"&nbsp;>> /etc/sysctl.conf
echo"kernel.threads-max = 4194303"&nbsp;>> /etc/sysctl.conf

# 应用配置
sysctl -p

echo&nbsp;"系统限制优化完成!"

四、网络栈优化

4.1 网络接口优化

#!/bin/bash
# network-interface-optimization.sh

echo"=== 网络接口优化 ==="

# 获取主要网络接口
INTERFACE=$(ip route | awk&nbsp;'/default/ {print $5}'&nbsp;| head -1)

if&nbsp;[ -z&nbsp;"$INTERFACE"&nbsp;];&nbsp;then
&nbsp; &nbsp;&nbsp;echo"未找到默认网络接口"
&nbsp; &nbsp;&nbsp;exit&nbsp;1
fi

echo"优化网络接口:&nbsp;$INTERFACE"

# 优化网络接口参数
ethtool -G&nbsp;$INTERFACE&nbsp;rx 4096 tx 4096 2>/dev/null ||&nbsp;echo"无法调整队列长度"
ethtool -K&nbsp;$INTERFACE&nbsp;gro on lro on 2>/dev/null ||&nbsp;echo"无法调整GRO/LRO"
ethtool -C&nbsp;$INTERFACE&nbsp;rx-usecs 8 2>/dev/null ||&nbsp;echo"无法调整中断合并"

# 优化中断亲和性
echo"优化中断亲和性..."
ifcommand&nbsp;-v irqbalance &>/dev/null;&nbsp;then
&nbsp; &nbsp; systemctl&nbsp;enable&nbsp;irqbalance
&nbsp; &nbsp; systemctl start irqbalance
else
&nbsp; &nbsp;&nbsp;echo"安装irqbalance: apt install irqbalance"
fi

# 设置RPS/RFS(多队列网卡)
echo"设置RPS/RFS..."
if&nbsp;[ -d /sys/class/net/$INTERFACE/queues ];&nbsp;then
&nbsp; &nbsp;&nbsp;for&nbsp;queue&nbsp;in&nbsp;/sys/class/net/$INTERFACE/queues/rx-*;&nbsp;do
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;echo&nbsp;f >&nbsp;$queue/rps_cpus 2>/dev/null
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;echo&nbsp;32768 >&nbsp;$queue/rps_flow_cnt 2>/dev/null
&nbsp; &nbsp;&nbsp;done
fi

echo&nbsp;"网络接口优化完成!"

4.2 防火墙优化

#!/bin/bash
# firewall-optimization.sh

echo"=== 防火墙连接跟踪优化 ==="

# 检查是否使用iptables
ifcommand&nbsp;-v iptables &>/dev/null;&nbsp;then
&nbsp; &nbsp;&nbsp;echo"优化iptables连接跟踪..."

&nbsp; &nbsp;&nbsp;# 调整连接跟踪超时时间
&nbsp; &nbsp; iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
&nbsp; &nbsp; iptables -t raw -A PREROUTING -p tcp --sport 80 -j NOTRACK
&nbsp; &nbsp; iptables -t raw -A OUTPUT -p tcp --sport 80 -j NOTRACK

&nbsp; &nbsp;&nbsp;# 优化连接跟踪表
&nbsp; &nbsp;&nbsp;echo"连接跟踪表大小:&nbsp;$(sysctl -n net.netfilter.nf_conntrack_max)"

elifcommand&nbsp;-v nft &>/dev/null;&nbsp;then
&nbsp; &nbsp;&nbsp;echo"优化nftables配置..."

&nbsp; &nbsp;&nbsp;# nftables优化配置
&nbsp; &nbsp; nft add table raw
&nbsp; &nbsp; nft add chain raw prerouting {&nbsp;type&nbsp;filter hook prerouting priority -300\; }
&nbsp; &nbsp; nft add rule raw prerouting tcp dport 80 ct state untracked
&nbsp; &nbsp; nft add rule raw prerouting tcp sport 80 ct state untracked

else
&nbsp; &nbsp;&nbsp;echo"未发现iptables或nftables"
fi

echo&nbsp;"防火墙优化完成!"

五、压力测试与监控

5.1 压力测试工具

#!/bin/bash
# tcp-load-test.sh

echo"=== TCP并发压力测试 ==="

# 安装测试工具
if&nbsp;!&nbsp;command&nbsp;-v wrk &>/dev/null;&nbsp;then
&nbsp; &nbsp;&nbsp;echo"安装wrk压力测试工具..."
&nbsp; &nbsp; apt update && apt install -y wrk || yum install -y wrk
fi

if&nbsp;!&nbsp;command&nbsp;-v siege &>/dev/null;&nbsp;then
&nbsp; &nbsp;&nbsp;echo"安装siege压力测试工具..."
&nbsp; &nbsp; apt update && apt install -y siege || yum install -y siege
fi

TARGET_URL=${1:-"http://localhost"}
CONCURRENT=${2:-1000}
DURATION=${3:-"30s"}

echo"开始压力测试:&nbsp;$TARGET_URL"
echo"并发数:&nbsp;$CONCURRENT, 持续时间:&nbsp;$DURATION"

# 使用wrk进行测试
echo&nbsp;-e&nbsp;"\n1. 📊 WRK压力测试:"
wrk -t$(nproc) -c$CONCURRENT&nbsp;-d$DURATION&nbsp;--timeout 10s&nbsp;$TARGET_URL

# 使用siege进行测试
echo&nbsp;-e&nbsp;"\n2. 🚀 Siege压力测试:"
siege -c$CONCURRENT&nbsp;-t$DURATION&nbsp;-b&nbsp;$TARGET_URL

# 监控系统状态
echo&nbsp;-e&nbsp;"\n3. 📈 系统状态监控:"
echo"测试前连接数:&nbsp;$(ss -s | awk '/TCP:/ {print $2}')"
echo"测试前负载:&nbsp;$(cat /proc/loadavg)"

# 等待测试完成
sleep $(echo$DURATION&nbsp;| sed&nbsp;'s/s//')

echo&nbsp;-e&nbsp;"\n4. 📊 测试后状态:"
echo"测试后连接数:&nbsp;$(ss -s | awk '/TCP:/ {print $2}')"
echo&nbsp;"测试后负载:&nbsp;$(cat /proc/loadavg)"

5.2 实时性能监控

#!/bin/bash
# tcp-performance-monitor.sh

INTERVAL=1
LOG_FILE="/var/log/tcp_performance.log"

echo"开始TCP性能监控,间隔&nbsp;${INTERVAL}s..."
echo"时间,连接数,ESTABLISHED,SYN_RECV,TIME_WAIT,负载,内存使用,CPU使用"&nbsp;>&nbsp;$LOG_FILE

whiletrue;&nbsp;do
&nbsp; &nbsp;&nbsp;# 获取当前时间
&nbsp; &nbsp; timestamp=$(date +"%Y-%m-%d %H:%M:%S")

&nbsp; &nbsp;&nbsp;# 获取连接信息
&nbsp; &nbsp; conn_total=$(ss -s | awk&nbsp;'/TCP:/ {print $2}')
&nbsp; &nbsp; conn_estab=$(ss -s | awk&nbsp;'/ESTAB/ {print $4}')
&nbsp; &nbsp; conn_syn=$(netstat -tn | grep SYN_RECV | wc -l)
&nbsp; &nbsp; conn_timewait=$(netstat -tn | grep TIME_WAIT | wc -l)

&nbsp; &nbsp;&nbsp;# 获取系统状态
&nbsp; &nbsp; load=$(cat /proc/loadavg | awk&nbsp;'{print $1}')
&nbsp; &nbsp; mem_usage=$(free | awk&nbsp;'/Mem:/ {printf "%.1f", $3/$2*100}')
&nbsp; &nbsp; cpu_usage=$(top -bn1 | grep&nbsp;"Cpu(s)"&nbsp;| awk&nbsp;'{printf "%.1f", 100-$8}')

&nbsp; &nbsp;&nbsp;# 输出到日志文件
&nbsp; &nbsp;&nbsp;echo"$timestamp,$conn_total,$conn_estab,$conn_syn,$conn_timewait,$load,$mem_usage,$cpu_usage"&nbsp;>>&nbsp;$LOG_FILE

&nbsp; &nbsp;&nbsp;# 屏幕输出
&nbsp; &nbsp;&nbsp;printf"\r时间: %s | 连接: %s | ESTAB: %s | SYN: %s | TIME_WAIT: %s | 负载: %s | 内存: %s%% | CPU: %s%%"&nbsp;\
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"$timestamp""$conn_total""$conn_estab""$conn_syn""$conn_timewait""$load""$mem_usage""$cpu_usage"

&nbsp; &nbsp; sleep&nbsp;$INTERVAL
done

六、故障排查与恢复

6.1 TCP连接故障排查

#!/bin/bash
# tcp-troubleshooting.sh

echo"=== TCP连接故障排查 ==="

# 1. 检查连接溢出
echo"1. 🔍 检查连接溢出:"
if&nbsp;dmesg | grep -i&nbsp;"drop"&nbsp;| grep -i&nbsp;"tcp"&nbsp;| tail -5;&nbsp;then
&nbsp; &nbsp;&nbsp;echo"发现TCP连接丢弃!"
else
&nbsp; &nbsp;&nbsp;echo"未发现连接丢弃"
fi

# 2. 检查端口耗尽
echo&nbsp;-e&nbsp;"\n2. 🔢 检查端口耗尽:"
port_usage=$(ss -tn | wc -l)
port_max=$(sysctl -n net.ipv4.ip_local_port_range | awk&nbsp;'{print $2-$1}')
echo&nbsp;"已用端口:&nbsp;$port_usage, 可用端口范围:&nbsp;$port

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:运维星火燎原 刘军军 刘军军《Linux TCP并发请求溢出调优指南》

评论:0   参与:  0