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

kht*_*two 6 performance amazon-ec2 load-testing performance-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实例是否存在可能影响此问题的限制?谢谢.

dgi*_*gil 6

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

Amazon不会发布每种类型实例的确切限制,但在" 实例类型矩阵"中,您可以看到t2.micro具有低到中等网络性能的实例.如果您需要更好的网络性能,可以在AWS实例类型页面上查看哪些实例具有增强的网络功能:

增强的网络

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

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


Bob*_*Gee 5

你说得对,1000 RPS 对于 Wildfly 来说感觉非常低,因为为其提供支持的 Undertow 服务器是Java 领域最快的服务器之一,并且是最快的 10 个服务器之一。

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

完成此操作后,您几乎肯定会遇到连接创建的瓶颈,而不是您的 AWS 实例。这可能位于 JMeter 内,也可能位于 Wildfly 子系统内。

要消除 JMeter 这个罪魁祸首,请在相同的并发级别上尝试 ApacheBenchmark(“ab”),然后使用 -k 选项进行尝试(以允许连接重用)。

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

就 WildFly 而言,我必须查看 config.xml,但您也许可以通过调整Undertow 子系统设置来提高性能。默认值通常是固定的,但您需要非常低数量的 I/O 线程(1 或 CPU 数量,仅此而已)。

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


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

服务器设置(EC2 t2.micro 运行最新的 amazon linux,位于 US-east-1,不同的可用区)

sudo yum install docker
sudo service docker start
sudo docker run --rm -it -p 8080:8080 svanoort/jboss-demo-app:0.7-lomem
Run Code Online (Sandbox Code Playgroud)

客户端(另一个 t2.micro,最小负载,不同的可用区):

ab -c 16 -k -n 1000 http://$SERVER_PRIVATE_IP:8080/rest/cached/500
Run Code Online (Sandbox Code Playgroud)

16 个保持活动状态的并发连接,提供 500 字节缓存的随机预生成数据

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

注意到随着时间的推移它是如何上升的吗?在进行基准测试之前预热服务器非常重要,这样可以创建足够的处理程序线程,并允许进行 JIT 编译。10,000 个请求是一个很好的起点。

如果我关闭连接保活?峰值约为 1450 RPS,并发数为 16。但是等等!对于单线程(并发 1),它仅提供约 340-350 RPS。将并发数增加到超过 16 并不会带来更高的性能,它仍然相当稳定(甚至高达 512 个并发连接)。

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

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

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