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

沈唁志|一个PHPer的成长之路! 原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:如何简单计算PHP网站是否已经最高负载

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏magicsoar

python下的Box2d物理引擎的配置

/******************************* I come back! 由于已经大四了,正在找工作 导致了至今以来第二长的时间内没有更新博客...

3206
来自专栏玄魂工作室

CTF实战19 渗透测试-主机信息探测

其原理是不同厂家的IP协议栈实现之间存在许多细微的差别,通过这些差别就能对目标系统的操作系统加以猜测

1221
来自专栏ImportSource

NoSQL-Quorums-仲裁

作者简介: ? 当你权衡“一致性”或“持久性”的时候,不是一个非此即彼,非黑即白的过程。一个请求中涉及的节点越多,那么我们越有可能避免不一致。这自然就引发了一个...

3585
来自专栏iOSDevLog

Google Colab免费GPU教程

现在,你可以开发深度学习与应用谷歌Colaboratory -on的免费特斯拉K80 GPU -使用Keras,Tensorflow和PyTorch。

4565
来自专栏FreeBuf

使用Python以及C++简单绕过反爬虫机制

0x00 某些网站有反爬虫的机制 对于刚学习了几天python的我,对爬虫颇有兴趣,但是某些“想要的”网站上具有反爬虫机制,如果说使用延迟或者代理,这样的效率并...

24510
来自专栏生信技能树

【直播】我的基因组70:比对文件并不能完美的还原出测序文件

前面我们说到过可以用软件或者自己写脚本从已经比对到参考基因组的sam/bam格式文件提取出原始的测序fastq文件。 但是我在IGV里面检查bam文件的时候发现...

3387
来自专栏前端吧啦吧啦

项目版本与分支管理之阿里AoneFlow模式分析

1783
来自专栏吴伟祥

MySQL基准测试 转

基准测试是  指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。例如,对计算机CPU进行浮点运算、数据访问...

1313
来自专栏IMWeb前端团队

后台:nodejs 前台:vue 全栈开发 外卖平台系统

关于 一直考虑写一个功能齐全的完整Nodejs项目,但苦于没有找到合适的类型,而且后台系统无法直观的感受到,需要有一个前台项目配合,因此迟迟没有动笔。恰好前一段...

3090
来自专栏程序猿DD

Spring Cloud构建微服务架构:分布式服务跟踪(抽样收集)【Dalston版】

通过 TraceID和 SpanID已经实现了对分布式系统中的请求跟踪,而这些记录的跟踪信息最终会被分析系统收集起来,并用来实现对分布式系统的监控和分析功能,比...

3426

扫码关注云+社区