一. 首先我们要知道为什么要有并发
首先我们应该了解什么是并发,很多时候我们在工作的过程当中,习惯会以单线程的思维来进行项目开发,因为这种方式是最易于理解的,也是最不容易出错的。 当然,这种编程方式在项目简单,并且用户访问量并不大的情况下可以发挥较好的作用,但是只要项目迭代到某个高级阶段,或者说因为比较好的推广,项目得到了比较多用户的使用,这种时候,项目中单线程的处理方式一定会出现处理效率上的瓶颈,常见的问题就是响应速度变慢,也就是处理速度会变慢,那这个时候如果将原来单线程的任务改成多线程的方式处理,则可以大大地提升处理效率。
二、产生问题的原因
目前项目基本上已经完成,后台广告接完就已经没有什么难点了,所有今天就想试下软件接口的压测,一测果然还有一堆bug.(使用的压测软件为apipost)
问题一
可以从数据中看到第一次失败的次数为几十次根据日志中文档可以看出报错信息为429根据错误文档找到代码找到之前对用户做的处理
可以看出是因为对api接口做了限制才导致失败的。
问题二
问题一解决后继续做压力测试,结果日志报502(当前服务器中的PHP请求总数已经达到了PHP-FPM中max_children设置的上限,如果后续有新的PHP请求到达服务器,通常负载均衡SLB会随机返回502或504状态码。)所以这个需要去修改php-fpm的配置
解决方法:服务器中找到php-fpm.conf配置(有的会在引入的www.conf中)
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice
[www]
listen = /tmp/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = static
pm.max_children = 200
pm.start_servers = 40
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests=1000
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log
pm.max_requests=500
pm.start_servers=4
pm.max_spare_servers=30
一. pm= static
首先说一下pm这个值 pm = dynamic 这个是php的进程数是动态的 会根据访问量来确定来回增加
而在高负载的php环境下我推荐设置 pm= static php-fpm进程数固定
二. pm.max_children=???
当用静态模式下 进程数确定根据 pm.max_children来进进行确定 那么问题来了我的服务器应该设定多少php-fpm呢 ?
从理论的角度上说php-fpm进程数越多越好,相当于一个酒店有很多个充足的服务员来为你服务肯定会比较爽啊 ,你也不需要等待。
但是。。。。现实上总是残酷的 php-fpm的进程数会受到你的内存大小的限制。一般情况下我们 进程数 =用机器内存(M)除以2 再除以20(M);
当然这个也不是绝对的 你需要知道:
1、你可以分配给php多大内存 :你的服务器上是不是单纯的php服务器 有没有比较耗费内存的其他程序(mysql)。
2、你的每个php-fpm内存占多大 :内存占用多大要根据你的php代码质量和处理的相关业务。当然你可以用命令去统计你的php-fpm平均占用内存大小。
有人会问我如果设置不恰当会有什么状况出现呢?
当数值偏小时请求到nginx会无法分配到php-fpm进程 导致502错误
当数值偏大如果没有大访问量还好 如果访问量较大的话 内存都会被php占光了。导致系统响应缓慢 cpu-system 升高 系统不断的去调整内存分配
严重时会导致较高的 cup-wait 较高 内存不够用了 直接写磁盘 磁盘io直线增加 。cpu使用率也开始爆满。(如图所示)
问题三
面板的主要负载应该发生在mysql的读写,用户的访问先不考虑,首先考虑mysql的性能问题,根据上面截图判断。
方法一
发现内在的占用较少 ,看到这种情况,第一直觉可以优化一下mysql的性能,接着找到面板的软件管理,打开mysql的设置:
方法二
首先先安装一个opcache缓冲器,用于加速PHP脚本,其他的就都按默认的来吧,往往安装这个那个影响性能。
修改max_execution_time时间为60.
性能调整。这里可以根据自己服务器配置进行设置,宝塔面板比较人性化,会根据你的服务器配置设置推荐方案。其实设置并发多少,大家可以根据自己服务器内存大小进行计算,一般一个php-fpm进程占用内存30M左右,以8192MB内存(4G内存)来计算,大概可以设置204个并发。我们使用的就是4核8G内存配置的服务器,安装宝塔面板后推荐的事200并发
4.宝塔的监控,宝塔面板系统监控不要开,会迅速消耗cpu。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末自行领取】
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!