笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述浅谈优化----nginx与php增大并发相关的知识,希望能为你提供帮助。
1、概述
近期以来,公司业务爆炸性增长,服务器压力也是不断地增大,php出现连接超时情况,特别在高峰期下,出现成百上千的超时情况,当时运维侧习惯以为是开发逻辑层代码问题,因为这种情况基本上都是开发代码层面的问题。但是当看到后台高峰期那个用户访问量比原来加了一倍都不止时,并且通过监控数据看到服务器的CPU利用率和负载高出了很多,这时,运维侧就应该反思是否是并发数不够。
2、PHP之连接进程数
登录服务器查看到PHP的进程数并不是很高,也不充足,从配置中查看到设置为150,按照服务器的内存16G来计算,一个进程占用内存空间大概在25-30M之间,那么16G内存,PHP占用8G来计算,差不多可以达到350左右进程。那么可以调整那几个配置呢,需要修改的配置文件:/usr/local/php7/etc/php-fpm.d/www.conf
如果需要了解LNMP搭建的可以参考文档:??LNMP搭建??
pm = dynamic
pm.max_children = 350
pm.start_servers = 65
pm.min_spare_servers = 60
pm.max_spare_servers = 70
pm.max_requests = 10000
pm = dynamic:设置动态进程管理
pm.max_children:最大进程数为350
pm.start_servers:动态方式下的起始php-fpm进程数量
pm.min_spare_servers:动态方式空闲状态下的最小php-fpm进程数量
pm.max_spare_servers:动态方式空闲状态下的最大php-fpm进程数量
pm.start_servers = min_spare_servers + (max_spare_servers - min_spare_servers) / 2
检测配置是否正确
php-fpm -t
重新加载配置
/etc/init.d/php7-fpm reload
优化从监控看到的结果,服务器负载降下来了
前一天
优化当天
以上优化服务器性能方面确实得到很大的优化,但是实际问题还是没有得到很好的解决。
3、PHP之并发数 以上服务器性能得到优化后,发现在高峰期还是存在大量的php超时问题,那么这个时候应该考虑的问题,就是优化php并发数的问题。优化PHP并发数问题首先应优化内核参数在服务器层面开启更大的服务器并发连接数。
优化服务器内核参数:/etc/sysctl.conf
net.core.somaxconn = 65535
配置生效命令
systcl-p
以上只是调整系统层面的并发数
优化PHP层面的并发数,修改配置文件为:/usr/local/php7/etc/php-fpm.d/www.conf
listen.backlog = 511
检查配置是否正确
php-fpm-t
重启php-fpm才能生效
/etc/init.d/php7-fpm restart
检查是否生效:
ss-lnt
调整成功后如下图
以上问题得到解决,此时有没有想过一个这样子的问题,就是PHP其实还需要与nginx进行配合,那么nginx的连接并发数是否充足呢
4、Nginx之并发数 在没有调整系统内核并发连接数情况下,nginx默认的连接数只有128,根据上面PHP的调整,明显nginx能力是不够应付PHP的连接的。那么也就需要调整nginx的并发连接数,由于在PHP之并发数过程中,已经调整过了内核参数,如果在nginx只需要511并发数可以应付的话。那么只需要重启nginx即可完成。特别注意reload无法完成加载的
systemctl restartnginx
扩展一个知识点:nginx在linux内核并发参数没有优化情况,部署的nginx默认只有128并发数;如果优化linux内核参数情况下,在重启nginx默认就有511并发数。
【浅谈优化----nginx与php增大并发】未优化前nginx
优化后nginx
那么如何增大并发数超过511呢,目前所看到的方式就是在端口加一个backlog=一个数值的参数。
如下图例子:修改端口配置文件,在相应端口后面加上backlog=1024
重启nginx
systemctl restartnginx
以上可以让所有优化并发数的运维同学提供一个思路,希望帮忙更多的运维解决此类问题,望大家多多支持,谢谢
推荐阅读
- Exchange 2016 负载均衡LVS+Keepalived
- #yyds干货盘点# Exchanger详解
- mysql备份
- 如何向 github 上开源项目提交代码
- #yyds干货盘点# 解决剑指offer(数组中重复的数字)
- 简单介绍关于vue 的slot分发内容 (多个分发)
- # yyds干货盘点 # Python面向对象中的类变量,实例变量怎么来理解()
- #yyds干货盘点# js学习笔记二十一手动封装call
- 实现深拷贝最少得用几行代码()