本文共 1618 字,大约阅读时间需要 5 分钟。
一点php分享关于php遇到高并发瓶颈时的一些优化思路,首先如何确认你的服务器是否处于高负载状态,可以通过linux中top指令查看具体信息,load average: 0.00, 0.00, 0.00 重点关注这3个值的大小,分别代表服务器1分钟、5分钟、15分钟时间段的负载情况,如果他的数字大于你的cpu核数,并且这个时间cpu的使用率也是居高不下,那么你的服务器目前一定是处于高负载。
处于高负载情况下的top图:
这里并没有达到很夸张的负载情况,只是用了ab压测ab -n 100000 -c 1000,但是也达到了负载的饱和状态,不过你要确认你的服务器并不是受到了某种恶意攻击,而是确确实实的真实流量。
步骤一、
对应接口代码排查,找出是否有存在某个接口代码响应时间较慢导致,进行代码优化,这里可以通过开启php的慢日志记录,查看对应的日志。
步骤二、
如果代码层面没有问题,则进行php调优,查看php-fpm进程管理配置文件php-fpm.conf,需要注意以下几个参数:
pm = dynamic#进程管理使用动态dynamic 还是静态static pm.max_children = 20 #只有最大的进程数量,如果是static模式,只有该参数有效
pm.start_servers = 10#动态情况下默认首次启动的进程数量
pm.max_requests = 100#每个进程接收请求处理最大次数,达到最大值后进程会重启 pm.min_spare_servers = 10#动态情况下,服务器处于空闲时期的最小进程数量 pm.max_spare_servers = 20#动态情况下,服务器处于空闲时期的最大进程数量且必须小于pm.max_children
注:一个php进程的内存占用在20m-40m左右,通过free指令查看当前系统可用内存,分配合理进程数即可。
步骤三、
如果php版本低于7以下,建议升级php版本>=7.1并安装opcache扩展,因为在php7以后对opcache进行了极大的优化,性能至少提升60%。
opcache参考配置:
opcache.enable=1 #OPcache 开启
opcache.memory_consumption=512 #这个配置表示你想要分配给 OPcache 的内存空间(单位:MB),设置一个大于 64 的值即可。
opcache.interned_strings_buffer=64 #这个配置表示你想要分配给实际字符串的空间(单位:MB),设置一个大于 16 的值即可。
opcache.max_accelerated_files=32531 #这个配置表示可以缓存多少个脚本,将这个值尽可能设置为与项目包含的脚本数接近(或更大)。
opcache.validate_timestamps=0 #改配置值用于重新验证脚本,如果设置为 0(性能最佳),需要手动在每次 PHP 代码更改后手动清除 OPcache。如果你不想要手动清除,可以将其设置为 1 并通过 opcache.revalidate_freq 配置重新验证间隔,这可能会消耗一些性能,因为需要每隔 x 秒检查更改。
opcache.save_comments=1 #这个配置会在脚本中保留注释,我推荐开启该选项,因为一些库依赖于这个配置,并且我也找不出什么关闭它的好处。
opcache.fast_shutdown=0 #快速关闭会给一个更快速清理内存的机制,不过,在我的基准测试中,更慢一些,可能这会应用带来一些性能提升,但是你需要自己去尝试。
步骤四、
如果当前服务器资源利用率已经达到了最大化,并且负载还是处于居高不下的情况,这个时候需要考虑系统架构的扩展优化,例如水平增加php服务器,达到负载均衡的效果。以上只是一个优化的大致思路,每一个步骤都可以进行更细致的优化。
转载地址:http://zodqv.baihongyu.com/