Spring 推送大量请求后引导应用程序无响应
Spring Boot application not responding after pushing a large number of requests
我有一个名为服务器 A 的服务器有问题:
服务器A:Red Hat Enterprise Linux Server release 7.2 (Maipo)
服务器 B:Red Hat Enterprise Linux Server release 7.7 (Maipo)
jdk-8u231 安装在所有服务器上。
我在 2 台服务器上有一个 Spring 启动应用程序 运行。
每当我使用 Jmeter 向每个服务器上的应用程序 运行 发送 100 个并发请求时,服务器 B 上的应用程序 运行 没有问题。
但在服务器 A 中,应用程序将没有响应,这意味着进程 (PID) 仍然 运行 但我无法访问执行器端点,无法访问 Swagger 页面,无法发送新请求.. .log 文件从那时起什么也没有显示。
线程转储和堆转储没有显着差异。
谁能告诉我如何分析那个问题?
我仍然不知道为什么会出现这个问题。
好吧,我只能在这里推测,但这里有一些可以提供帮助的想法:
这里有两个可能的问题来源 Java 应用程序和 Linux(+它的网络策略、防火墙等)。
由于您不确定会发生什么,请尝试按 "elimination" 计算。
创建将 运行 100 个并发请求的脚本。将脚本放在服务器 A(有问题的服务器)和 运行 脚本将 运行 反对 "localhost"(很明显)。如果您发现它有效,那么问题根本不在 Java 中。可能是一些网络政策或 linux 设置,谁知道呢。
在 java 应用程序的控制器中放置一条日志消息并检查日志。该日志应打印请求编号等内容,以便您能够了解在明确定义的请求数量之后是否卡住了,或者它始终是不同的数字。
检查 Spring 引导应用程序的配置。 spring 引导应用程序中 运行 嵌入式 Web 服务器分配的用于服务请求的线程数可能有所不同(假设您没有使用反应式堆栈)和这个数字不同。在这种情况下,您将无法调用其余端点、执行器等。
如果 JMX 连接可用于设置,通过 JMX 连接并检查 Tomcat 的 MBean(同样,假设引擎盖下有一个 tomcat)以检查与 4.
中几乎相同的信息
您提到了线程转储。尝试获取多个线程转储,但在 运行ning JMeter 测试之前进行一次,在 运行ning 期间进行一次(当一切仍然有效时),一次在一切都卡住时进行。
在线程转储中检查实际的堆栈跟踪,也许所有线程都在使用数据库或其他东西而无法处理请求,就像我在“4”中解释的那样
检查 GC 日志,也许 GC 工作太辛苦以至于您无法真正与应用程序交互。
我有一个名为服务器 A 的服务器有问题: 服务器A:Red Hat Enterprise Linux Server release 7.2 (Maipo) 服务器 B:Red Hat Enterprise Linux Server release 7.7 (Maipo)
jdk-8u231 安装在所有服务器上。
我在 2 台服务器上有一个 Spring 启动应用程序 运行。 每当我使用 Jmeter 向每个服务器上的应用程序 运行 发送 100 个并发请求时,服务器 B 上的应用程序 运行 没有问题。
但在服务器 A 中,应用程序将没有响应,这意味着进程 (PID) 仍然 运行 但我无法访问执行器端点,无法访问 Swagger 页面,无法发送新请求.. .log 文件从那时起什么也没有显示。
线程转储和堆转储没有显着差异。
谁能告诉我如何分析那个问题? 我仍然不知道为什么会出现这个问题。
好吧,我只能在这里推测,但这里有一些可以提供帮助的想法:
这里有两个可能的问题来源 Java 应用程序和 Linux(+它的网络策略、防火墙等)。
由于您不确定会发生什么,请尝试按 "elimination" 计算。
创建将 运行 100 个并发请求的脚本。将脚本放在服务器 A(有问题的服务器)和 运行 脚本将 运行 反对 "localhost"(很明显)。如果您发现它有效,那么问题根本不在 Java 中。可能是一些网络政策或 linux 设置,谁知道呢。
在 java 应用程序的控制器中放置一条日志消息并检查日志。该日志应打印请求编号等内容,以便您能够了解在明确定义的请求数量之后是否卡住了,或者它始终是不同的数字。
检查 Spring 引导应用程序的配置。 spring 引导应用程序中 运行 嵌入式 Web 服务器分配的用于服务请求的线程数可能有所不同(假设您没有使用反应式堆栈)和这个数字不同。在这种情况下,您将无法调用其余端点、执行器等。
如果 JMX 连接可用于设置,通过 JMX 连接并检查 Tomcat 的 MBean(同样,假设引擎盖下有一个 tomcat)以检查与 4.
中几乎相同的信息
您提到了线程转储。尝试获取多个线程转储,但在 运行ning JMeter 测试之前进行一次,在 运行ning 期间进行一次(当一切仍然有效时),一次在一切都卡住时进行。
在线程转储中检查实际的堆栈跟踪,也许所有线程都在使用数据库或其他东西而无法处理请求,就像我在“4”中解释的那样
检查 GC 日志,也许 GC 工作太辛苦以至于您无法真正与应用程序交互。