使用进程数管理解决 PHP 内存泄漏问题 | 格塔里

格塔里

一个不负责任的教程博客

0%

使用进程数管理解决 PHP 内存泄漏问题

计算理论最大线程数量

1
2
3
4
[root@elrepo ~]# PHP_Mem=`ps auxf | grep php | grep -v grep | grep -v master | awk '{sum+=$6} END {print sum}'` # 获取当前 PHP 全部线程占用内存 单位: KB 
[root@elrepo ~]# PHP_PRO=`ps auxf | grep php | grep -v grep | grep -v master | wc -l` # 获取当前 PHP 线程数量
[root@elrepo ~]# echo $((PHP_Mem/PHP_PRO/1024)) # 计算单线程内存占用 单位: MB
40

我的服务器内存 32GB 可得到理论最大线程 16 * 1024 / 40 ≈ 409 线程

配置修改

找到 php-fpm 配置文件 php-fpm.conf

宝塔: /www/server/php/73/etc/php-fpm.conf
Centos: /etc/php/7.3/fpm/php-fpm.conf
具体配置位置视情况而定

[global] 内添加

1
2
3
4
5
# 最大进程数量
process.max = 300
# 如果在1min内有10个子进程被中断失效,重启主进程
emergency_restart_threshold = 10
emergency_restart_interval = 1m

[www] 内添加/修改

1
2
3
4
5
6
7
8
9
10
11
12
# 动态管理
pm = dynamic
# 最大线程数量
pm.max_children = 300
# 初始化进程数量
pm.start_servers = 16
# 最低空闲进程数量
pm.min_spare_servers = 8
# 最高空闲进程数量
pm.max_spare_servers = 30
# 每个子线程允许的请求量
pm.max_requests = 1000

重启

如何重启你的 php-fpm 服务就好了。

参考资料

https://www.php.net/manual/zh/install.fpm.configuration.php