更新:
我的目标是了解哪些因素会使我的小型 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.服务器:
答案 0 :(得分:1)
过去经历过类似的练习后,我可以说缩放问题没有明确的答案。
以下是一些常见的故障排除步骤,可能会提供更具体的信息。我建议通过在每个测试中调整一些参数来尝试测试,并测量 Cpu、日志等的变化。
请提供您为超时设置的值。增加超时可能会导致您的服务器(或客户端)快速耗尽线程(导致每个线程可以处理更长时间)。质疑增加超时的必要性。是否有任何处理会减慢您的服务器速度?
检查客户端和服务器上的应用程序日志、JVM 使用情况、内存使用情况。那里会有一些提示。
您的客户似乎达到了 99% 以上,然后又下降了。这意味着客户端可能存在问题,因为它在测试期间达到最大值。您可能希望调整您的客户的规模,以便能够做更多的事情。
查看打开的文件句柄。数量应该足够高。
Tomcat 对处理负载的线程数有一些限制。您可以在 server.xml 中检查它,如果需要,可以更改它以处理更多。尽管服务器端的 cpu 实际上并没有达到最大值,所以这不太可能是问题所在。
如果你是一个数据库那么检查数据库的性能。还要检查 jdbc 连接设置。 jdbc级别也有线程和超时配置。
是否在 Tomcat 上设置了响应压缩?它会在服务器上提供更好的性能,特别是如果每个请求发回的数据超过几 kbs。
--------更新-----------
基于问题的更新,还有一些想法。
由于应用程序相当简单,因此对服务器施加压力的途径应该是从低开始并逐渐增加负载,同时监视各种事物(cpu、内存、JVM 使用情况、文件句柄计数、网络 i/o)。
负载增量应分布在多个运行中。 从低至 100 个并行线程开始。
在每次运行后尽可能多地记录信息,如果服务器运行良好,则增加负载。
建议的增量为 100、200、500、1000、1500、2000、2500、3000。
在某种程度上,您会看到服务器无法再接受它。那将是你的突破点。
随着您增加负载和监控,您可能会发现建议调整特定参数的模式。每次调整尝试都应该再次测试相同级别的多线程。从监测中可以明显看出可用的改善。