我正在开发一个大型应用程序,我必须加载测试它。它是一个基于EC2的集群,带有一个运行PHP / NGinx的应用程序的HighCPU Ex.Large实例。
此应用程序负责从redis服务器读取数据,该服务器包含大约5k - 10k的密钥值,然后进行响应并将数据记录到mongoDB服务器并回复给客户端。
每当我向应用服务器发送请求时,它会在大约20 - 25毫秒内完成所有计算,这很棒。
我现在正在尝试进行一些负载测试,并在笔记本电脑上运行基于php的应用程序向服务器发送请求。成千上万的人很快就会超过20-30秒。在此加载期间,每当我在浏览器中打开应用程序URL时,它会以大约25-35毫秒的执行时间回复,这又是很酷的。所以我确信redis和mongo不会造成瓶颈。但是在加载过程中需要大约25秒才能得到响应。
高CPU ex。大型实例有8 GB RAM和8个内核。
此外,在负载测试期间,top命令显示大约4-6个php_cgi进程占用了大约15-20%的CPU。
我在nginx和1024个工作连接上有50个工作进程。
导致瓶颈的问题是什么?
如果这不起作用,我正在认真考虑使用嵌入式Web服务器和嵌入式缓存转移到整个Java应用程序。
UPDATE - 将PHP_FCGI_CHILDREN增加到8,并在加载期间将响应时间减半
答案 0 :(得分:1)
50个工作进程太多,每个CPU核心只需要一个工作进程。使用更多的工作进程将调用进程间切换,这将花费很多时间。
你现在可以做什么: 1.将工作进程设置为最小值(每个CPU一个工作程序,例如,如果有4个cpu单元,则为4个工作进程),但是工作程序连接 - 最大值(例如10240)
通过sysctl调整TCP堆栈。如果您有许多连接,则可以达到堆栈限制
从nginx stub_status模块获取统计信息(您可以使用munin + nginx,它易于设置并为您提供有关系统状态的足够信息)。
检查nginx error.log和系统消息日志以查找错误。
调整nginx(减少连接时间和最大查询大小)。
我希望能帮助你。