Работник 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
Код: Выделить всё
"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 (работоспособность или утечка)
- Рабочие журналы и файлы конфигурации
Подробнее здесь: https://stackoverflow.com/questions/797 ... cpu-21k-th
Мобильная версия