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

How to increase the request per second on amazon EC2 T2.micro instance?

我最近使用了一个 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 实例是否有任何可能影响此的限制?谢谢

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

Amazon 没有发布每种实例的确切限制,但在 Instance Types Matrix you can see that t2.micro has a low to moderate network performance. If you need better network performance, you can check on the AWS instance types 页面中显示了哪些实例具有 增强网络 :

Enhanced Networking

Enhanced Networking enables you to get significantly higher packet per second (PPS) performance, lower network jitter and lower latencies. This feature uses a new network virtualization stack that provides higher I/O performance and lower CPU utilization compared to traditional implementations. In order to take advantage of Enhanced Networking, you should launch an HVM AMI in VPC, and install the appropriate driver. Enhanced Networking is currently supported in C4, C3, R3, I2, M4, and D2 instances. For instructions on how to enable Enhanced Networking on EC2 instances, see the Enhanced Networking on Linux and Enhanced Networking on Windows tutorials. To learn more about this feature, check out the Enhanced Networking FAQ section.

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

你说得对,1000 RPS 对 Wildfly 来说感觉太低了,因为为其提供动力的 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 运行 最新亚马逊 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

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

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

16 个保持活动状态的并发连接,提供 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 那里的表现非常令人印象深刻,我会说。请注意,如果主机之间存在更多延迟,则可能需要更高的并发性,以考虑往返时间对连接创建的影响。