gateway 内存溢出问题_服务器请求量过大,502 bad gateway 错误排查

现象:

一番排查后,发现 `/usr/local/php/var/log/php-fpm ` 的日志文件,出现如下信息:

[20-Dec-2019 14:05:26] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

[20-Dec-2019 14:05:40] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

[20-Dec-2019 14:05:55] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

解决办法,调整 `pm` 相关配置即可解决,例如

pm = dynamic

pm.max_children = 20

pm.start_servers = 7

pm.min_spare_servers = 5

pm.max_spare_servers = 10

再次来温习下PHP-FPM 的运行方式

pm = static

子进程的数量是固定的,由 pm.max_children 值决定具体的数量。

pm = ondemand

子进程在有需求时才产生。

工作模式为:每个闲置进程,在持续闲置了 pm.process_idle_timeout 秒后就会被杀掉,

服务器低峰期内存自然会降下来,如果服务器长时间没有请求,就只会有一个php-fpm主进程。

pm = dynamic

动态创建子进程的数量。

启动时,会产生固定数量的子进程(由pm.start_servers控制,即最小子进程数);

而最大子进程数则由 pm.max_children 来控制;

子进程数会根据“请求量”在最小和最大数范围之间变化;

闲置的子进程数由 pm.min_spare_servers(最小闲置进程数) 和 pm.max_spare_servers(最大闲置进程数) 控制

而如果闲置的子进程超出了 pm.max_spare_servers,则会被杀掉,闲置进程数保留在 pm.min_spare_servers 值

pm.start_servers=6

仅 pm 设置为 dynamic 时使用,启动时,产生的固定子进程数量

改值值必须大于 min_spare_servers 且 小于 max_spare_servers

一般计算方法为: (max_spare_servers + min_spare_servers) / 2

pm.max_children = 50

pm 设置为 static 时表示创建的子进程的数量,pm 设置为 dynamic 时表示最大可创建的子进程的数量

一般计算方法为:

分配给PHP的可用内存/单个子进程平均使用的内存数量

例如:一个子进程需要30M的内存,假设分配给PHP的内存为 3G,则设置为 3 * 1024 / 30 ≈ 100

pm.max_requests = 500

单个 php-fpm 子进程处理完多少个请求后自动重启,

主要目的就是为了防止请求处理过程中的内存溢出,导致进程占用过多的内存而无法释放,从而使fpm的处理能力降低,

避免产生一些莫名其妙的错误

每一个子进程每天接受的 request 次数 = PV / max_children

比如一个子进程每天接受的 request 次数为 50, ,而 max_requests 的设置为 500,

那么fpm要10天才能重启这个子进程,如果存在内存泄露的话,就会导致进程占用过多的内存而无法释放或产生一些莫名其妙的错误。

但是如果你把这个值设置的过小,fpm频繁的重启,会导致额外的系统开销。

最好的优化是根据网站的具体运行情况,不断的进行调试,找到一个理想的平衡点。

pm.status_path = /status

fpm的状态页,php 自带的,可以通过该状态页了解监控 php-fpm 的状态,去掉注释即可开启

修改 nginx 中的 配置,添加如下

server {

server_name xxx.demo.cn;

... ...

location = /status {

include fastcgi_params;

fastcgi_pass unix:/var/run/php.sock;

fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;

}

... ...

}

重启 PHP,重启 nginx ,在浏览器中输入 xxx.demo.cn/status 即可看到,

/status 可以随意自定义,比如改成 /demostatus 也可以,记得 NGINX 里面记得同时修改即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值