
#!/bin/bash
# timewait-monitor.sh
echo"=== TIME_WAIT 状态深度监控 $(date) ==="
echo""
# 1. 总体连接统计
echo"1. 📊 总体TCP连接统计:"
ss -s | head -5
echo""
# 2. TIME_WAIT 详细统计
echo"2. 🔍 TIME_WAIT 状态详细分析:"
timewait_total=$(ss -s | awk '/TIME-WAIT/ {print $4}')
echo" TIME_WAIT 总数: $timewait_total"
# 按端口统计TOP10
echo -e "\n3. 📈 TIME_WAIT 端口分布 (TOP10):"
ss -tan state time-wait | awk '{print $5}' | awk -F: '{print $NF}' | sort | uniq -c | sort -nr | head -10
echo""
# 4. 连接持续时间分析
echo"4. ⏰ TIME_WAIT 连接持续时间分布:"
# 获取所有TIME_WAIT连接的计时器值
echo" 计时器值分布:"
ss -to state time-wait | grep timer | awk '{print $NF}' | sort | uniq -c | sort -nr | head -5
echo""
# 5. 内存使用分析
echo"5. 💾 内存使用情况:"
if [ -f /proc/slabinfo ]; then
slab_info=$(awk '/tw_sock_TCP/ {print " TW sockets: "$2" objects, "$3"KB"}' /proc/slabinfo)
if [ -n "$slab_info" ]; then
echo"$slab_info"
else
echo" 未找到tw_sock_TCP slab信息"
fi
fi
echo""
# 6. 端口使用率
echo"6. 🔢 端口使用率分析:"
ports_used=$(ss -tan | wc -l)
ports_range=$(sysctl -n net.ipv4.ip_local_port_range | awk '{print $2-$1+1}')
timewait_ports=$(ss -tan state time-wait | wc -l)
echo" 总连接数: $ports_used"
echo" TIME_WAIT连接数: $timewait_ports"
echo" 可用端口范围: $ports_range"
echo" TIME_WAIT占比: $(echo "scale=2; $timewait_ports*100/$ports_used" | bc)%"
echo""
# 7. 系统参数检查
echo"7. ⚙️ 当前系统参数:"
echo" tcp_max_tw_buckets: $(sysctl -n net.ipv4.tcp_max_tw_buckets)"
echo" tcp_tw_reuse: $(sysctl -n net.ipv4.tcp_tw_reuse)"
echo" tcp_tw_recycle: $(sysctl -n net.ipv4.tcp_tw_recycle)"
echo" tcp_fin_timeout: $(sysctl -n net.ipv4.tcp_fin_timeout)"
echo" ip_local_port_range: $(sysctl -n net.ipv4.ip_local_port_range)"
echo""
# 8. 性能影响评估
echo"8. 📊 性能影响评估:"
if [ $timewait_ports -gt 10000 ]; then
echo" ⚠️ 检测到大量TIME_WAIT连接,可能影响性能"
elif [ $timewait_ports -gt 50000 ]; then
echo" ❗ TIME_WAIT连接过多,急需优化"
else
echo" ✅ TIME_WAIT连接数量正常"
fi
#!/bin/bash
# timewait-realtime.sh
INTERVAL=2
DURATION=600
echo"开始TIME_WAIT实时监控,间隔 ${INTERVAL}s,持续 ${DURATION}s..."
end=$((SECONDS+DURATION))
while [ $SECONDS -lt $end ]; do
clear
echo"=== TIME_WAIT实时监控 $(date) ==="
# 获取连接统计
total_conn=$(ss -s | awk '/TCP:/ {print $2}')
timewait=$(ss -s | awk '/TIME-WAIT/ {print $4}')
established=$(ss -s | awk '/ESTAB/ {print $4}')
# 计算百分比
if [ $total_conn -gt 0 ]; then
timewait_pct=$(echo"scale=2; $timewait*100/$total_conn" | bc)
else
timewait_pct=0
fi
echo"总连接: $total_conn, ESTABLISHED: $established, TIME_WAIT: $timewait ($timewait_pct%)"
# 端口使用情况
ports_used=$(ss -tan | wc -l)
ports_range=$(sysctl -n net.ipv4.ip_local_port_range | awk '{print $2-$1+1}')
ports_pct=$(echo"scale=2; $ports_used*100/$ports_range" | bc)
echo"端口使用: $ports_used/$ports_range ($ports_pct%)"
# 检查端口耗尽风险
if (( $(echo"$ports_pct > 80" | bc -l) )); then
echo -e "⚠️ 端口使用率过高!"
fi
# 显示TOP TIME_WAIT端口
echo"TOP TIME_WAIT端口:"
ss -tan state time-wait | awk '{print $5}' | awk -F: '{print $NF}' | sort | uniq -c | sort -nr | head -3
sleep $INTERVAL
done
#!/bin/bash
# optimize-timewait-kernel.sh
echo"=== TIME_WAIT内核参数深度优化 ==="
# 备份当前配置
BACKUP_DIR="/etc/backup/timewait_$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_DIR
cp /etc/sysctl.conf $BACKUP_DIR/
echo"当前TIME_WAIT参数:"
echo"tcp_max_tw_buckets: $(sysctl -n net.ipv4.tcp_max_tw_buckets)"
echo"tcp_tw_reuse: $(sysctl -n net.ipv4.tcp_tw_reuse)"
echo"tcp_tw_recycle: $(sysctl -n net.ipv4.tcp_tw_recycle)"
echo"tcp_fin_timeout: $(sysctl -n net.ipv4.tcp_fin_timeout)"
echo""
# 应用优化参数
echo"应用TIME_WAIT优化参数..."
cat >> /etc/sysctl.conf << 'EOF'
# ================ TIME_WAIT 状态优化 ================
# 1. 增加TIME_WAIT桶数量(根据内存调整)
# 默认值: 180000
# 建议值: 根据系统内存调整,每连接约消耗1KB内存
net.ipv4.tcp_max_tw_buckets = 2000000
# 2. 启用TIME_WAIT连接重用
# 允许将TIME_WAIT连接用于新的出站连接
# 安全且推荐启用
net.ipv4.tcp_tw_reuse = 1
# 3. 禁用TIME_WAIT快速回收(NAT环境下必须禁用)
# 在NAT环境下启用会导致连接问题
# 建议保持禁用状态
net.ipv4.tcp_tw_recycle = 0
# 4. 减少FIN_WAIT_2超时时间
# 加速连接关闭过程
net.ipv4.tcp_fin_timeout = 30
# 5. 增加本地端口范围
# 提供更多可用端口,减少端口耗尽风险
net.ipv4.ip_local_port_range = 10000 65535
# 6. 优化连接关闭参数
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
# 7. 减少SYN重试次数
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
# 8. 启用TCP时间戳(有助于连接重用)
net.ipv4.tcp_timestamps = 1
# 9. 连接跟踪优化(如果使用防火墙)
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
EOF
# 应用配置
sysctl -p
echo""
echo"优化后的参数:"
echo"tcp_max_tw_buckets: $(sysctl -n net.ipv4.tcp_max_tw_buckets)"
echo"tcp_tw_reuse: $(sysctl -n net.ipv4.tcp_tw_reuse)"
echo"tcp_tw_recycle: $(sysctl -n net.ipv4.tcp_tw_recycle)"
echo"tcp_fin_timeout: $(sysctl -n net.ipv4.tcp_fin_timeout)"
echo""
echo"TIME_WAIT内核参数优化完成!"
#!/bin/bash
# optimize-timewait-memory.sh
echo"=== TIME_WAIT连接内存优化 ==="
# 计算系统内存和推荐配置
total_mem_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
total_mem_mb=$((total_mem_kb / 1024))
echo"系统总内存: ${total_mem_mb}MB"
# 根据内存大小推荐配置
if [ $total_mem_mb -lt 4096 ]; then
# 小内存系统
tw_buckets=180000
tcp_mem="196608 262144 393216"
elif [ $total_mem_mb -lt 16384 ]; then
# 中等内存系统
tw_buckets=360000
tcp_mem="524288 699050 1048576"
else
# 大内存系统
tw_buckets=2000000
tcp_mem="786432 1048576 1572864"
fi
echo"推荐配置:"
echo"tcp_max_tw_buckets = $tw_buckets"
echo"tcp_mem = $tcp_mem"
# 应用内存优化配置
cat >> /etc/sysctl.conf << EOF
# 内存相关的TIME_WAIT优化
net.ipv4.tcp_max_tw_buckets = $tw_buckets
net.ipv4.tcp_mem = $tcp_mem
# socket缓冲区优化
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
EOF
# 应用配置
sysctl -p
echo"内存优化配置完成!"
#!/bin/bash
# optimize-connection-pool.sh
echo"=== 应用程序连接池优化 ==="
# 检测常见的应用服务并优化其连接池配置
SERVICES=("nginx""apache2""httpd""mysql""postgresql""redis""tomcat")
for service in"${SERVICES[@]}"; do
if systemctl is-active --quiet $service; then
echo"检测到运行的服务: $service"
case$servicein
nginx|apache2|httpd)
optimize_web_server $service
;;
mysql)
optimize_mysql
;;
postgresql)
optimize_postgresql
;;
redis)
optimize_redis
;;
tomcat)
optimize_tomcat
;;
esac
fi
done
optimize_web_server() {
local service=$1
echo"优化Web服务器 $service 连接池..."
# 对于Nginx
if [ "$service" = "nginx" ]; then
# 备份配置
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup.$(date +%Y%m%d)
# 优化keepalive配置
sed -i '/keepalive_timeout/c\keepalive_timeout 30;' /etc/nginx/nginx.conf
sed -i '/keepalive_requests/c\keepalive_requests 1000;' /etc/nginx/nginx.conf
# 优化worker连接数
sed -i '/worker_connections/c\ worker_connections 50000;' /etc/nginx/nginx.conf
systemctl reload nginx
echo"Nginx连接池优化完成"
fi
}
optimize_mysql() {
echo"优化MySQL连接池..."
# MySQL连接池配置优化
MYSQL_CONF="/etc/mysql/my.cnf"
if [ -f $MYSQL_CONF ]; then
cp $MYSQL_CONF$MYSQL_CONF.backup.$(date +%Y%m%d)
# 添加或修改连接池配置
if grep -q "\[mysqld\]"$MYSQL_CONF; then
cat >> $MYSQL_CONF << 'EOF'
# 连接池优化
max_connections = 1000
max_connect_errors = 1000000
wait_timeout = 600
interactive_timeout = 600
EOF
fi
systemctl restart mysql
echo"MySQL连接池优化完成"
fi
}
echo"应用程序连接池优化完成!"
#!/bin/bash
# optimize-client-connections.sh
echo"=== 客户端连接行为优化 ==="
# 创建连接优化建议文档
cat > /tmp/connection-optimization-guide.md << 'EOF'
# 客户端连接优化指南
## 1. HTTP客户端优化
### 1.1 使用连接池
```python
# Python requests
import requests
from requests.adapters import HTTPAdapter
session = requests.Session()
adapter = HTTPAdapter(pool_connections=100, pool_maxsize=100, max_retries=3)
session.mount('http://', adapter)
session.mount('https://', adapter)
// Java HttpClient
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.version(HttpClient.Version.HTTP_2)
.build();
// HikariCP配置
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(20);
config.setMinimumIdle(5);
config.setIdleTimeout(300000);
config.setConnectionTimeout(10000);
- 优雅关闭连接(SHUT_WR -> SHUT_RD)
# 监控TIME_WAIT连接
ss -tan state time-wait | wc -l
# 监控端口使用
netstat -an | grep :80 | wc -l
# 监控连接错误
dmesg | grep -i "drop"
echo "客户端连接优化指南已生成: /tmp/connection-optimization-guide.md"echo "请根据应用程序类型参考相应的优化建议"## 四、网络栈优化
### 4.1 网络接口和队列优化
```bash
#!/bin/bash
# optimize-network-stack.sh
echo"=== 网络栈深度优化 ==="
# 获取主要网络接口
INTERFACE=$(ip route | awk '/default/ {print $5}' | head -1)
if [ -z "$INTERFACE" ]; then
echo"未找到默认网络接口"
exit 1
fi
echo"优化网络接口: $INTERFACE"
# 1. 网络接口参数优化
echo"1. 优化网络接口参数..."
ethtool -G $INTERFACE rx 4096 tx 4096 2>/dev/null || echo"无法调整队列长度"
ethtool -K $INTERFACE gro on gso on tso on 2>/dev/null || echo"无法调整卸载功能"
# 2. 中断亲和性优化
echo"2. 优化中断亲和性..."
ifcommand -v irqbalance &>/dev/null; then
systemctl enable irqbalance
systemctl start irqbalance
else
echo"安装irqbalance: apt install irqbalance"
fi
# 3. RPS/RFS优化(多队列网卡)
echo"3. 配置RPS/RFS..."
if [ -d /sys/class/net/$INTERFACE/queues ]; then
#