跳转到主内容
极星编程网:以代码为星,赴技术山海!

宝塔面板内存占用太高怎么办_利用Linux监控面板与PHP-FPM调优

真实内存压力看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 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 立即学习 “ PHP免费学习笔记(深入) ”; 确认是否启用:
php -i | grep opcache.enable
,输出
on
才生效 别等它自动失效——默认
opcache.revalidate_freq = 2
秒检查文件修改,但旧字节码不会自动踢出 临时刷新:
curl http://你的域名/oc.php
(该文件内容仅
),记得加 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 给系统和宝塔自身。

相关文章