服务器8核16g内存,同时有1000多人在抢红包,有502怎么办?

lnmp环境,服务器8核16g内存!
php-fpm中的配置

pm = static
pm.max_children = 200

9点钟开始的抢红包,一开始,1000多并发,然后就502,这还有办法处理吗?
php-fpm的日志中也没有什么异常
图片描述

以前没改pm.max_children的时候,是有错误信息的

WARNING: [pool www] server reached pm.max_children setting (10), consider raising it

今天就没有了,但是还有502。
但是并发少了,就没有502了
请问,这内存使用情况正常吗?
图片描述

阅读 10.5k
4 个回答
  1. 设置php-fpm.conf 里的 request_slowlog_timeout 和 slowlog,记录慢日志,看慢在哪里,我一般设置1s
  2. 设置php-fpm.conf 里的 request_terminate_timeout,将过慢的请求干掉,我一般设置3s
  3. 8核16G才开200个进程太少了,至少1000起
  4. 打开php的apc或者opcache等oplog缓存,CPU使用率大幅下降
  5. 找到耗时原因是正道,看慢日志,然后程序上好好优化吧

个人在双核四线程的i5-3230M(Ubuntu)上做PHP-FPM压力测试,在保持Nginx工人进程不变的情况下,开启5个PHP-FPM工作进程和10个PHP-FPM工作进程的测试结果并没有多大区别.

但可以肯定的是,过多的PHP-FPM进程反而会增加CPU上下文切换的开销,除非你的PHP代码中有curl或者file_get_contents这些可能会产生较大网络I/O耗时的代码,这时开更多的PHP-FPM进程可能会好一些.

在php-fpm.conf中把request_slowlog_timeout设为1秒,在slowlog中查看是否有这些耗时超过1秒的代码.优化代码,能够为所有PHP-FPM工作进程减负,这个才是提高性能的根本方法.个人认为,PHP-FPM工作进程数,设置为2倍CPU核心数就足够了.毕竟,Nginx和MySQL以及系统同样要消耗CPU,根据内存来设置PHP-FPM数是非常不合理的,把内存分配给MySQL,Memcached这些服务显然更合适.

内存占用(RES)方面,PHP-FPM的16MB还是很正常的,倒是Nginx占用29MB就比较奇怪了,一般一个Nginx工作进程只会占用不到5MB的内存,所以,也看看Nginx的错误日志,建议安装稳定版本的Nginx.

才1000并发就扛不住啦?
根据pm配置应该是由于请求处理时间太长导致的502,有没有测过单个请求平均耗时多少?

建议优化下PHP代码,比如使用万能的缓存,优化SQL等

此外,如果抢红包持续时间不长的话,可以考虑把PHP执行超时时间设置长一点,但估计帮助不大

502一般是后端数据库的问题(或类似读取数据等耗时太长的操作)。php自身是没有什么理由去502的。抢红包这种还是上redis吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏