经常见到有人问:我的项目出现了 XXX 的错误(如崩溃,502)等等,是不是机器撑不住了?是不是该做负载均衡了?是不是需要优化 php-fpm?如果我根据他的问题再深一步问,几乎都对自己的项目到底能支撑多大的负载没什么概念。不能定位问题又怎么能解决问题呢?现在说一下怎么简单计算你的项目最大能支撑的访问(以 nginx+php-fpm 为例)。
项目最大负载量(假设单位是 qps) = php-fpm 进程数 * (1 / 你的项目单次请求耗时,单位秒)
公式不难理解, 1 / 你的项目单次请求耗时 就是一个进程每秒能处理多少次请求,再乘以这台机器的最大 fpm 进程数就是这台机器每秒能处理多少次请求。(当然这是理想情况下,不过用来判断大致的负载情况够了)
首先我们需要查看 php-fpm 的配置文件,需要查看以下几个参数。
pm、pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers。
因此如果你的机器设置为静态,那么 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 等等。
沈唁志|一个PHPer的成长之路!
原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:如何简单计算PHP网站是否已经最高负载