Статьи

Использование jstat для создания отчетов о пользовательских наборах метрик JVM


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

Первое, что нам нужно сделать, это предоставить собственный дескриптор с возможными 
 опциями
JStat . Этот дескриптор представляет собой просто текстовый файл, содержащий то, что мы будем называть «языком спецификации jstat». Чтобы сделать этот пользовательский файл доступным для JStat, мы должны поместить его по следующему пути: 
$ HOME / .jvmstat / jstat_options

Если вы хотите просмотреть связанные параметры, обратитесь к 
файлу в репозитории OpenJDK .

Язык спецификации очень похож на файлы json и содержит группу 
 элементов
option . Каждый параметр должен представлять угрозу в виде набора столбцов, которые могут быть показаны в одном исполнении jstat. Просто назовите некоторые из предопределенных опций:
gcnew,  
gccause  или 
printcompilation .

Каждый 
 элемент
option состоит из нескольких 
 сегментов
столбца . Я думаю, что совершенно очевидно, что означает столбец 🙂 И что самое важное в этом дескрипторе — это просто 
 спецификация
столбца .

Каждый столбец должен содержать как минимум два узла: 
заголовок  и 
данные
Заголовок  используется для описания столбца и может быть выровнен с помощью специального символа 
^,  который я назову «захват». Сцепление означает, что он прикрепляет заголовок с определенной стороны столбца, поэтому:

  • ^ Имя  будет выровнено по левому краю,
  • ^ Имя ^  будет в центре,
  • Имя ^  будет выровнено вправо.

Следующий важный узел — 
 столбец
данных . Он использует 
 метрики
PerfCounter и способен выполнять некоторые основные арифметические операции — такие как сложение, минус, деление и умножение, а также использовать скобки для группировки операций. Вы также можете группировать. Если вы хотите увидеть все метрики, доступные через этот механизм, просто можете вызвать

$ jcmd <PID> PerfCounter.print

и увидеть выходные значения.

Пример минимального содержимого файла может быть таким:

option customgc {
  column {
    header "Tenuring"
    data sun.gc.policy.tenuringThreshold
  }
}

Когда мы
вызовем
его, используя
$ jstat -customgc <PID> 1s 3,

мы увидим что-то вроде:

Tenuring
6
4
5

Мы также можем использовать операции, чтобы показать, например, совместное использование молодым поколением:

option customgc {
  column {
    header "YoungC"
    data sun.gc.generation.0.space.0.used + sun.gc.generation.0.space.1.used + sun.gc.generation.0.space.2.used
  }
}

Есть также четыре дополнительных столбца, которые используются для настройки макета нашего столбца.

  1. Во-первых, для настройки выравнивания. Мы можем выбрать, хотим ли мы выровнять наши данные влево, по центру или справа, установив   элемент выравнивания в одно из указанных выше значений. 
  2. В случае числовых метрик мы можем указать строку, используемую в качестве ввода DecimalFormat, введя ее в   узел форматирования .
  3. Мы также можем указать размер столбца, добавив   элемент width определенной длины.
  4. Последнее, но не менее важное — это масштабируемость. Поскольку большинство метрик содержат только необработанный вывод JVM, нам нужно немного его преобразовать, чтобы сделать его полезным для человеческого глаза. Это может быть сделано с использованием   атрибута scale, установленного в одно из следующих значений (столбец токена).

    знак фактор по убыванию
    сырье 1 без масштабирования
    процент 1/100 конвертировать в проценты
    К 1024 кило
    M 1024 * 1024 мега
    грамм 1024 * 1024 * 1024 гига
    N 10 ^ -9 нано
    U 10 ^ -6 микро
    м 10 ^ -3 Милли
    нас 10 ^ -6 микросекунд
    Миз 10 ^ -3 миллисекунды
    s 1 секунд
    мин 1/60 минут
    час 1/3600 час

Теперь давайте посмотрим на отработанный пример, который покажет, как мы можем использовать дополнительные свойства:

option customgc {
  column {
    header "YoungC^"
    data sun.gc.generation.0.space.0.used + sun.gc.generation.0.space.1.used + sun.gc.generation.0.space.2.used
    align right
    scale M
    width 7
    format "0.0"
  }
  column {
    header "OldC^"
    data sun.gc.generation.1.space.0.used
    align right
    scale M
    width 7
    format "0.0"
  }
}

Который производит 

YoungC    OldC
  67.7   161.0
  37.8   165.4
  92.2   182.8

Конец темы 🙂 Удачи!