Рубрики
Без рубрики

Укрощение Кукольного Сервера 6 Pt II: Сбор Мусора

Кукольный сервер может тратить много времени на сборку мусора, что влияет на его производительность. Помеченный как puppet, observability, java, сборка мусора.

Теперь, когда наша внутренняя инфраструктура Puppet перенесена на Puppet 6 и настроена, пришло время переключить на нее вторую инфраструктуру.

Вчера я перенес нашу вторую инфраструктуру и начал видеть больше проблем. Эмпирические правила из прошлого поста были полезны, но мне все еще нужно было обновить доступную память, чтобы компенсировать нехватку вычислительной мощности (вероятно, это связано с базовыми виртуальными процессорами, регулирующими IaaS).

А затем произошел сбой кукольного сервера с превышением предела накладных расходов GC ошибка. Эта ошибка возникает, когда процессор тратит более 98% времени на сборку мусора.

Посмотрев на нашу панель управления Grafana, я понял, что у нас нет показателей по сбору мусора, поэтому я добавил график с двумя показателями:

  • среднее время на GC: среднее время, затрачиваемое на выполнение каждого запроса на сборку мусора, рассчитываемое как скорость более 1 минуты (поскольку jvm_gc_collection_seconds_sum является накопительным счетчиком)
  • Время GC: процент времени, затраченного процессорами на выполнение GC, более 1 минуты (поскольку jvm_gc_collection_seconds_count также является накопительным счетчиком)

Формулы следующие:

  • время на запрос {{gc}} : rate(jvm_gc_collection_seconds_sum{job="puppetserver"}[1m])/rate(jvm_gc_collection_seconds_count{job="puppetserver"}[1m])
  • оценить {{gc}} : оценить(jvm_gc_collection_seconds_sum{job="puppetserver"}[1m])

Затем я посмотрел на графики примерно в то время, когда превышен предел накладных расходов GC произошла ошибка:

Да, у меня действительно была проблема. Я перезапустил кукольные серверы, и с тех пор этого не происходило. Тем не менее, ставки на PS MarkSweep по-прежнему остаются довольно высокими. Вот последние 15 минут, пока я пишу:

Для сравнения, инфраструктура, которую я обновил на прошлой неделе, работает намного лучше, а показатели GC значительно ниже 10%:

В дополнение к высокой скорости, затрачиваемой на сборку мусора в потоках PS MarkSweep GC, я также заметил, что среднее время GC для PS MarkSweep тоже довольно велико и составляет от 2 до 3 секунд. Значения немного ниже (чуть меньше 2 секунд) в моей первой инфраструктуре.

В общем, похоже, что во всем виновата сборка мусора PS MarkSweep. Это, как правило, требует много ресурсов процессора в течение длительных периодов времени.

Хорошей новостью является то, что PS MarkSweep – это устаревший сборщик мусора , и избавиться от него не так уж сложно, поскольку OpenJDK 11 по умолчанию заменяет его сборщиком мусора молодого поколения G1 .

В официальном образе Docker puppet server устанавливается пакет puppet server , который извлекает openjdk-8-jre-headless в качестве зависимости. OpenJDK 11 также официально поддерживается начиная с Puppet 6.6, но пакет не позволяет устанавливать его вместо OpenJDK 8. Итак, сейчас я просто создам образ и установлю openjdk-11-jre-headless в дополнение к OpenJDK8, и пусть Ubuntu автоматически обновит альтернативу для Java.

На следующем графике показана разница во времени GC между PS MarkSweep и G1 после обновления до OpenJDK 11:

И вот как выглядит GC после хорошей разминки:

От 2 секунд до 80 мс, это большое улучшение, если вы спросите меня!

Оригинал: “https://dev.to/camptocamp-ops/taming-puppetserver-6-pt-ii-garbage-collection-2oh2”