无法连接到 ec2 实例上的 Tomcat 服务器

时间:2021-02-06 22:23:14

标签: java multithreading amazon-web-services tomcat amazon-ec2

更新

  1. 我的目标是了解哪些因素会使我的小型 tomcat 服务器不堪重负。当某些异常发生时,我可以做些什么来解决或修复它,而无需将我的服务器切换到更好的机器。这不是生产环境中的真正应用,只是我自己的实验(除了服务器端的一些变化,我也可能在客户端做一些事情)

  2. 我的客户端和服务器都非常简单:服务器只检查 URL 格式,如果正确则发送 201 代码。从我的客户端发送的每个请求只包含一个简单的 JSON 正文。不涉及数据库。两台机器(t2-micro)只分别运行客户端和服务器。

  3. 我的客户是OkHttpClient()。为避免超时异常,我已通过 setConnectTimeoutsetReadTimeoutsetWriteTimeout 将超时设置为 1,000,000 毫秒。我也在我的服务器上转到 $CATALINA/conf/server.xml 并设置 connectionTimeout = "-1"(infinite)

原帖:

我试图通过让客户端启动 3000 多个线程向我的服务器发送 HTTP 请求来给我的服务器带来压力。我的客户端和服务器都驻留在不同的 ec2 实例上。

一开始我遇到了一些超时问题,但是在我将连接、读写超时设置为更大的值后,这个异常已经解决了。但是,使用相同的规范,我收到了 java.net.ConnectException: Failed to connect to my_host_ip:8080 异常。我不知道它的根本原因。我是多线程和分布式系统的新手,谁能给我一些有关此异常的见解?

以下是我的 ec2 的一些截图:

1.客户:

enter image description here enter image description here

2.服务器:

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

过去经历过类似的练习后,我可以说缩放问题没有明确的答案。

以下是一些常见的故障排除步骤,可能会提供更具体的信息。我建议通过在每个测试中调整一些参数来尝试测试,并测量 Cpu、日志等的变化。

  1. 请提供您为超时设置的值。增加超时可能会导致您的服务器(或客户端)快速耗尽线程(导致每个线程可以处理更长时间)。质疑增加超时的必要性。是否有任何处理会减慢您的服务器速度?

  2. 检查客户端和服务器上的应用程序日志、JVM 使用情况、内存使用情况。那里会有一些提示。

  3. 您的客户似乎达到了 99% 以上,然后又下降了。这意味着客户端可能存在问题,因为它在测试期间达到最大值。您可能希望调整您的客户的规模,以便能够做更多的事情。

  4. 查看打开的文件句柄。数量应该足够高。

  5. Tomcat 对处理负载的线程数有一些限制。您可以在 server.xml 中检查它,如果需要,可以更改它以处理更多。尽管服务器端的 cpu 实际上并没有达到最大值,所以这不太可能是问题所在。

  6. 如果你是一个数据库那么检查数据库的性能。还要检查 jdbc 连接设置。 jdbc级别也有线程和超时配置。

  7. 是否在 Tomcat 上设置了响应压缩?它会在服务器上提供更好的性能,特别是如果每​​个请求发回的数据超过几 kbs。

--------更新-----------

基于问题的更新,还有一些想法。

由于应用程序相当简单,因此对服务器施加压力的途径应该是从低开始并逐渐增加负载,同时监视各种事物(cpu、内存、JVM 使用情况、文件句柄计数、网络 i/o)。

负载增量应分布在多个运行中。 从低至 100 个并行线程开始。

在每次运行后尽可能多地记录信息,如果服务器运行良好,则增加负载。

建议的增量为 100、200、500、1000、1500、2000、2500、3000。

在某种程度上,您会看到服务器无法再接受它。那将是你的突破点。

随着您增加负载和监控,您可能会发现建议调整特定参数的模式。每次调整尝试都应该再次测试相同级别的多线程。从监测中可以明显看出可用的改善。