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

标签 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

最佳答案

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

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

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

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

  3. 您的客户似乎达到了 99%+,然后就下降了。这意味着客户端可能存在问题,因为它在测试期间达到了最大值。您可能希望调整客户端的大小以便能够执行更多操作。

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

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

  6. 如果您有数据库,请检查数据库的性能。另请检查 jdbc 连接设置。 jdbc 级别也有线程和超时配置。

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

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

根据问题的更新,还有一些想法。

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

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

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

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

在某种程度上,您会发现服务器无法再接受它。那将是你的转折点。

当您增加负载和监控时,您可能会发现建议调整特定参数的模式。然后,应在同一级别的多线程上再次测试每次调整尝试。通过监控,available 的提升是显而易见的。

关于java - 无法连接到 ec2 实例上的 Tomcat 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66082587/

相关文章:

java - 在 Saxon 9 中,他的 Java XML 解析器无法识别正则表达式中的单词边界 (\b)

java - 使用多线程并行化 Java 中的 for 循环

java - 确保缓存自行获取值的线程安全

hadoop - 在Amazon Elastic MapReduce和S3中读取参数文件

amazon-web-services - AWS Step Function 可以描述这种数据流吗?

java - 如何从 Activity 中获取偏好值?

java - 为 Tomcat 配置 SOAP - 请求总是被拒绝 (403)

java - 使用 express 和 multer 将带有 Java MultipartEntity 的图像上传到 Node.js 服务器

python - Python中数组的多线程求和

amazon-web-services - 我可以在同一个 Cloudfront 发行版上使用签名和未签名的 url 吗?