无法连接到 ec2 实例上的 Tomcat 服务器
Failed to connect to Tomcat server on ec2 instance
更新:
我的目标是了解哪些因素会使我的 tomcat 服务器不堪重负。当发生某些异常时,我可以做些什么来解决或补救它,而无需将我的服务器切换到更好的机器。这不是一个真正的生产环境的应用程序,只是我自己的实验(除了在服务器端的一些变化,我也可能在我的客户端做一些事情)
我的客户端和服务器都很简单:服务器只检查URL格式,如果正确就发送201代码。我的客户发送的每个请求只包含一个简单的 JSON 正文。不涉及数据库。两台机器(t2-micro)分别只有运行客户端和服务器。
我的客户是OkHttpClient()
。为了避免超时异常,我已经通过 setConnectTimeout
、setReadTimeout
和 setWriteTimeout
将超时设置为 1,000,000 毫秒。我也在我的服务器上转到 $CATALINA/conf/server.xml
并设置 connectionTimeout = "-1"
(infinite)
原版POST:
我试图通过让客户端启动 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上设置了响应压缩?它会在服务器上提供更好的吞吐量,特别是如果每个请求发回的数据超过几 kbs。
--------更新----------
根据问题的更新,还有一些想法。
由于应用程序相当简单,就服务器压力而言,路径应该是从低开始并逐渐增加负载,同时监控各种事物(cpu、内存、JVM 使用情况、文件句柄计数、网络 i/o).
负载增量应分布在几个 运行 秒内。
从低至 100 个并行线程开始。
在每次 运行 之后尽可能多地记录信息,如果服务器运行良好,请增加负载。
建议增量 100、200、500、1000、1500、2000、2500、3000。
在某种程度上,您会看到服务器无法再承受它。那将是你的突破点。
随着您增加负载和监控,您可能会发现建议调整特定参数的模式。然后应在同一级别的多线程中再次测试每个调整尝试。 available 的提升从监控上会很明显。
更新:
我的目标是了解哪些因素会使我的 tomcat 服务器不堪重负。当发生某些异常时,我可以做些什么来解决或补救它,而无需将我的服务器切换到更好的机器。这不是一个真正的生产环境的应用程序,只是我自己的实验(除了在服务器端的一些变化,我也可能在我的客户端做一些事情)
我的客户端和服务器都很简单:服务器只检查URL格式,如果正确就发送201代码。我的客户发送的每个请求只包含一个简单的 JSON 正文。不涉及数据库。两台机器(t2-micro)分别只有运行客户端和服务器。
我的客户是
OkHttpClient()
。为了避免超时异常,我已经通过setConnectTimeout
、setReadTimeout
和setWriteTimeout
将超时设置为 1,000,000 毫秒。我也在我的服务器上转到$CATALINA/conf/server.xml
并设置connectionTimeout = "-1"
(infinite)
原版POST:
我试图通过让客户端启动 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上设置了响应压缩?它会在服务器上提供更好的吞吐量,特别是如果每个请求发回的数据超过几 kbs。
--------更新----------
根据问题的更新,还有一些想法。
由于应用程序相当简单,就服务器压力而言,路径应该是从低开始并逐渐增加负载,同时监控各种事物(cpu、内存、JVM 使用情况、文件句柄计数、网络 i/o).
负载增量应分布在几个 运行 秒内。 从低至 100 个并行线程开始。
在每次 运行 之后尽可能多地记录信息,如果服务器运行良好,请增加负载。
建议增量 100、200、500、1000、1500、2000、2500、3000。
在某种程度上,您会看到服务器无法再承受它。那将是你的突破点。
随着您增加负载和监控,您可能会发现建议调整特定参数的模式。然后应在同一级别的多线程中再次测试每个调整尝试。 available 的提升从监控上会很明显。