文档目录
服务器资源监控

简介

本方案为 DouPHP 站点提供一套完整的服务器资源监控与告警体系,覆盖 CPU、内存、磁盘 I/O、网络以及系统级指标采集(Prometheus + Node Exporter),并结合站点内健康检查模块形成“采集—存储—展示—告警”的闭环。文档同时给出在现有代码基础上的集成点建议与实施步骤,确保在不破坏既有业务逻辑的前提下完成监控落地。

项目结构

DouPHP 采用模块化与分层架构:入口引导、配置加载、文件系统抽象、路由与控制器、服务层等职责清晰。监控方案将利用以下关键位置进行扩展:

  • 应用引导阶段:用于注册全局中间件或事件监听,便于统一埋点与指标上报。
  • 配置中心:集中管理监控开关、阈值、采集频率等参数。
  • 文件系统:通过 Disk 抽象定位站点根与上传目录,辅助磁盘空间与 I/O 统计。
  • 健康检查模块:作为站内健康探针与可视化入口,可对接外部监控系统。
graph TB
A["入口引导<br/>core/bootstrap.php"] --> B["配置加载<br/>config/config.php"]
A --> C["系统常量与模块清单<br/>config/system.php"]
A --> D["文件系统管理器<br/>core/filesystem/FilesystemManager.php"]
E["健康检查路由<br/>front/route/health.php"] --> F["健康控制器<br/>_'/module/health/admin/controller/health/HealthController.php"]
F --> G["健康服务<br/>_'/module/health/core/service/health/HealthService.php"]

核心组件

  • 应用引导与生命周期钩子:在 bootstrap 阶段完成常量定义、配置加载、容器初始化与请求捕获,适合在此注入监控所需的中间件或事件监听器。
  • 配置中心:集中存放数据库、调试开关、模块清单等;可在其中新增监控相关配置项(如采集频率、阈值)。
  • 文件系统抽象:通过 FilesystemManager 解析磁盘名与路径,便于对站点根、上传目录进行空间与 I/O 监控。
  • 健康检查模块:提供后台健康档案管理与前端健康路由,可作为站内健康探针与可视化入口,并对外暴露指标端点。

架构总览

整体架构分为四层:

  • 数据采集层:Node Exporter 采集系统级指标;PHP 进程内通过中间件/事件监听采集应用级指标(CPU、内存、I/O、网络)。
  • 指标汇聚层:Prometheus 定时抓取 Node Exporter 与应用指标端点。
  • 可视化与告警层:Grafana 展示面板;Alertmanager 基于规则触发告警通知。
  • 应用集成层:在 DouPHP 中通过健康检查模块暴露 /health/metrics 接口,供 Prometheus 抓取;在引导阶段注入监控中间件。
graph TB
subgraph "采集层"
NE["Node Exporter<br/>系统指标"]
APP["DouPHP 应用<br/>中间件/事件监听"]
end
subgraph "汇聚层"
PM["Prometheus"]
end
subgraph "可视化与告警"
GF["Grafana"]
AM["Alertmanager"]
end
NE --> PM
APP --> PM
PM --> GF
PM --> AM

详细组件分析

CPU 使用率监控

  • 进程级 CPU 占用:通过 PHP-FPM 进程信息(如 top/htop、/proc 或系统命令)采集每个 worker 的 CPU 使用率;在应用侧可通过事件监听记录慢请求与热点路径,辅助定位 CPU 瓶颈。
  • 系统级 CPU 负载:由 Node Exporter 暴露 load 与 cpu 指标,Prometheus 拉取后计算多核利用率与等待时间。
  • 瓶颈识别:结合应用指标(请求耗时、SQL 耗时)与系统指标(iowait、steal)判断是否为 CPU 饱和、锁竞争或 IO 阻塞。
sequenceDiagram
participant P as "Prometheus"
participant N as "Node Exporter"
participant S as "DouPHP 应用"
participant M as "中间件/事件监听"
P->>N : 抓取系统CPU/负载
P->>S : 抓取应用指标(/health/metrics)
S->>M : 请求进入时记录耗时/热点
M-->>S : 返回聚合指标
S-->>P : 输出指标文本

内存占用监控

  • PHP 进程内存使用:通过 PHP-FPM 状态与系统工具(top、ps、/proc)采集 RSS、VMS;在应用侧记录大对象分配与缓存大小。
  • 堆内存分配:结合 Xdebug/Blackfire 或内置 profiler 分析热点函数与内存峰值。
  • 内存泄漏检测:长期观察 RSS 增长趋势,配合 GC 统计与日志定位疑似泄漏路径。
flowchart TD
Start(["开始"]) --> Collect["采集PHP进程内存(RSS/VMS)"]
Collect --> Profile{"是否启用Profiler?"}
Profile --> |是| Analyze["分析热点与内存峰值"]
Profile --> |否| Observe["观察RSS趋势与GC统计"]
Analyze --> Detect["定位潜在泄漏点"]
Observe --> Detect
Detect --> Report["生成报告并告警"]
Report --> End(["结束"])

磁盘 I/O 监控

  • 文件读写速度:通过 Node Exporter 的 diskio 指标统计读写速率与延迟;在应用侧对关键写入路径(如附件上传)增加耗时统计。
  • 磁盘空间使用:利用 FilesystemManager 解析站点根与上传目录,定期扫描剩余空间并上报。
  • I/O 等待时间:关注 iowait 与 await 指标,结合 SQL 慢查询日志定位 IO 瓶颈。
classDiagram
class FilesystemManager {
+disk(name) Disk
+build(relativeRoot, overrides) Disk
+getDiskConfig(name) array
}
class Disk {
+root string
+url string
+upload_max_kb int
+allow_extensions string
}
FilesystemManager --> Disk : "创建/获取"

网络监控配置

  • 带宽使用:通过 Node Exporter 的网络接口指标(bytes/s、packets/s)统计带宽。
  • 连接数统计:统计 TCP 连接数、HTTP 并发连接数;在应用侧记录活跃会话与队列长度。
  • 网络延迟监控:对关键外部调用(如支付、短信、AI 接口)增加 RTT 统计,结合系统网络丢包率分析。
sequenceDiagram
participant App as "DouPHP 应用"
participant Ext as "外部服务(支付/短信/AI)"
participant NE as "Node Exporter"
participant PM as "Prometheus"
App->>Ext : 发起请求并记录RTT
NE-->>PM : 上报网络带宽/连接数
App-->>PM : 上报应用网络指标
PM-->>App : 告警规则触发

系统级监控工具集成(Prometheus + Node Exporter)

  • 部署 Node Exporter:在服务器上运行 Node Exporter,暴露 /metrics 端点。
  • 配置 Prometheus:添加 scrape_configs 抓取 Node Exporter 与 DouPHP 应用指标端点(建议通过健康检查模块暴露 /health/metrics)。
  • 数据持久化与可视化:Prometheus 持久化指标,Grafana 导入标准仪表盘。
graph LR
NE["Node Exporter"] -- "/metrics" --> PM["Prometheus"]
APP["DouPHP /health/metrics"] -- "scrape" --> PM
PM -- "查询/告警" --> GF["Grafana"]
PM -- "告警" --> AM["Alertmanager"]

资源使用告警机制

  • 阈值设置:
    • CPU:单核使用率 > 80% 持续 5 分钟;系统负载 > CPU 核数 * 1.5。
    • 内存:RSS 持续增长且无回落;OOM 风险预警。
    • 磁盘:剩余空间 &lt; 10%;I/O 等待 > 20%。
    • 网络:丢包率 > 1%;RTT 突增。
  • 通知策略:
    • 分级告警:警告(恢复前不重复)、严重(立即通知)、致命(自动扩缩容/熔断)。
    • 渠道:邮件、企业微信、钉钉、短信。
    • 抑制与合并:避免风暴,按服务/主机维度聚合。
flowchart TD
T["阈值检测"] --> W{"是否超过阈值?"}
W --> |否| N["继续采集"]
W --> |是| L["级别判定(警告/严重/致命)"]
L --> C["选择通知渠道"]
C --> R["发送告警并记录"]
R --> N

依赖关系分析

  • 引导阶段依赖:bootstrap 负责常量、配置、容器与请求捕获,监控中间件应在此阶段注册,确保所有请求均被度量。
  • 配置依赖:监控开关、阈值、采集频率集中在 config 中,便于环境隔离与动态调整。
  • 文件系统依赖:FilesystemManager 提供磁盘抽象,便于对站点根与上传目录进行空间与 I/O 监控。
  • 健康模块依赖:健康控制器与服务提供站内健康探针与可视化入口,可对接外部监控系统。
graph TB
B["bootstrap.php"] --> Cfg["config/config.php"]
B --> Sys["config/system.php"]
B --> FS["FilesystemManager.php"]
H["HealthController.php"] --> HS["HealthService.php"]
R["front/route/health.php"] --> H

性能考量

  • 采样频率:系统指标 15s 一次,应用指标根据 QPS 调整;避免过高频率导致额外开销。
  • 指标粒度:按服务/主机/路由维度打标签,便于定位问题但需控制基数。
  • 存储成本:保留短期高粒度数据,长期降采样;合理设置 retention。
  • 应用开销:中间件仅做轻量统计,复杂分析异步化;避免阻塞主流程。

故障排查指南

  • 无法抓取指标:检查 Node Exporter 与 Prometheus 连通性;确认 /health/metrics 可访问。
  • 指标缺失:确认 bootstrap 已注册监控中间件;检查配置开关是否开启。
  • 磁盘空间告警:通过 FilesystemManager 定位站点根与上传目录,清理无用文件。
  • CPU 飙升:结合应用热点与 SQL 慢查询,定位瓶颈路径;必要时扩容或优化。
  • 内存泄漏:观察 RSS 趋势,启用 Profiler 分析;修复疑似泄漏点。

结论

通过在 DouPHP 中集成 Node Exporter 与 Prometheus,并在应用层通过健康检查模块暴露指标端点,可实现从系统到应用的全面资源监控与告警。结合合理的阈值与通知策略,能够及时发现并处理 CPU、内存、磁盘 I/O 与网络问题,保障站点稳定运行。

附录

  • 推荐仪表盘:系统概览、CPU/内存/磁盘/网络、应用请求量与耗时、错误率。
  • 告警规则示例:CPU 使用率、内存 OOM、磁盘剩余空间、网络丢包、RTT 突增。
  • 最佳实践:最小化指标基数、异步化重计算、定期回顾阈值与容量规划。
添加日期:2026-10-05