发布于2026-07-10 阅读(0)
扫一扫,手机访问
当你的 ThinkPHP 应用跑着跑着,突然响应变慢、内存压力飙升、甚至出现 OOM(内存耗尽)错误,十有八九是系统 Swap 交换空间被大量使用——背后就是物理内存已经快扛不住了。
遗憾的是,ThinkPHP 本身并不自带 Swap 监控,你得借助系统命令、内核文件,或与外部监控工具协作来采集真实状态。下面这五种方法可以落地,覆盖从简单到复杂的场景。
这个方法最简单:用 PHP 的 shell_exec() 调用 Linux 原生命令,直接读取内核暴露的 Swap 统计信息。好处是无需额外扩展,CentOS、Ubuntu、甚至 macOS 都能用(命令格式稍作调整即可)。适合放在定时任务或运维接口里,按需触发。
具体几步走:
php think system:swap 命令;swapon -s 命令列出当前启用的交换设备路径和大小(单位是 KB);free -m 命令,提取第三行 Swap 行的 used 和 total 字段(单位是 MB);{"total_mb":2048,"used_mb":426,"usage_percent":20.8};swapon -s 返回空或 free 报错,就返回“Swap 未启用或权限不足”提示,跳过后续计算。这个方法更安全,它绕过外部命令执行,直接读取 Linux 内核提供的 /proc/meminfo 文件。这样做的好处很明显:没有命令注入风险,也没有 fork 开销,适合高频轻量检查。文件里 SwapTotal 和 SwapFree 两个字段,精确反映了当前 Swap 配置和剩余容量。
file_get_contents('/proc/meminfo') 抓取原始内容;SwapTotal:\s+(\d+)\s+kB 和 SwapFree:\s+(\d+)\s+kB 这两行数值提取出来;把 Swap 监控嵌入日志系统,是一种低侵入式的状态捕获方案。通过自定义日志处理器,每次写入 error 或 critical 级别日志时,顺便附上当前 Swap 使用率,方便事后回溯故障根因。
config/log.php 中新增一个叫 swap_monitor 的通道,类型设为 custom;think\log\driver\File,重写 write() 方法——在写入前调用 getSwapUsage() 获取当前值;notice 或更高,避免 debug 模式下产生冗余输出;用 Prometheus + Node Exporter 搭建长期可观测性,把 Swap 指标作为独立维度暴露出来。然后通过 ThinkPHP 的 HTTP 客户端定期拉取或推送到指标服务,实现跨服务的统一视图。
node_memory_SwapTotal_bytes 和 node_memory_SwapFree_bytes 指标已经采集到;think\Http 发起 GET 请求到 http://localhost:9100/metrics,解析文本格式指标;Swap 的数值本身只是表面现象,必须结合物理内存压力和进程内存占用一起看,才能判断问题的本质——到底是内存泄漏、缓存膨胀,还是突发流量引发的 Swap 激活。
/proc/meminfo 里的 MemA vailable、Buffers、Cached 字段,计算真实可用内存;ps aux --sort=-%mem | head -n 10,拿到内存占用 Top 10 的进程,重点关注 PHP-FPM 子进程的 RSS 值;MemA vailable 很充足,但 SwapUsed 非零,就要检查是否有休眠进程或内核模块异常占用;runtime/cache/swap_diagnosis.php,供诊断脚本调用。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8