温馨提示×

PHP-FPM性能监控怎么做

小樊
34
2025-12-10 08:28:52
栏目: 编程语言

PHP-FPM性能监控实操指南

一 监控目标与关键指标

  • 进程与连接
    • pm.status_path 暴露的 pool、process manager、start time、start since 等基础信息
    • listen queue、max listen queue、listen queue len 观察排队情况
    • idle processes、active processes、total processes 判断进程是否充足
  • 吞吐与延迟
    • accepted conn、requests 计算吞吐(req/s)
    • slow requests 定位慢请求
    • 通过 request duration(需启用 request_slowlog_timeout)衡量 P95/P99 延迟
  • 资源与稳定性
    • 系统层面:CPU、内存、文件描述符、连接数(netstat/ss)
    • 进程内存:单个 php-fpm 进程的 RSS 与聚合值,防止 OOM
    • 日志:FPM 错误日志、慢日志、Nginx 访问/错误日志

二 快速可用的监控手段

  • 启用并访问 PHP-FPM 状态页
    • 在 pool 配置(如 /etc/php/8.0/fpm/pool.d/www.conf)中开启:
      • pm.status_path = /status
      • 建议同时设置:access.log = /var/log/php-fpm/status.log、access.format = “%R - %u %t "%m %r" %s”
    • Web 端访问:http://your-domain/status?json(或 ?html/?xml),Nginx 侧需对该路径做访问控制(如 allow 127.0.0.1; deny all;)
  • 命令行与系统工具
    • 服务状态:systemctl status php8.0-fpm
    • 资源占用:top/htopps -eo pid,rss,command | grep php-fpm(RSS 单位为 KB)
    • 连接与端口:ss -lntp | grep php-fpmnetstat -tulpen | grep php-fpm
  • Web 服务器与日志
    • Nginx 状态:/nginx_status(需 ngx_http_stub_status_module)
    • 访问分析:goaccess /var/log/nginx/access.log -a
  • 第三方与 APM
    • 平台监控:Prometheus + Grafana(FPM Exporter)、ZabbixDatadogNew Relic
    • 深度分析:Xdebug + Webgrind/KCacheGrind(定位函数级瓶颈,注意性能开销)
  • 进程守护与告警
    • Monit/Supervisor 监控进程存活并自动重启,结合日志告警规则实现 7×24 看护

三 可观测性落地方案 Prometheus Grafana

  • 暴露指标
    • 启用 pm.status_path,使用 prometheus-php-fpm-exporternginx-php-fpm-exporter 拉取状态页(JSON)并转换为 /metrics
  • 采集与存储
    • Prometheus 抓取间隔建议 15s;Grafana 使用 5–15s 刷新
  • 关键面板与 PromQL 示例
    • 吞吐:rate(php_fpm_accepted_conn_total[1m])
    • 排队:php_fpm_listen_queue or (php_fpm_max_children - php_fpm_active_processes)
    • 进程健康:php_fpm_active_processes / php_fpm_max_children
    • 慢请求:rate(php_fpm_slow_requests_total[5m])
    • P95 延迟(若 exporter 提供直方图或经日志计算):histogram_quantile(0.95, sum(rate(php_fpm_request_duration_seconds_bucket[1m])) by (le))
  • 告警规则示例
    • 队列堆积:php_fpm_listen_queue > 10 持续 2 分钟
    • 进程打满:php_fpm_active_processes / php_fpm_max_children > 0.9 持续 3 分钟
    • 慢请求激增:rate(php_fpm_slow_requests_total[5m]) > 0.1
    • 进程异常退出:up{job=“php-fpm”} == 0

四 日志与 APM 的协同

  • 日志体系
    • FPM 错误日志与慢日志:记录 Fatal/Parse/Recoverable 错误与超过阈值的慢请求堆栈
    • Nginx 访问/错误日志:配合 goaccess 做流量、错误码、UA、地理分布分析
    • 集中化:使用 ELK/Graylog 收集、检索与可视化,设置关键字与阈值告警(如 5xx 比例、慢请求突增)
  • APM 深入
    • New Relic/Datadog APM:无侵入采集 事务、数据库/外部调用、错误、调用栈,与 FPM 指标/日志联动定位根因

五 告警阈值与优化动作

  • 阈值建议(需结合实际容量与 SLO 调整)
    • listen queue > 10 或接近 listen queue len
    • active processes / max_children > 0.8
    • slow requests 持续增长
    • 单进程 RSS 接近或突破 php_admin_value[memory_limit] 的风险阈值
  • 快速处置
    • 平滑重启释放内存:kill -USR2 $(cat /var/run/php-fpm.pid)(不中断现有请求)
    • 扩容进程池:适度提高 pm.max_children(需确保 内存与 CPU 充足)
    • 打开/调优慢日志:request_slowlog_timeout = 1s,定位长 SQL、外部 API、循环等
    • 资源与连接:检查 文件描述符限制(ulimit -n)、数据库/缓存连接池与超时
  • 容量规划
    • 估算峰值并发:并发 ≈ RPS × 平均响应时间(秒)
    • 预留 20–30% 余量,结合 P95/P99 与队列指标做弹性扩缩容

0