首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TIMED_WAITING中有很多线程的Spring应用程序

TIMED_WAITING中有很多线程的Spring应用程序
EN

Stack Overflow用户
提问于 2022-08-09 21:19:30
回答 1查看 149关注 0票数 1

问题

我有很多线程处于"TIMED_WAITING“状态,我不知道为什么以及如何调试它。

调试

我正在使用spring-actuator + Grafana + Prometheus来监视很多JVM +线程并行程序

  1. 我的应用程序从线程的“快照”开始:

代码语言:javascript
运行
复制
blocked: 0
new: 0
runnable: 17
terminated: 0
time-waiting: 21
waiting: 12

Apache测试后的ab -s 300 -n 100000 -c 50 "http://my-address/v1/my-collection"

  1. I有一个结果:

  1. 和测试后线程的“快照”如下:

代码语言:javascript
运行
复制
blocked: 0
new: 0
runnable: 21
terminated: 0
time-waiting: 73
waiting: 12

  1. 现在,如果我再次使用相同的配置运行Apache基准测试,我将拥有:

代码语言:javascript
运行
复制
This is ApacheBench, Version 2.3 <$Revision: 1901567 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking my-address (be patient)

Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
apr_socket_recv: Operation timed out (110)
Total of 45339 requests completed

假设

因此,我认为这表明我无法处理压力测试生成的并发性,因为我的线程池中没有足够的线程可用。这是默认配置(200等),请查看引用。有一个链接指向我正在使用的默认配置)。

螺纹倾卸

使用j堆栈

我用:jstack PID > /home/app/dump.txt做了一个线程转储。这是我的结果(https://fastthread.io/my-thread-report.jsp?p=c2hhcmVkLzIwMjIvMDgvOS9kdW1wLnR4dC0tMjAtNTctMTA=&):

使用arthas

此外,使用arthas-boot,我有以下内容:

代码语言:javascript
运行
复制
199    ThreadPoolTaskScheduler-1              main               5            TIMED_WAITIN 0.0          0.000        0:0.009      false        false
201    ThreadPoolTaskScheduler-1              main               5            TIMED_WAITIN 0.0          0.000        0:0.008      false        false
203    ThreadPoolTaskScheduler-1              main               5            TIMED_WAITIN 0.0          0.000        0:0.005      false        false
207    ThreadPoolTaskScheduler-1              main               5            TIMED_WAITIN 0.0          0.000        0:0.005      false        false
211    ThreadPoolTaskScheduler-1              main               5            TIMED_WAITIN 0.0          0.000        0:0.005      false        false
213    ThreadPoolTaskScheduler-1              main               5            TIMED_WAITIN 0.0          0.000        0:0.005      false        false
216    ThreadPoolTaskScheduler-1              main               5            TIMED_WAITIN 0.0          0.000        0:0.004      false        false
220    http-nio-8080-exec-1                   main               5            TIMED_WAITIN 0.0          0.000        0:7.732      false        true
221    http-nio-8080-exec-2                   main               5            TIMED_WAITIN 0.0          0.000        0:7.662      false        true
222    http-nio-8080-exec-3                   main               5            TIMED_WAITIN 0.0          0.000        0:7.650      false        true
223    http-nio-8080-exec-4                   main               5            TIMED_WAITIN 0.0          0.000        0:7.611      false        true
224    http-nio-8080-exec-5                   main               5            TIMED_WAITIN 0.0          0.000        0:7.652      false        true
225    http-nio-8080-exec-6                   main               5            TIMED_WAITIN 0.0          0.000        0:7.669      false        true
226    http-nio-8080-exec-7                   main               5            TIMED_WAITIN 0.0          0.000        0:7.574      false        true
227    http-nio-8080-exec-8                   main               5            TIMED_WAITIN 0.0          0.000        0:7.615      false        true
228    http-nio-8080-exec-9                   main               5            TIMED_WAITIN 0.0          0.000        0:7.649      false        true
229    http-nio-8080-exec-10                  main               5            TIMED_WAITIN 0.0          0.000        0:7.798      false        true
230    http-nio-8080-Poller                   main               5            RUNNABLE     0.0          0.000        0:6.093      false        true
231    http-nio-8080-Acceptor                 main               5            RUNNABLE     0.0          0.000        0:4.080      false        true
232    DestroyJavaVM                          main               5            RUNNABLE     0.0          0.000        0:0.725      false        false
497    http-nio-8080-exec-11                  main               5            TIMED_WAITIN 0.0          0.000        0:7.283      false        true
498    http-nio-8080-exec-12                  main               5            TIMED_WAITIN 0.0          0.000        0:7.240      false        true
499    http-nio-8080-exec-13                  main               5            TIMED_WAITIN 0.0          0.000        0:7.256      false        true
500    http-nio-8080-exec-14                  main               5            TIMED_WAITIN 0.0          0.000        0:7.195      false        true
501    http-nio-8080-exec-15                  main               5            TIMED_WAITIN 0.0          0.000        0:7.292      false        true
502    http-nio-8080-exec-16                  main               5            TIMED_WAITIN 0.0          0.000        0:7.167      false        true
503    http-nio-8080-exec-17                  main               5            TIMED_WAITIN 0.0          0.000        0:7.204      false        true
504    http-nio-8080-exec-18                  main               5            TIMED_WAITIN 0.0          0.000        0:7.176      false        true
505    http-nio-8080-exec-19                  main               5            TIMED_WAITIN 0.0          0.000        0:7.222      false        true
506    http-nio-8080-exec-20                  main               5            TIMED_WAITIN 0.0          0.000        0:7.140      false        true
512    http-nio-8080-exec-21                  main               5            TIMED_WAITIN 0.0          0.000        0:4.739      false        true
513    http-nio-8080-exec-22                  main               5            TIMED_WAITIN 0.0          0.000        0:4.779      false        true
20     Common-Cleaner                         InnocuousThreadGro 8            TIMED_WAITIN 0.0          0.000        0:0.008      false        true
851    Keep-Alive-Timer                       InnocuousThreadGro 8            TIMED_WAITIN 0.0          0.000        0:0.000      false        true

获取线程ID 499,我们有:

代码语言:javascript
运行
复制
[arthas@31437]$ thread 499
"http-nio-8080-exec-13" Id=499 TIMED_WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@2bf2651c
    at java.base@17.0.4/jdk.internal.misc.Unsafe.park(Native Method)
    -  waiting on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@2bf2651c
    at java.base@17.0.4/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:252)
    at java.base@17.0.4/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1672)
    at java.base@17.0.4/java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:460)
    at app//org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:128)
    at app//org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:33)
    at app//org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1113)
    at app//org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
    at app//org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    at app//org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base@17.0.4/java.lang.Thread.run(Thread.java:833)

我的环境

在这个JVM中使用spring-boot-starter-web:2.7.2

代码语言:javascript
运行
复制
❯ java --version
openjdk 17.0.4 2022-07-19 LTS
OpenJDK Runtime Environment Corretto-17.0.4.8.1 (build 17.0.4+8-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.4.8.1 (build 17.0.4+8-LTS, mixed mode, sharing)

使用此启动设置:

代码语言:javascript
运行
复制
Initial Memory (xms): 248 MB.
Max Memory (xmx): 3,968 MB.
java.lang:type=GarbageCollector,name=ZGC Cycles
java.lang:type=GarbageCollector,name=ZGC Pauses

你能帮我调试一下我的问题吗?我做错了什么?

参考文献

  1. Interpreting a tomcat thread dump and diagnosing a deadlock
  2. Trying to identify source of abandoned connections in tomcat
  3. Multiple TIMED_WAITING threads seen on tomcat 7 thread dump
  4. Spring Boot - Limit on number of connections created
  5. http://www.masterspringboot.com/configuration/web-server/configuring-tomcat-connection-pool-on-spring-boot/
EN

回答 1

Stack Overflow用户

发布于 2022-08-09 21:30:39

这是当您使用ab (apache )时的预期行为-- ab只支持HTTP/1.0,这意味着服务器必须关闭HTTP--但是在TCP中,启动关机的端以TIME_WAIT状态访问套接字--您可以通过在服务器上发出netstat -na命令来检查这一点,并计算有多少套接字处于TIME_WAIT状态。

您可以将tcp_tw_reuse (/proc/sys/net/ipv4/tcp_tw_reuse)设置为1,这可能会有所帮助,但这是没有意义的--您正在使用旧的http-client。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73298214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档