You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Plesk服务器频繁宕机及RAM、SWAP占用过高的原因排查

随机部分域名不可用的核心原因是系统OOM Killer随机杀死高内存占用的php-fpm进程,Plesk多站点场景下不同站点的PHP进程归属独立用户池,被杀进程对应的站点就会暂时无法访问,可按以下优先级排查根因:

PHP-FPM 侧深度排查

  • 开启PHP-FPM慢日志,Plesk面板可直接在对应域名的PHP设置中开启,全局配置路径一般为/opt/plesk/php/[对应PHP版本号]/etc/php-fpm.d/www.conf,添加如下配置:
    request_slowlog_timeout = 3s
    slowlog = /var/log/php-fpm/slow.log
    
    故障发生后优先检查慢日志,定位是否存在未释放数据库连接的死循环代码、递归调用溢出、未优化的第三方CMS插件这类问题,这类问题会导致单进程长期占用内存不释放,叠加高请求量会快速占满内存,触发OOM。
  • 检查PHP-FPM进程管理模式,Plesk默认的ondemand模式在高并发下会频繁创建销毁进程,叠加内存泄漏会加速内存占满,建议临时切换为dynamic模式,最大进程数可按(系统总RAM - 1G系统预留 - MySQL预留RAM)/单个PHP进程平均内存计算,单个PHP进程平均内存可通过命令ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'计算。

MySQL 侧深度排查

  • 开启MySQL慢查询日志,修改MySQL配置文件my.cnf添加如下配置:
    slow_query_log = 1
    slow_query_log_file = /var/log/mysql/slow.log
    long_query_time = 2
    log_queries_not_using_indexes = 1
    
    重点排查故障时段是否存在全表扫描的慢查询、未关闭的长事务连接、批量写入操作,mysqld内存暴涨的场景90%以上都是大量未释放的查询结果集或者锁等待导致的,你之前使用的mysqltuner仅能给出静态配置建议,无法捕获实时异常查询。
  • 故障发生时执行mysql -e "show processlist;"检查活跃连接数,多站点场景下很容易出现单个站点被爬虫遍历触发大量关联查询,占满MySQL连接池和内存,这类请求的特征是单IP请求频率不高,但请求的都是资源消耗大的动态页面,你之前的IP并发统计很难排查到。

系统侧排查

  • 执行命令grep -i oom /var/log/messages(Debian/Ubuntu系统路径为/var/log/syslog)查看OOM Killer日志,确认故障时内核优先杀死的是php-fpm还是mysqld进程,即可直接确定内存泄漏的核心源头。
  • 检查Plesk计划任务列表,是否存在固定时段触发的批量数据处理、备份、站点扫描类脚本,这类后台CLI模式运行的PHP脚本不会被你之前的tcpdump抓包捕获,和前端请求叠加时很容易短时间占满内存。
  • 可临时执行swapoff -a && swapon -a清空SWAP,避免内存泄漏后系统把活跃进程内存置换到SWAP导致服务响应异常卡顿,进一步加剧站点不可用的问题。

内容的提问来源于stack exchange,提问作者CDoc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:45:03