如何简单计算PHP网站是否已经最高负载

你的项目最大能承受多少请求

经常见到有人问:我的项目出现了XXX的错误(如崩溃,502)等等,是不是机器撑不住了?是不是该做负载均衡了?是不是需要优化php-fpm?如果我根据他的问题再深一步问,几乎都对自己的项目到底能支撑多大的负载没什么概念。不能定位问题又怎么能解决问题呢?现在说一下怎么简单计算你的项目最大能支撑的访问(以nginx+php-fpm为例)。

常见单位

  • qps:每秒请求数(一秒内多少次请求)
  • rpm:每分钟请求数(一分钟内承受多少次请求)

公式

项目最大负载量(假设单位是qps) = php-fpm进程数 * (1 / 你的项目单次请求耗时,单位秒)

公式不难理解, 1 / 你的项目单次请求耗时 就是一个进程每秒能处理多少次请求,再乘以这台机器的最大fpm进程数就是这台机器每秒能处理多少次请求。(当然这是理想情况下,不过用来判断大致的负载情况够了)

如何知道机器php-fpm进程数

首先我们需要查看php-fpm的配置文件,需要查看以下几个参数。

pm、pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers。

  • pm:表示php-fpm使用什么参数运行,这里有两个值可以选择,就是static(静态)或者dynamic(动态)。静态表示php-fpm的进程常驻,这样就省去了高峰时进程不够需要再fork的时间。动态表示空闲期间会回收一些进程,最小可以减小到min_spare_servers以节约内存开销。
  • pm.max_children:静态方式下开启的php-fpm进程数量
  • pm.start_servers:动态方式下的起始php-fpm进程数量
  • pm.min_spare_servers:动态方式下的最小php-fpm进程数
  • pm.max_spare_servers:动态方式下的最大php-fpm进程数量

因此如果你的机器设置为静态,那么php-fpm进程数取pm.max_children计算就可以了。

如果你的机器设置为动态,那么php-fpm进程数取pm.max_spare_servers进行计算(计算最大负载当然取最大值了)。

如何知道我的项目单次请求耗时

这个计算的方法有很多,而且只能取平均值,因为不同的访问肯定耗时也不同,算不出十分精确地结果。参考工具可以用xdebug+Webgrind,或者XHProf。用这些工具算出你的项目单次运行大概需要多少ms。这里计算时需要注意的地方是,比如你的项目有两个url,url1访问的次数是url2的三倍,url1访问的平均时间是15ms,url2访问的平均时间是5ms,那么你的项目平均访问时间应该是(15*0.75+5*0.25)/2=12.5ms。

结论

把以上的两个数代入到公式中,就能算出qps了,然后你可以分析峰值时的nginx日志,取一分钟看看总共有多少次请求(记得排除纯静态请求)。然后把我们计算的qps * 60,看看是否比nginx日志大,如果确实比nginx大或者数目接近的话,证明确实是承受不了这么大的负载,解决方案在内存足够的情况下可以增加php-fpm的最大进程数,内存不够就需要加机器。如果qps * 60小于nginx日志的话,那么我们就需要看看是不是一些其他的资源限制了访问,比如cpu,甚至mysql等等。

发表评论

发表评论

*

沙发空缺中,还不快抢~