PHP项目TCP连接数过高如何分析连接状态

wen PHP项目 26

本文目录导读:

PHP项目TCP连接数过高如何分析连接状态

  1. 基础连接状态分析
  2. 详细连接分析
  3. PHP-FPM相关排查
  4. 应用层面分析
  5. 高级诊断工具
  6. 常见问题及解决方案
  7. 监控告警设置
  8. 快速诊断流程
  9. 建议的排查顺序

针对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

建议的排查顺序

  1. 先看统计:各状态连接数分布
  2. 定位进程:确认是否PHP-FPM引起
  3. 检查配置:PHP-FPM参数是否合理
  4. 分析代码:数据库、Redis连接是否正确管理
  5. 优化系统:调整内核参数
  6. 持续监控:设置告警机制

如果需要更具体的帮助,请提供:

  • ss -ant | head -30 的输出
  • PHP-FPM配置内容
  • 连接数过高的具体数值和正常值对比

抱歉,评论功能暂时关闭!