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

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

Сообщение Anonymous »

Сводка по среде
Мы запускаем автономный рабочий Apache DolphinScheduler 3.2.0 (не Docker/K8s).
2025-10-02 ~09:40 рабочий процесс перестал принимать соединения на своем порту Netty (1234).
Затем главный регистрировал ошибки соединения, произошла загрузка ЦП. 100 %, и задания зависли.
Все службы DolphinScheduler выглядели «включенными», но рабочий процесс не работал, пока мы не перезапустили его вручную.
Информация о системе

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

Memory: 192 GiB (Swap: 8 GiB)
Disk: /data ~400 GiB free
Java: OpenJDK 11.0.24 (Red Hat build)
DolphinScheduler jvm_args_env.sh (master & worker):
-Xms32g
-Xmx32g
-Xmn16g
СООТВЕТСТВУЮЩИЕ ЖУРНАЛЫ

МАСТЕР-СЕРВЕР

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

[WARN] 2025-10-02 09:01:26.576 +0300 org.apache.dolphinscheduler.remote.NettyRemotingClient:[321] - [WorkflowInstance-0][TaskInstance-0] - connect to Host(ip=IP, port=PORT) error
io.netty.channel.AbstractChannel$AnnotatedConnectException: finishConnect(..) failed: Connection refused: /IP:PORT
Caused by: java.net.ConnectException: finishConnect(..) failed: Connection refused
at io.netty.channel.unix.Errors.throwConnectException(Errors.java:124)
at io.netty.channel.unix.Socket.finishConnect(Socket.java:251)
at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.doFinishConnect(AbstractEpollChannel.java:673)
at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.finishConnect(AbstractEpollChannel.java:650)
at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.epollOutReady(AbstractEpollChannel.java:530)
at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:465)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at java.base/java.lang.Thread.run(Thread.java:829)
[ERROR] 2025-10-02 09:01:26.576 +0300 org.apache.dolphinscheduler.server.master.runner.GlobalTaskDispatchWaitingQueueLooper:[87] - [WorkflowInstance-0][TaskInstance-0] - Dispatch task failed
org.apache.dolphinscheduler.server.master.exception.TaskDispatchException: Dispatch task to IP:PORT failed
at org.apache.dolphinscheduler.server.master.runner.BaseTaskDispatcher.doDispatch(BaseTaskDispatcher.java:101)
at org.apache.dolphinscheduler.server.master.runner.BaseTaskDispatcher.dispatchTask(BaseTaskDispatcher.java:74)
at org.apache.dolphinscheduler.server.master.runner.GlobalTaskDispatchWaitingQueueLooper.run(GlobalTaskDispatchWaitingQueueLooper.java:79)
Caused by: org.apache.dolphinscheduler.remote.exceptions.RemotingException: connect to : Host(ip=IP, port=PORT) fail
at org.apache.dolphinscheduler.remote.NettyRemotingClient.sendSync(NettyRemotingClient.java:210)
at org.apache.dolphinscheduler.server.master.rpc.MasterRpcClient.sendSyncCommand(MasterRpcClient.java:49)
at org.apache.dolphinscheduler.server.master.runner.BaseTaskDispatcher.doDispatch(BaseTaskDispatcher.java:87)
...  2 common frames omitted

РАБОЧИЙ-СЕРВЕР

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

[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)

РЕЗУЛЬТАТЫ РАССЛЕДОВАНИЯ

  • Работник накопил >21 000 потоков, рост со скоростью ~100 потоков в минуту в течение 77 дней.
  • Только стеки потоков использовали ~21 ГиБ ОЗУ.
  • Время паузы GC увеличилось с ~80 мс до >1100 мс.
  • Когда исполнитель событий Netty перестал отвечать, порт 1234 закрылся и задания остановились.
  • После ручного перезапуска все восстановилось, но количество потоков продолжает расти — поэтому ожидается еще один сбой.

Предлагаемые меры по смягчению последствий

  • Уменьшите численность молодого поколения, чтобы сократить паузы GC:

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

# /data/dolphin/worker-server/bin/jvm_args_env.sh
-Xmn8g    # instead of -Xmn16g
  • Ограничьте одновременные задачи и установите пороговые значения ресурсов:

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

worker:
exec-threads: 50     # was 100
max-cpu-load-avg: 0.7
reserved-memory:  0.3
  • Исследуйте возможную ошибку пула потоков DolphinScheduler, например:
  • Служба-исполнитель не ограничена
  • Обработчики завершения задач не очищают потоки
  • Фабрика потоков создает потоки без предел
ВОПРОСЫ (пожалуйста, ответьте фактами, командами или ссылками на документацию)
  • Причина подтверждения;
Учитывая журналы и количество потоков >21 тыс., наиболее вероятной является утечка потока в исполнителе рабочего процесса причина?
Какие дополнительные доказательства (дампы потоков, журналы GC, диагностика Netty) окончательно подтвердят это и исключат причины, связанные с ОС или сетью?
  • Немедленные меры по устранению последствий
Являются ли вышеуказанные изменения JVM и рабочей конфигурации уместными и безопасными на 192 ГиБ хост?
Должен ли я также настроить параметры -Xmx, -Xss или GC для повышения оперативности?
  • Шаги диагностики
Какие именно команды мне следует выполнить, чтобы подтвердить утечку и собрать данные для отчета об ошибке?
Например:
  • jstack — что искать (повторяющиеся одинаковые имена потоков, стеки исполнителей и т. д.)
  • jcmd, jmap или jstat — как читать метрики GC и кучи
  • Проверки на уровне ОС (ps -eLf, top, lsof), показывающие тенденции роста
  • Любые Внутренние метрики DolphinScheduler для включения
  • Руководство по постоянному исправлению / исправлению
Если это известная проблема пула потоков, какие версии или изменения конфигурации ее устраняют?
Существуют ли безопасные обходные пути (ограниченные пулы, исправленные) исполнители, перехватчики очистки задач) до тех пор, пока не будет выпущено вышестоящее исправление?
  • Управление кучей JVM
Каковы наилучшие настройки кучи для кучи размером 32 ГиБ на машине 192 ГиБ?
  • Рекомендуемые соотношения для -Xms, -Xmx и -Xmn
  • Оптимальный алгоритм/флаги GC в OpenJDK 11 для рабочих нагрузок, чувствительных к задержке
  • Как определить размер стека потоков (-Xss) по сравнению с кучей, чтобы уменьшить нагрузку на память
Доступная диагностика данные
Я могу прикрепить:
  • Полные журналы сборщика мусора (gc.log)
  • дампы потоков jstack (работоспособное и состояние утечки)
  • Образцы количества потоков (ps -eLf | wc -l)
  • Полные журналы рабочих процессов и файлы конфигурации
Цель
Убедиться, что основной причиной действительно является утечка потока, проверить план устранения последствий и получить основанные на фактах рекомендации по настройке и диагностике JVM.
Мы будем очень признательны за любую авторитетную документацию или примеры команд.

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

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

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

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

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

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