Пульсация кластера Акка задерживает Кубернетес - PullRequest
0 голосов
/ 19 сентября 2019

Наше приложение Scala (развертывание в Kubernetes) постоянно испытывает задержки сердцебиения кластера Akka ≈3 с.

Однажды у нас даже была задержка в 200 с, что также проявилось на следующем графике:

grafana-200s

Может кто-нибудь предложить вещи для дальнейшего изучения?

Спецификации

  • Kubernetes 1.12.5
requests.cpu = 16
# limits.cpu not set
  • Scala 2.12.7
  • Java 11.0.4 + 11
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+AlwaysPreTouch
-Xlog:gc*,safepoint,gc+ergo*=trace,gc+age=trace:file=/data/gc.log:time,level,tags:filecount=4,filesize=256M
-XX:+PerfDisableSharedMem
  • Akka Cluster 2.5.25

Java Flight Recording

Пример:

timestamp    delay_ms
06:24:55.743 2693
06:30:01.424 3390
07:31:07.495 2487
07:36:12.775 3758

Было 4 подозрительных момента времени, когда множество потоков Java Thread Park были зарегистрированы одновременно для потоков Akka (актеры иудаленное взаимодействие), и все они связаны с проблемами сердцебиения:

jfr-thread-park-1 jfr-thread-park-2

Вокруг 07:05:39 не было "сердцебиения"было отложено "журналы, но был этот:

07:05:39,673 WARN PhiAccrualFailureDetector heartbeat interval is growing too large for address SOME_IP: 3664 millis

Во время Ja корреляции с событиями остановки или заблокированными потоками не былоva сеанс записи полета, только два начала безопасной точки событий в непосредственной близости от задержек:

jfr-safepoint-begin

регулирование CFS

Загрузка ЦП приложения невелика, поэтому мы подумали, что это может быть связано с тем, как K8 планирует наш узел приложения для ЦП .Но отключение лимитов ЦП не сильно улучшило ситуацию, хотя метрика kubernetes.cpu.cfs.throttled.second исчезла.

Отдельный диспетчер

Использование отдельного диспетчера кажется ненужным, поскольку задержки возникают даже при отсутствии нагрузкиМы также создали явное приложение, похожее на наше, которое не делает ничего, кроме пульса, и все еще испытывает эти задержки.

Кластер K8s

Из наших наблюдений это происходит гораздо чаще на паре К8узлы в большом кластере K8s используются совместно со многими другими приложениями, когда наше приложение не загружается сильно.

У отдельного выделенного кластера K8s, где наше приложение тестируется под нагрузкой, почти не возникает проблем с задержками пульса.

1 Ответ

2 голосов
/ 19 сентября 2019

Удалось ли вам исключить сборку мусора?По моему опыту, это наиболее распространенная причина задержек сердцебиения в распределенных системах JVM (а квота CFS в среде Kubernetes / Mesos может эффективно сделать STW не-Stop-The-World, особенно если вы не используете действительно недавние(позже, чем выпуск 212 JDK8) версия openjdk).

Каждая парковка потока перед началом «Безопасной точки» действительно заставляет меня поверить, что GC на самом деле является виновником.Определенные операции GC (например, перестановка кучи) требуют, чтобы каждый поток находился в безопасной точке, поэтому очень часто, когда он не заблокирован, потоки будут проверять, хочет ли JVM обеспечить их безопасную точку;если это так, то потоки размещаются самостоятельно, чтобы добраться до безопасной точки.

Если вы исключили GC, работаете ли вы в облачной среде (или на виртуальных машинах, где вы не можете быть уверены, что процессор илисеть не переподписана)?Документация кластера akka предлагает увеличить значение akka.cluster.failure-detector.threshold, которое по умолчанию соответствует значению, подходящему для более контролируемой среды LAN / bare-metal: 12.0 рекомендуется для облачных сред.Это не предотвратит задержку сердцебиения, но уменьшит вероятность ложного события сбоя из-за одного длинного сердцебиения (а также задержит ответы на подлинные события потери узла).Однако если вы хотите выдержать скачок времени между сердечными сокращениями от 1 до 200, вам потребуется действительно высокий порог.

...