sys_getloadavg()可快速获取linux/unix系统1/5/15分钟负载均值,需检查函数存在性、结合cpu核心数归一化使用;内存监控应解析memory_limit并用memory_get_usage(true)测峰值;底层指标需读/proc文件但须异步缓存;高并发下监控须解耦采集与上报,避免阻塞。

用 sys_getloadavg() 快速获取系统负载,但注意它不跨平台
sys_getloadavg() 是 php 原生函数,返回过去 1/5/15 分钟的平均负载值,适合轻量级监控。但它只在 Linux/Unix 系统有效,windows 下直接返回 false,且数值是相对 CPU 核心数的——比如 4 核机器上负载为 4.0 表示满载,不是绝对阈值。
- 实际使用前务必用
function_exists('sys_getloadavg')检查可用性 - 不要直接比较
load > 1.0,应结合shell_exec('nproc 2>/dev/NULL')获取核心数做归一化 - 该函数开销极低,可每 5–10 秒调用一次,但别在高并发请求中同步调用(避免阻塞)
用 memory_get_usage() 和 memory_limit 判断内存是否临界
PHP 的内存监控不能只看 memory_get_usage(true) 返回的当前分配量,更要对比 ini_get('memory_limit')。注意:若配置为 -1(不限制),该函数返回空字符串,需特殊处理;若为 128M 这类带单位的字符串,得先解析成字节数再比较。
-
memory_get_usage(false)只统计脚本层分配,true才含底层 Zend 分配,监控建议用true - 单次请求中反复调用并记录峰值,比只取结束时的值更有预警价值
- 配合
gc_collect_cycles()主动触发回收后观察内存回落情况,能识别隐式内存泄漏
通过 /proc/stat 和 /proc/meminfo 获取更底层指标(Linux 专用)
当需要 CPU 使用率、可用内存、磁盘 I/O 等精细数据时,PHP 无法靠内置函数覆盖,必须读取 /proc 文件。例如解析 /proc/stat 中 cpu 行的 4 个时间字段(user/nice/system/idle),两次采样做差值才能算出真实 CPU 使用率。
- 读
/proc/meminfo时优先看MemAvailable:(内核 3.14+),比MemFree:更准确反映可分配内存 - 避免在 Web 请求中实时读取这些文件——IO 开销明显,建议用定时脚本写入 redis 或本地缓存,PHP 只读缓存
- 路径权限需确保 PHP 进程(如 www-data)有读取
/proc的权限,容器环境常因挂载限制失败
高并发下监控本身不能成为瓶颈:异步上报 + 采样降频
监控逻辑如果嵌在每个请求里,尤其还包含 shell 调用或网络请求,会迅速拖垮服务。真正的高并发系统监控必须解耦:采集与上报分离,且默认关闭全量采集。
立即学习“PHP免费学习笔记(深入)”;
- 用
pcntl_fork()或exec('nohup php monitor-collect.php > /dev/null 2>&1 &')启动后台采集进程,主请求零等待 - 对请求级指标(如响应时间、错误码)启用采样,比如
mt_rand(1, 100) === 1才记录详细日志 - 所有上报走 udp(如 StatsD 协议)或写本地 ring buffer 文件,避免 TCP 连接和序列化开销
最易被忽略的是监控代码的“可观测性”本身——你得知道监控模块有没有在运行、有没有丢数据。给采集进程加一个 /tmp/php-monitor.pid 和心跳文件,比堆砌指标更重要。