更新:
我的目标是了解哪些因素可能会压垮我的小 tomcat 服务器。当发生某些异常时,我可以采取哪些措施来解决或修复它,而无需将服务器切换到更好的机器。这不是生产环境中的真实应用程序,只是我自己的实验(除了服务器端的一些更改之外,我也可能在客户端做一些事情)
我的客户端和服务器都非常简单:服务器只检查 URL 格式,如果正确则发送 201 代码。从我的客户端发送的每个请求仅包含一个简单的 JSON 正文。不涉及数据库。两台机器(t2-micro)分别只运行客户端和服务器。
我的客户端是
OkHttpClient()
。为了避免超时异常,我已经通过setConnectTimeout
、setReadTimeout
和setWriteTimeout
将超时设置为 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。客户:
<强>2。服务器:
最佳答案
在过去经历过类似的练习后,我可以说扩展问题没有明确的答案。
以下是一些常规故障排除步骤,可能会提供更具体的信息。我建议通过在每个测试中调整一些参数来尝试测试,并测量 Cpu、日志等的变化。
请提供您为超时设置的值。增加超时可能会导致服务器(或客户端)快速耗尽线程(因为每个线程可以处理更长时间)。质疑增加超时的必要性。是否有任何处理会减慢您的服务器速度?
检查客户端和服务器上的应用程序日志、JVM 使用情况、内存使用情况。那里会有一些提示。
您的客户似乎达到了 99%+,然后就下降了。这意味着客户端可能存在问题,因为它在测试期间达到了最大值。您可能希望调整客户端的大小以便能够执行更多操作。
查看打开的文件句柄。该数字应该足够高。
Tomcat 对处理负载的线程数有一些限制。您可以在 server.xml 中检查这一点,如果需要,可以更改它以处理更多内容。尽管服务器端的CPU实际上并没有达到最大,所以这不太可能是问题所在。
如果您有数据库,请检查数据库的性能。另请检查 jdbc 连接设置。 jdbc 级别也有线程和超时配置。
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/