真实内存压力看free -h的available值,而非宝塔首页数字;需分别查ps aux中python、php-fpm、mysqld的rss,df -h /dev/shm查session堆积,并协同调整pm.max_children与innodb_buffer_pool_size。

宝塔面板内存占用高,不是“内存泄漏”,而是多个常驻进程+缓存池+配置冗余共同占满物理内存。1GB 机器上看到 70% 内存使用率,大概率是 python、php-fpm、mysqld 三者加起来吃光了——得分别查、分别压、分别放。
怎么看真实内存压力,而不是被宝塔首页数字骗了
宝塔首页显示的“内存使用率”只统计 RSS 可见进程,完全不包含 OPcache 内存池、innodb_buffer_pool_size 的私有页、/dev/shm 中的 session 文件。这些全在内核页表里,free -h 的 available 列才反映真实余量。
- 执行
free -h,盯住available值,不是used - 执行
ps aux --sort=-%mem | head -n 10,看哪些进程 RSS 真高(注意mysqld、php-fpm:、python) - 执行
df -h /dev/shm,如果接近 100%,说明 PHP session 堆满了没清理 - 别信宝塔「系统监控」图表——它采样间隔长、过滤逻辑模糊,容易掩盖瞬时峰值
怎么调低 PHP-FPM 的内存胃口,而不是硬 kill 进程
pm.max_children 是最大杀伤力参数。一个 php-fpm 子进程平均占 40MB,设成 20 就稳稳吃掉 800MB。但不能直接砍到 2——得先看负载再动刀。
- 查当前活跃子进程数:
ps aux | grep 'php-fpm:' | wc -l - 查当前配置:
grep 'pm.max_children\|pm.start_servers' /www/server/php/82/etc/php-fpm.d/www.conf(把82换成你实际版本) - 1GB 机器建议值:
pm.max_children = 4,pm.start_servers = 2,pm.min_spare_servers = 1 - 改完必须重启:
bt restart或service php-fpm-82 restart(版本号要对) - 更省但有代价:把
pm = dynamic改成pm = ondemand,首次请求延迟略高,适合低流量站点
为什么 OPcache 不清,内存就“越用越多”还释放不掉
OPcache 的内存池是 PHP 自己管理的,不走系统 malloc/free,所以 top 看不到它涨,free 也看不到它退。但 opcache_get_status()['memory_usage']['used_memory'] 会持续上升,直到触发 OOM Kill。
- 确认是否启用:
php -i | grep opcache.enable,输出on才生效 - 别等它自动失效——默认
opcache.revalidate_freq = 2秒检查文件修改,但旧字节码不会自动踢出 - 临时刷新:
curl http://你的域名/oc.php(该文件内容仅<?php opcache_reset(); ?>),记得加 IP 白名单 - 长期方案:在
www.conf加一行php_admin_value[opcache.max_accelerated_files] = 7963(避免哈希冲突导致缓存膨胀) - 终极干净:重启对应 PHP 版本的
php-fpm,比清缓存更彻底
哪些“清理动作”反而会让内存更紧张
很多人一看到内存高就去删日志、清缓存、关服务,结果发现没降反升——因为某些操作触发了重建或重载逻辑,瞬间拉高 RSS。
- 删
/www/server/panel/logs/下的日志没问题,但删/www/server/panel/data/default.db会强制重建 SQLite,期间面板卡死、内存飙升 - 执行
echo 30 > /www/server/panel/data/interval.pl后必须bt restart,否则新间隔不生效,旧轮询还在跑 - 卸载不用的 PHP 版本前,先确认没网站绑定它;否则卸载后站点 502,PHP-FPM 会反复 fork 子进程重试
- 别手动
rm -f /dev/shm/php-fpm.*,而要用find /dev/shm -name "php-fpm.*" -mmin +60 -delete,避免删掉正在用的 session 文件导致用户登出
最常被忽略的是:MySQL 的 innodb_buffer_pool_size 和 PHP 的 pm.max_children 是两个独立内存大户,但它们共享同一块物理内存。调其中一个不碰另一个,等于只拧松一半螺丝——得一起算总账,再留出至少 200MB 给系统和宝塔自身。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











