本文目录导读:

针对PHP项目TCP连接数过高的问题,分析连接状态需要系统性地排查,以下是完整的分析步骤和命令:
基础连接状态分析
查看总体连接统计
# 查看所有TCP连接状态统计
ss -ant | awk '{print $1}' | sort | uniq -c
# 或使用netstat
netstat -ant | awk '{print $6}' | sort | uniq -c
重点关注的状态
- TIME_WAIT: 正常关闭的连接,通常问题不大
- CLOSE_WAIT: 程序未正确关闭连接,常见问题
- ESTABLISHED: 当前活跃连接数
- SYN_RECV: 可能存在DDoS攻击或连接溢出
详细连接分析
查看连接详情
# 查看所有TCP连接(包含进程信息)
ss -antp
# 查看特定端口的连接
ss -ant | grep :80
# 查看连接最多的IP
ss -ant | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10
分析连接与PHP进程的关系
# 查看PHP-FPM进程的连接数
ss -antp | grep php-fpm | wc -l
# 查看每个PHP子进程的连接数
ss -antp | grep php-fpm | awk '{print $6}' | sort | uniq -c
PHP-FPM相关排查
检查PHP-FPM配置
# 查看PHP-FPM配置 cat /etc/php/8.1/fpm/pool.d/www.conf # 关键参数检查: pm.max_children = 50 # 最大子进程数 pm.start_servers = 20 # 启动时进程数 pm.min_spare_servers = 10 # 最小空闲进程 pm.max_spare_servers = 30 # 最大空闲进程 pm.max_requests = 500 # 最大请求数(建议设置)
查看PHP-FPM状态
# 查看PHP-FPM进程状态 ps aux | grep php-fpm # 查看PHP-FPM连接池状态 curl http://localhost/php-fpm-status?plain # 需要先在配置中启用状态页: # pm.status_path = /php-fpm-status
应用层面分析
检查数据库连接
// 添加数据库连接监控代码
$db->query("SHOW STATUS LIKE 'Threads_connected'");
$db->query("SHOW PROCESSLIST");
检查外部API调用
# 查看对外连接 ss -ant | grep -v "127.0.0.1" | grep ESTAB
高级诊断工具
使用tcpdump抓包分析
# 抓取PHP-FPM端口流量 tcpdump -i eth0 port 9000 -w php_connections.pcap # 分析抓包文件 tcpdump -r php_connections.pcap | head -100
使用strace跟踪进程
# 跟踪PHP-FPM进程的系统调用
strace -p $(pidof php-fpm | awk '{print $1}') -e trace=network,read,write
常见问题及解决方案
问题1: CLOSE_WAIT过多
原因: 程序未正确关闭连接 解决方案:
// 确保所有连接都被关闭 $pdo = null; $redis->close(); // 或使用连接池
问题2: TIME_WAIT过多
原因: 短时间内大量连接关闭 优化方案:
# 调整内核参数 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0 # 新版内核已移除 net.ipv4.tcp_fin_timeout = 30
问题3: 长连接泄漏
检查代码:
// 使用连接池替代长连接
$redis = new Redis();
$redis->pconnect('127.0.0.1', 6379, 2.5); // 超时设置
监控告警设置
添加监控脚本
#!/bin/bash
# connections_monitor.sh
MAX_CONNECTIONS=1000
CURRENT=$(ss -ant | grep ESTAB | wc -l)
if [ $CURRENT -gt $MAX_CONNECTIONS ]; then
echo "WARNING: High TCP connections: $CURRENT"
# 发送告警
curl -X POST https://alert-server/api/alert
fi
设置cron定时监控
*/5 * * * * /usr/local/bin/connections_monitor.sh
快速诊断流程
# 一站式诊断脚本
echo "=== TCP连接状态统计 ==="
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
echo -e "\n=== PHP-FPM进程数 ==="
ps aux | grep php-fpm | grep -v grep | wc -l
echo -e "\n=== 最高连接IP ==="
ss -ant | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -5
echo -e "\n=== 系统资源 ==="
free -h
top -bn1 | head -5
建议的排查顺序
- 先看统计:各状态连接数分布
- 定位进程:确认是否PHP-FPM引起
- 检查配置:PHP-FPM参数是否合理
- 分析代码:数据库、Redis连接是否正确管理
- 优化系统:调整内核参数
- 持续监控:设置告警机制
如果需要更具体的帮助,请提供:
ss -ant | head -30的输出- PHP-FPM配置内容
- 连接数过高的具体数值和正常值对比