问题
我有很多线程处于"TIMED_WAITING“状态,我不知道为什么以及如何调试它。
调试
我正在使用spring-actuator
+ Grafana + Prometheus来监视很多JVM +线程并行程序
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"
:
blocked: 0
new: 0
runnable: 21
terminated: 0
time-waiting: 73
waiting: 12
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
,我有以下内容:
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,我们有:
[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
:
❯ 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)
使用此启动设置:
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
你能帮我调试一下我的问题吗?我做错了什么?
参考文献
发布于 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。
https://stackoverflow.com/questions/73298214
复制相似问题