Рабочий DolphinScheduler перестал прослушивать (соединение отклонено, 100% ЦП, > 21 тыс. потоков): проверка причины и наJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Рабочий DolphinScheduler перестал прослушивать (соединение отклонено, 100% ЦП, > 21 тыс. потоков): проверка причины и на

Сообщение Anonymous »

============================
Работник Apache DolphinScheduler постепенно порождает 21 тыс. потоков — возможная утечка потоков Netty
Среда:
apache_dolphinscheduler: 3.2.0
deployment_mode: автономный
операционная система: RHEL 8
память: 192 ГБ
подкачка: 8 ГБ
диск:
монтирование: /data
free_space: 400 ГБ
java:
производитель: OpenJDK
версия: 11.0.24 (сборка Red Hat)
jvm_args:
  • -Xms32g
  • -Xmx32g
  • -Xmn16g
Признаки:
  • Количество рабочих потоков постоянно увеличивается (ps -eLf | wc -l)
  • Поток только стеки потребляют ~21 ГиБ памяти.
  • Время паузы GC увеличивается с ~80 мс до >1100 мс.
  • Цикл событий Netty в конечном итоге перестает отвечать — порт 1234 закрывается.
  • Главные журналы повторяются:
    io.netty.channel.AbstractChannel$AnnotatedConnectException:
    finishConnect(..) не удалось: соединение отклонено: /IP:PORT
  • Перезапуск работника временно устраняет проблему
Что я проверил:
  • Использовал ps -eLf | grep рабочий | wc -l для подтверждения увеличения количества потоков.
  • Собраны несколько дампов потоков с помощью jstack до и после роста.
  • Наблюдаются повторяющиеся имена потоков, такие как:
    nioEventLoopGroup-2-1
    nioEventLoopGroup-2-2
    pool-xx-thread-yy
  • Журналы GC показывают увеличение продолжительности паузы и Использование OldGen
Пример фрагмента jstack (возможная модель утечки):

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

"nioEventLoopGroup-2-14937" #21437 daemon prio=5 os_prio=0 tid=0x00007f3c580bb000 nid=0x10119 waiting on condition [0x00007f3c0bdfd000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(Native Method)
- parking to wait for   (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
at io.netty.util.concurrent.SingleThreadEventExecutor.takeTask(SingleThreadEventExecutor.java:250)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:396)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:387)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:829)

"nioEventLoopGroup-2-14938"  #21438 daemon prio=5 os_prio=0 tid=0x00007f3c580bc800 nid=0x1011a waiting on condition [0x00007f3c0bcfb000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
at io.netty.util.concurrent.SingleThreadEventExecutor.takeTask(SingleThreadEventExecutor.java:250)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:396)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:387)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:829)
Журналы рабочих (представитель):

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

[INFO] 2025-10-02 09:01:25.764 +0300 org.apache.dolphinscheduler.server.worker.runner.WorkerTaskExecuteRunnable:[289] - [WorkflowInstance-59856][TaskInstance-507499] - The current execute mode isn't develop mode, will clear the task execute file: /data/dolphin/exec/process/default/15236034355840/15257910743307_11/59856/507499
[INFO] 2025-10-02 09:01:25.765 +0300 org.apache.dolphinscheduler.server.worker.runner.WorkerTaskExecuteRunnable:[304] - [WorkflowInstance-59856][TaskInstance-507499] - Success clear the task execute file: /data/dolphin/exec/process/default/15236034355840/15257910743307_11/59856/507499
[INFO] 2025-10-02 09:01:25.765 +0300 org.apache.dolphinscheduler.server.worker.runner.WorkerTaskExecuteRunnable:[330] - [WorkflowInstance-59856][TaskInstance-507499] - FINALIZE_SESSION
[INFO] 2025-10-02 09:01:52.136 +0300 org.apache.zookeeper.ClientCnxn:[1171] - [WorkflowInstance-0][TaskInstance-0] - Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181.
[INFO] 2025-10-02 09:01:52.136 +0300 org.apache.zookeeper.ClientCnxn:[1173] - [WorkflowInstance-0][TaskInstance-0] - SASL config status: Will not attempt to authenticate using SASL (unknown error)
[INFO] 2025-10-02 09:01:59.281 +0300 org.apache.zookeeper.ClientCnxn:[1005] - [WorkflowInstance-0][TaskInstance-0] - Socket connection established, initiating session, client: /0:0:0:0:0:0:0:1:40934, server: localhost/0:0:0:0:0:0:0:1:2181
[INFO] 2025-10-02 09:01:59.282 +0300 org.apache.zookeeper.ClientCnxn:[1444] - [WorkflowInstance-0][TaskInstance-0] - Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, session id = 0x10000001be900ac, negotiated timeout = 30000
[INFO] 2025-10-02 09:01:59.282 +0300 org.apache.curator.framework.state.ConnectionStateManager:[252] - [WorkflowInstance-0][TaskInstance-0] - State change: RECONNECTED
[INFO] 2025-10-02 09:01:59.580 +0300 org.apache.dolphinscheduler.server.worker.processor.WorkerTaskUpdatePidAckProcessor:[59] - [WorkflowInstance-0][TaskInstance-507499] - task execute update pid ack command : TaskUpdateRuntimeAckMessage(success=true, taskInstanceId=507499)
[INFO] 2025-10-02 09:01:59.580 +0300 org.apache.dolphinscheduler.server.worker.processor.WorkerTaskExecuteResultAckProcessor:[58] - [WorkflowInstance-0][TaskInstance-507499] - Receive task execute response ack command :  TaskExecuteResultMessageAck(super=BaseMessage(messageSenderAddress=IP:5678, messageReceiverAddress=IP:1234, messageSendTime=1759384886490), taskInstanceId=507499, success=true)
Вопрос:
Как я могу подтвердить, что такое поведение указывает на утечку потока Netty в рабочем процессе DolphinScheduler, а не на проблему ОС или сети?
В чем мне нужна помощь:
  • Подтверждение утечки потока
    • В jstack, какие шаблоны подтверждают утечку из цикла событий Netty или потоков исполнителя?
    • Существуют ли конкретные трассировки стека (например, io.netty.util.concurrent.DefaultThreadFactory, SingleThreadEventExecutor.runAllTasks), указывающие на утечку потоков?
  • Диагностические команды
    • Какие команды следует использовать для проверки и мониторинга этой утечки?
      Примеры:
      jstack | grep nioEventLoopGroup
      jcmd Thread.print
      jmap -heap
      jstat -gcutil 5s
      lsof -p | wc -l
    • Как отличить потоки, созданные Netty, от потоков, созданных приложением?
  • Известные проблемы/ссылки
    • Существуют ли какие-либо известные проблемы в DolphinScheduler 3.2.x или Netty (4.x), связанные с неограниченным потоком создание или невыпущенные исполнители?
    • Любая конфигурация или исправление (например, ограниченные пулы потоков, worker.exec-threads или io.netty.eventLoopThreads), которые предотвращают это?
Цель:
Подтвердить, что количество растущих и закрытых потоков Порт Netty вызван утечкой потока цикла событий Netty в DolphinScheduler и для сбора достаточных доказательств (дампы потоков, данные GC) для отчета об ошибках восходящего потока.
Дополнительная информация:
Я могу предоставить:
  • Полный gc.log (рост паузы GC)
  • дампы потоков jstack (работоспособность или утечка)
  • Рабочие журналы и файлы конфигурации
Будут признательны за любые ссылки на основанную на фактах диагностику или документацию (Netty, DolphinScheduler или JVM).

Подробнее здесь: https://stackoverflow.com/questions/797 ... cpu-21k-th
Ответить

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

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

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

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

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