真实内存压力看free -h的available值,而非宝塔首页数字;需分别查ps aux中python、php-fpm、mysqld的RSS,df -h /dev/shm查session堆积,并协同调整pm.max_children与innodb_buffer_pool_size。
宝塔面板
内存占用高,不是“内存泄漏”,而是多个常驻进程+缓存池+配置冗余共同占满物理内存。1GB 机器上看到 70% 内存使用率,大概率是
、
、
三者加起来吃光了——得分别查、分别压、分别放。
怎么看真实内存压力,而不是被宝塔首页数字骗了
宝塔首页显示的“内存使用率”只统计 RSS 可见进程,完全不包含
内存池、
的私有页、
中的 session 文件。这些全在内核页表里,
的
列才反映真实余量。
执行
,盯住
值,不是
执行
,看哪些进程 RSS 真高(注意
、
、
)
执行
,如果接近 100%,说明 PHP session 堆满了没清理
别信宝塔「系统监控」图表——它采样间隔长、过滤逻辑模糊,容易掩盖瞬时峰值
怎么调低 PHP-FPM 的内存胃口,而不是硬 kill 进程
是最大杀伤力参数。一个
子进程平均占 40MB,设成 20 就稳稳吃掉 800MB。但不能直接砍到 2——得先看负载再动刀。
查当前活跃子进程数:
查当前配置:
(把
换成你实际版本)
1GB 机器建议值:
,
,
改完必须重启:
或
(版本号要对)
更省但有代价:把
改成
,首次请求延迟略高,适合低流量站点
为什么 OPcache 不清,内存就“越用越多”还释放不掉
的内存池是 PHP 自己管理的,不走系统 malloc/free,所以
看不到它涨,
也看不到它退。但
会持续上升,直到触发 OOM Kill。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
确认是否启用:
,输出
才生效
别等它自动失效——默认
秒检查文件修改,但旧字节码不会自动踢出
临时刷新:
(该文件内容仅
),记得加 IP 白名单
长期方案:在
加一行
(避免哈希冲突导致缓存膨胀)
终极干净:重启对应 PHP 版本的
,比清缓存更彻底
哪些“清理动作”反而会让内存更紧张
很多人一看到内存高就去删日志、清缓存、关服务,结果发现没降反升——因为某些操作触发了重建或重载逻辑,瞬间拉高 RSS。
删
下的日志没问题,但删
会强制重建 SQLite,期间面板卡死、内存飙升
执行
后必须
,否则新间隔不生效,旧轮询还在跑
卸载不用的 PHP 版本前,先确认没网站绑定它;否则卸载后站点 502,PHP-FPM 会反复 fork 子进程重试
别手动
,而要用
,避免删掉正在用的 session 文件导致用户登出
最常被忽略的是:MySQL 的
和 PHP 的
是两个独立内存大户,但它们共享同一块物理内存。调其中一个不碰另一个,等于只拧松一半螺丝——得一起算总账,再留出至少 200MB 给系统和宝塔自身。
pythonphp-fpmmysqldOPcacheinnodb_buffer_pool_size/dev/shmfree -havailablefree -havailableusedps aux --sort=-%mem | head -n 10mysqldphp-fpm:pythondf -h /dev/shmpm.max_childrenphp-fpmps aux | grep 'php-fpm:' | wc -lgrep 'pm.max_children\|pm.start_servers' /www/server/php/82/etc/php-fpm.d/www.conf82pm.max_children = 4pm.start_servers = 2pm.min_spare_servers = 1bt restartservice php-fpm-82 restartpm = dynamicpm = ondemandOPcachetopfreeopcache_get_status()['memory_usage']['used_memory']php -i | grep opcache.enableonopcache.revalidate_freq = 2curl http://你的域名/oc.phpwww.confphp_admin_value[opcache.max_accelerated_files] = 7963php-fpm/www/server/panel/logs//www/server/panel/data/default.dbecho 30 > /www/server/panel/data/interval.plbt restartrm -f /dev/shm/php-fpm.*find /dev/shm -name "php-fpm.*" -mmin +60 -deleteinnodb_buffer_pool_sizepm.max_children