Потоки Jetty блокируются при тестировании тайм-аута ответа, что приводит к сбою приложенияJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Потоки Jetty блокируются при тестировании тайм-аута ответа, что приводит к сбою приложения

Сообщение Anonymous »

Я тестирую сценарий трафика с TPS ~ 1000, сервер HTTP/2 имеет большую задержку, поэтому время ожидания всех сообщений, отправляемых клиентом Jetty HTTP/2 на сервер, истекает. Ниже мое наблюдение за этим запуском. Я использую HttpClient Jetty с реактивным клиентом Spring WebFlux (WebClient).
  • Создается более 1000 потоков Jetty
  • Среди них около 200 потоков находились в заблокированном состоянии (обратная трассировка добавлена ​​ниже).
  • На этом этапе приложение перестает отвечать на запросы и в конечном итоге умирает (OOM)
Запрос:
Я обнаружил в системе неперехваченное исключение и обращаюсь за разъяснениями по основной причине. Приведенная ниже трассировка стека показывает, что поток заблокирован при попытке получить блокировку объекта PrintStream. Не могли бы вы помочь уточнить, что может быть причиной этой блокировки? Существует ли конкретное условие или известная проблема, которая может привести к возникновению этого неперехваченного исключения?
Стековая трассировка заблокированного потока:

Код: Выделить всё

"@365a6a43-660" #660 prio=5 os_prio=0 cpu=0.79ms elapsed=0.90s tid=0x0000559958d13150 nid=0x16bb waiting for monitor entry  [0x00007f96e6bfc000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.io.PrintStream.write(java.base@17.0.7/PrintStream.java:696)
- waiting to lock   (a java.io.PrintStream)
at java.io.PrintStream.print(java.base@17.0.7/PrintStream.java:863)
at java.lang.ThreadGroup.uncaughtException(java.base@17.0.7/ThreadGroup.java:1084)
at java.lang.ThreadGroup.uncaughtException(java.base@17.0.7/ThreadGroup.java:1077)
at reactor.core.scheduler.Schedulers.handleError(Schedulers.java:1208)
at reactor.core.scheduler.ExecutorScheduler.schedule(ExecutorScheduler.java:70)
at reactor.core.publisher.MonoPublishOn$PublishOnSubscriber.trySchedule(MonoPublishOn.java:146)
at reactor.core.publisher.MonoPublishOn$PublishOnSubscriber.onNext(MonoPublishOn.java:120)
at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:200)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2398)
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2194)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onSubscribe(FluxOnErrorResume.java:74)
at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55)
at reactor.core.publisher.Mono.subscribe(Mono.java:4400)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onError(FluxTimeout.java:219)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:172)
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onError(Operators.java:2063)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544)
at reactor.core.publisher.FluxMap$MapSubscriber.onError(FluxMap.java:134)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106)
at reactor.core.publisher.Operators.error(Operators.java:198)
at reactor.core.publisher.MonoErrorSupplied.subscribe(MonoErrorSupplied.java:56)
at reactor.core.publisher.Mono.subscribe(Mono.java:4400)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
at reactor.core.publisher.FluxPeek$PeekSubscriber.onError(FluxPeek.java:222)
at reactor.core.publisher.FluxPeek$PeekSubscriber.onError(FluxPeek.java:222)
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onError(MonoIgnoreThen.java:278)
at org.eclipse.jetty.reactive.client.internal.AbstractSingleProcessor.onError(AbstractSingleProcessor.java:120)
at org.eclipse.jetty.reactive.client.internal.ResponseListenerProcessor.onComplete(ResponseListenerProcessor.java:141)
at org.eclipse.jetty.client.ResponseNotifier.notifyComplete(ResponseNotifier.java:213)
at org.eclipse.jetty.client.ResponseNotifier.notifyComplete(ResponseNotifier.java:205)
at org.eclipse.jetty.client.HttpReceiver.terminateResponse(HttpReceiver.java:477)
at org.eclipse.jetty.client.HttpReceiver.terminateResponse(HttpReceiver.java:457)
at org.eclipse.jetty.client.HttpReceiver.abort(HttpReceiver.java:553)
at org.eclipse.jetty.client.HttpChannel.abortResponse(HttpChannel.java:149)
at org.eclipse.jetty.client.HttpSender.terminateRequest(HttpSender.java:298)
at org.eclipse.jetty.client.HttpSender.abortRequest(HttpSender.java:280)
at org.eclipse.jetty.client.HttpSender.abort(HttpSender.java:385)
at org.eclipse.jetty.client.HttpSender.lambda$executeAbort$0(HttpSender.java:252)
at org.eclipse.jetty.client.HttpSender$$Lambda$2278/0x0000000801a3a400.run(Unknown Source)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:894)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1038)
at java.lang.Thread.run(java.base@17.0.7/Thread.java:833)
Трассировка потока, блокирующего PrintStream

Код: Выделить всё

"@365a6a43-659"  #659 prio=5 os\_prio=0 cpu=0.91ms elapsed=0.90s tid=0x00007f97186787d0 nid=0x16ba runnable  \[0x00007f96e6cfd000\]
java.lang.Thread.State: RUNNABLE
at java.lang.StackTraceElement.initStackTraceElements(java.base@17.0.7/Native Method)
at java.lang.StackTraceElement.of(java.base@17.0.7/StackTraceElement.java:541)
at java.lang.Throwable.getOurStackTrace(java.base@17.0.7/Throwable.java:839)
- locked \ (a java.util.concurrent.RejectedExecutionException)
at java.lang.Throwable.printEnclosedStackTrace(java.base@17.0.7/Throwable.java:701)
at java.lang.Throwable.printStackTrace(java.base@17.0.7/Throwable.java:682)
- locked \  (a java.io.PrintStream)
at java.lang.Throwable.printStackTrace(java.base@17.0.7/Throwable.java:659)
at java.lang.ThreadGroup.uncaughtException(java.base@17.0.7/ThreadGroup.java:1086)
at java.lang.ThreadGroup.uncaughtException(java.base@17.0.7/ThreadGroup.java:1077)
at reactor.core.scheduler.Schedulers.handleError(Schedulers.java:1208)
at reactor.core.scheduler.ExecutorScheduler.schedule(ExecutorScheduler.java:70)
at reactor.core.publisher.MonoPublishOn$PublishOnSubscriber.trySchedule(MonoPublishOn.java:146)
at reactor.core.publisher.MonoPublishOn$PublishOnSubscriber.onNext(MonoPublishOn.java:120)
at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:200)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2398)
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2194)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onSubscribe(FluxOnErrorResume.java:74)
at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55)
at reactor.core.publisher.Mono.subscribe(Mono.java:4400)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onError(FluxTimeout.java:219)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:172)
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onError(Operators.java:2063)
at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544)
at reactor.core.publisher.FluxMap$MapSubscriber.onError(FluxMap.java:134)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106)
at reactor.core.publisher.Operators.error(Operators.java:198)
at reactor.core.publisher.MonoErrorSupplied.subscribe(MonoErrorSupplied.java:56)
at reactor.core.publisher.Mono.subscribe(Mono.java:4400)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
at reactor.core.publisher.FluxPeek$PeekSubscriber.onError(FluxPeek.java:222)
at reactor.core.publisher.FluxPeek$PeekSubscriber.onError(FluxPeek.java:222)
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onError(MonoIgnoreThen.java:278)
at org.eclipse.jetty.reactive.client.internal.AbstractSingleProcessor.onError(AbstractSingleProcessor.java:120)
at org.eclipse.jetty.reactive.client.internal.ResponseListenerProcessor.onComplete(ResponseListenerProcessor.java:141)
at org.eclipse.jetty.client.ResponseNotifier.notifyComplete(ResponseNotifier.java:213)
at org.eclipse.jetty.client.ResponseNotifier.notifyComplete(ResponseNotifier.java:205)
at org.eclipse.jetty.client.HttpReceiver.terminateResponse(HttpReceiver.java:477)
at org.eclipse.jetty.client.HttpReceiver.terminateResponse(HttpReceiver.java:457)
at org.eclipse.jetty.client.HttpReceiver.abort(HttpReceiver.java:553)
at org.eclipse.jetty.client.HttpChannel.abortResponse(HttpChannel.java:149)
at org.eclipse.jetty.client.HttpSender.terminateRequest(HttpSender.java:298)
at org.eclipse.jetty.client.HttpSender.abortRequest(HttpSender.java:280)
at org.eclipse.jetty.client.HttpSender.abort(HttpSender.java:385)
at org.eclipse.jetty.client.HttpSender.lambda$executeAbort$0(HttpSender.java:252)
at org.eclipse.jetty.client.HttpSender$$Lambda$2278/0x0000000801a3a400.run(Unknown Source)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:894)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1038)
at java.lang.Thread.run(java.base@17.0.7/Thread.java:833)

Locked ownable synchronizers:

Используемые версии Reactor: 3.5.14
Другие соответствующие версии библиотек (например, netty, ...): Jetty 11.0.11
Версия JVM ( java -version): 17.0.7
Операционная система и версия (например, uname -a): Linux
Я ожидаю, что трафик будет отправляться непрерывно. Хотя приложение может выйти из строя из-за высоких задержек сервера, само приложение не должно аварийно завершить работу.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ication-cr
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»