我在AWS环境中有一个简单的负载测试场景。该应用程序是一个3层的apache(ec2),tomcat(ec2)和mysql(在aws中为rds)作为数据库,在apache和tomcat之前有负载均衡器。我们正在尝试使用具有500个线程的jmeter进行测试,加速时间为10秒。 http请求是对我们的应用程序的简单调用,它接受输入并返回与输出相同的内容。 apache配置为简单的代理传递,tomcat配置如下:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" acceptCount="100" minSpareThreads="250" maxThreads="400" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" sslEnabledProtocols="TLSv1,TLSv1.2,TLSv1.1"/>
这是jmeter响应:
摘要+ 1 00:00:05 = 0.2 / s平均:1565最小值:1565最大值:1565误差:0(0.00%)有效:98开始:211完成:113
摘要+ 499 00:00:10 = 52.3 / s平均:1319最小值:51最大值:3916误差:0(0.00%)有效:0开始:500结束:500
摘要= 00:00:14 = 35.5 / s平均值:1319最小值:51最大值:3916误差:0(0.00%)
从REST客户端调用URL时,所用时间为100-200ms。当我们在10秒内调用500个请求时,性能会如上所述显着下降。我在负载均衡器上添加了一个tomcat服务器而没有任何改进。
我在执行负载测试时进行了线程转储,并且我看到许多线程处于RUNNABLE状态,如下所示:
"ajp-bio-8009-exec-120" daemon prio=10 tid=0x00007f23680fe000 nid=0x4d1b runnable [0x00007f2341594000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:309)
at org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:364)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:128)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
tomcat正在运行2-4GB的堆,而jmeter运行的是1GB堆。 apache和tomcat是双核,7.5GB AWS实例(m3.large)。
Apache在preform MPM中配置如下:
<IfModule prefork.c>
StartServers 150
MinSpareServers 100
MaxSpareServers 150
ServerLimit 350
MaxClients 350
MaxRequestsPerChild 10000
</IfModule>
我在Load Balancers中看不到AWS的云观察中的任何延迟。 我走到了尽头。有什么指针吗?