本文目录导读:

针对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配置内容
- 连接数过高的具体数值和正常值对比
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播