如何简单计算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 等等

发表评论

发表评论

*

沙发空缺中,还不快抢~