Php AWS EC2:当大量api同时从jmeter调用时出现内部服务器错误

Php AWS EC2:当大量api同时从jmeter调用时出现内部服务器错误,php,mysql,amazon-ec2,jmeter,amazon-rds,Php,Mysql,Amazon Ec2,Jmeter,Amazon Rds,我们已经在laravel和mysql中制作了移动AP的后端。该应用程序托管在AWS Ec2上,并使用RDS mysql数据库 我们正在使用jmeter对应用程序进行压力测试。当我们从jmeter发送多达1000个API请求时,它似乎工作正常。然而,当我们并行发送1000多个(大致)请求时,jmeter开始获得内部服务器错误(500)作为对许多请求的响应。内部500错误百分比随着API数量的增加而增加 通常,如果我们增加API,它们应该排队,如果服务器资源不足,响应应该会变慢。我们还监控了服务器上

我们已经在laravel和mysql中制作了移动AP的后端。该应用程序托管在AWS Ec2上,并使用RDS mysql数据库

我们正在使用jmeter对应用程序进行压力测试。当我们从jmeter发送多达1000个API请求时,它似乎工作正常。然而,当我们并行发送1000多个(大致)请求时,jmeter开始获得内部服务器错误(500)作为对许多请求的响应。内部500错误百分比随着API数量的增加而增加

通常,如果我们增加API,它们应该排队,如果服务器资源不足,响应应该会变慢。我们还监控了服务器上的资源,这些资源甚至从未达到可用资源的50%

是否有任何超时设置或任何其他可能的设置,我可以调整,以便在达到80%的资源使用率之前,我们不会得到内部服务器错误

问候
Syed

500
是交付API的服务器出现某种故障的外部可见症状。您应该查看该服务器的错误日志以查看故障的详细信息

如果您使用php脚本来交付API,那么您的mysql(rds)服务器可能会连接不足。下面是可能的工作方式

php驱动的web服务器在高负载下运行大量php实例。每个php实例打开一个或多个到mysql服务器的连接。当每个实例有太多的
php实例
x
连接时
mysql服务器开始拒绝更多的实例

您需要做的是:限制web服务器一次允许使用的php实例的数量。当您限制该数量时,传入请求将排队(在操作系统通信堆栈的TCP连接队列中)。然后,当一个实例可以为队列中的每个项目提供服务时,它就会这样做

Apache有一个默认值,默认值非常大,为256。尝试将其设置得更低,例如设置为32,然后查看您的问题是否发生了变化

如果可以减少请求工作线程的数量,则可能会提高高负载性能。序列化多个请求通常比并行处理多个请求产生更好的吞吐量

与MySQL服务器的活动连接数也是如此。这显然取决于您使用的查询的性质,但一般来说,并发查询的减少可以提高性能。因此,添加MySQL连接并不能解决实际问题

您应该知道,像jmeter这样的服务器锤击工具施加的负载并不代表真实世界的负载。1000次无故障的同时jmeter操作是一个非常好的结果。如果您的负载测试设置健壮且功能强大,那么您将始终能够让服务器系统屈服。因此,决定何时停止是负载测试计划的一个重要部分。如果这是我的系统,我现在会停在1000


为了让您的应用程序在该领域保持稳健,您可能应该对其进行编程,以响应
500
状态,方法是随机等待一段时间,然后再试一次。

非常感谢您的回复。是的,该应用程序托管在apache上的AWS ec2实例上。我还知道,1000个并行请求在1秒内是没有失败的,这是一个相当好的结果。然而,我想知道服务器什么时候会屈服,但即使在服务器达到50%的资源之前,我们也开始得到内部500个错误。顺便问一下,增加mysql max连接也会有帮助吗?你所说的“服务器上的资源”是什么意思?有很多资源:网络容量、CPU容量、RAM、IO容量、上下文切换容量等。在负载测试负载下,正确找出哪种资源是瓶颈是相当困难的。这需要深入了解主机操作系统的工作原理以及如何监控它。你是对的。我们只监控了内存和CPU。