如何在亚马逊EC2 T2.micro实例上增加每秒请求数?

时间:2015-06-17 13:33:02

标签: performance amazon-ec2 performance-testing load-testing

我最近推出了一个Amazon EC2实例,即T2.micro。安装Wildfly 8.2.0Final之后,我尝试对Web服务器进行负载测试。我测试了服务器以提供小于500字节大小的静态页面,以及一个写入和读取mysql的动态页面。令我惊讶的是,我得到了类似的结果,两次测试都获得了大约1000 RPS的结果。我使用top -d 1监视系统,CPU没有达到最大值,并且有空闲内存。我认为EC2对并发连接有一些限制,或者我的设置需要改进。

我的设置是CentOS 7,WileFly / Jboss 8.2.0 Final,MariaDb 5.5。测试工具是分布式或命令行模式下的jmeter。测试是在远程,同一子网和本地主机上执行的。都得到了相同的结果。

请帮助确定瓶颈在哪里。 Amazon EC2实例是否存在可能影响此问题的限制?感谢。

2 个答案:

答案 0 :(得分:6)

是的,根据EC2实例类型存在一些限制,其中一个是网络性能。

亚马逊没有公布每种类型实例的确切限制,但在Instance Types Matrix中,您可以看到t2.micro具有低到中等的网络性能。如果您需要更好的网络性能,可以查看AWS instance types页面,其中显示哪些实例具有增强型网络

  

增强型网络

     

增强型网络功能使您可以获得更高的每秒数据包(PPS)性能,更低的网络抖动和更低的延迟。与传统实现相比,此功能使用新的网络虚拟化堆栈,可提供更高的I / O性能和更低的CPU利用率。为了利用增强联网,您应该在VPC中启动HVM AMI,并安装相应的驱动程序。目前, C4,C3,R3,I2,M4和D2 实例支持增强型网络。有关如何在EC2实例上启用增强联网的说明,请参阅Linux上的增强联网和Windows上的增强联网教程。要了解有关此功能的更多信息,请查看增强型网络常见问题解答部分。

您在这些SO和SF问题中有更多信息:

答案 1 :(得分:2)

你认为,对于Wildfly来说,1000 RPS感觉非常低,因为Undertow服务器为它提供了one of the fastest in Java land并且是10个最快的时段。

要优化的起点: 确保您没有请求登录(可能导致I / O瓶颈),使用最新的稳定JVM,并且可能值得使用您的应用程序使用的最新Wildfly版本。

完成这项工作后,您几乎肯定会因连接创建而受到瓶颈,而不是您的AWS实例。这可以在JMeter内,也可以在Wildfly子系统中。

要消除JMeter作为罪魁祸首,请在相同的并发级别尝试ApacheBenchmark(" ab"),然后尝试使用-k选项(以允许连接重用)。

  • 如果第一个ApacheBenchmark数字远高于JMeter,则问题是JMeter使用的基于线程的网络模型(可能需要另一个负载测试工具,例如gatling或locust.io)。
  • 如果第二个数字远高于第一个数字,则证明瓶颈是连接创建。可以通过调整Undertow服务器设置来解决。

就WildFly而言,我必须看到config.xml,但您可以通过调整Undertow subsystem设置来提高性能。默认值通常是可靠的,但是您需要非常少量的I / O线程(1或者CPU数量,不再更多)。

我看到一个简单的Wildfly 10应用程序远远超过了你在t2.micro实例上看到的性能。

基准测试结果,Wildfly 10 + docker + Java 8:

服务器设置(EC2 t2.micro运行最新的amazon linux,在US-east-1,不同的AZ)

sudo yum install docker
sudo service docker start
sudo docker run --rm -it -p 8080:8080 svanoort/jboss-demo-app:0.7-lomem

客户端(另一个t2.micro,最小负载,不同AZ):

ab -c 16 -k -n 1000 http://$SERVER_PRIVATE_IP:8080/rest/cached/500

16个与keep-alive的并发连接,提供500字节的缓存随机预生成数据

多次运行的结果: 每秒430次请求(RPS),1171 RPS,1527 RPS,1686 RPS,1977年RPS,2471 RPS,3339 RPS,在数十万次请求后最终达到 ~6500 RPS

请注意随着时间的推移会如何增加?在基准测试之前预先警服服务器,允许创建足够的处理程序线程以及允许JIT编译是很重要的。 10,000个请求是一个很好的起点。

如果我关闭连接keepalive?峰值约为1450 RPS并发16。但等待!使用单个线程(并发1),它只提供~340-350 RPS。将并发性提高到16以上并不能提供更高的性能,它仍然相当稳定(甚至高达512个并发连接)。

如果我将请求数据大小增加到2000字节,使用http:// $ SERVER_PRIVATE_IP:8080 / rest / cached / 2000,那么它仍然会达到1367 RPS,这表明几乎所有的时间都用在连接处理上。

对于非常大的(300k)请求和连接保持活动,我在主机之间达到大约50 MB / s,但在最佳情况下我已经看到高达90 MB / s。

我说JBoss / Wildfly的表现非常令人印象深刻。请注意,如果主机之间存在更多延迟,则可能需要更高的并发性,以允许往返时间对连接创建的影响。