Что означает монотонный временной штамп в контексте служб systemd?

Вопрос или проблема

Когда я выполняю следующее

systemctl show --all tomcat

я получаю множество свойств, включая такие, как “ActiveEnterTimestampMonotonic”. Это свойство имеет значение очень большого числа, например, “14786979371795”. Это кажется слишком большим, чтобы быть количеством миллисекунд с начала эпохи (epoch) с тех пор, как служба вошла в активное состояние. Это также кажется слишком малым, чтобы быть наносекундами с начала эпохи, когда служба вошла в активное состояние. Так что же это? Что такое “TimestampMonotonic”?

Описание D-Bus ABI systemd на freedesktop.org описывает метки времени следующим образом:

InactiveExitTimestamp, InactiveExitTimestampMonotonic, ActiveEnterTimestamp, ActiveEnterTimestampMonotonic, ActiveExitTimestamp, ActiveExitTimestampMonotonic, InactiveEnterTimestamp, InactiveEnterTimestampMonotonic содержат 64-битные временные метки в микросекундах (usec) для последних моментов времени, когда юнит покинул неактивное состояние, вошел в активное состояние, вышел из активного состояния или вошел в неактивное состояние. Это моменты времени, когда юнит переходил из неактивного/неудачного → активация, активация → активное, активное → деактивация, и наконец деактивация → неактивное/неудачное. Поля равны 0, если такой переход еще не был зафиксирован на данном загрузке.

Это немного скрыто, но в середине сказано “временные метки в микросекундах”, т.е. микросекунды (μs).

systemd получает свои метки времени из Linux, который предоставляет системную API-функцию с названием clock_gettime() для получения времени от одного из нескольких альтернативных “часов”. Как говорится в его документации, он запрашивает так называемые CLOCK_REALTIME и CLOCK_MONOTONIC.

В руководстве для этой функции говорится (выделение мое):

CLOCK_MONOTONIC
Часы, которые не могут быть установлены и представляют собой монотонное время с
некоторой неопределенной начальной точки
. Эти часы не подвержены
дискретным скачкам в системном времени (например, если системный
администратор вручную изменяет часы), но подвержены
постепенным корректировкам, выполняемым adjtime(3) и NTP.

На моей системе значения, похоже, соответствуют начальной точке, когда система была загружена, но на это, вероятно, не следует полагаться. (Обратите внимание, что в руководстве Linux также говорится о различиях между CLOCK_BOOTTIME и CLOCK_MONOTONIC.)

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


В качестве эмпирического эксперимента я только что перезапустил одну конкретную службу, чтобы обновить временные метки. Значения, которые я получил:

ActiveEnterTimestamp=Вт 2018-07-03 18:37:31 EEST
ActiveEnterTimestampMonotonic=14341647533587

и

ActiveEnterTimestamp=Вт 2018-07-03 19:03:04 EEST
ActiveEnterTimestampMonotonic=14343180833503

Разница составляет 14343180833503 - 14341647533587, или 1533299916, что примерно соответствует тем 25,5 минутам в микросекундах.

В Solaris уже 28 лет существует функция gethrtime(), которая возвращает монотонные наносекунды с момента загрузки.

Ваше число будет соответствовать 4 часам времени работы, и поскольку автор systemd действительно смотрел на Solaris, вероятно, это наносекунды с загрузки.

Проверка:

14786979371795 деленное на миллиард дает 14786.979371795 секунд

14786.979371795 секунд, деленное на 60 секунд, дает 246.4496561965 минут

246.4496561965 минут — это 4.1074942699 часов

Поскольку комментарии указывают на время работы в 172 дня, очевидно, что число — это микросекунды с последней загрузки, если это число основано на монотонных часах из clock_gettime()

Кстати: монотонный счетчик, который считает наносекунды, позволил бы выдержку до 1696 лет с использованием знакового 64-битного числа.

Ответ или решение

Что такое метка времени "monotonic" в systemd?

При работе с системным менеджером systemd, вы можете заметить свойства, такие как ActiveEnterTimestampMonotonic, которые отображают значения, представляющие метки времени. В частности, термин "monotonic" в этом контексте относится к типу часов, которые фиксируют время, прошедшее с момента старта системы и не подвержены изменениям, связанным с корректировкой системного времени.

Пояснение терминологии

  • CLOCK_MONOTONIC – это специфическая метка времени в Linux, которая ведет отсчет времени с некоторого неопределенного начального момента (обычно это время загрузки системы). Данная метка не реагирует на изменения времени, вызванные, например, изменением системного времени администратором. Однако она может корректироваться при использовании NTP (Network Time Protocol).

  • Микросекунды и нано-секунды – в documentation системы указано, что значения меток времени имеют формат 64-битных микросекундных временных отметок. Однако, из-за значений, которые могут достигать большого размера, возникает вопрос, действительно ли это микросекунды, или же могут быть иные единицы измерения, например, нано-секунды.

Как работает monotonic время в systemd

При вызове команды systemctl show --all tomcat, вы получаете как реальное (ActiveEnterTimestamp), так и монотоновное (ActiveEnterTimestampMonotonic) время. Сравнение этих значений позволяет вычислить продолжительность, в течение которой сервис находился в заданном состоянии, и обычно оно происходит в микросекундах. Однако, в некоторых случаях, данные могут интерпретироваться как нано-секунды, особенно в системах, где поддержка этого формата реализована.

Из приведенных вами значений видно, что ActiveEnterTimestampMonotonic может отображать значение, например, 14786979371795. Это значение действительно кажется слишком большим для микросекунд и слишком малым для нано-секунд. Однако, если выполнить следующие вычисления:

  1. Разделите 14786979371795 на миллиард, чтобы получить значение в секундах: 14786.979371795 секунд.
  2. Разделив на 60, вы получите минуты: 246.4496561965 минут, что составляет приблизительно 4.1 часа.

Таким образом, можно предположить, что метки времени действительно могут представлять не микросекунды, а нано-секунды, что соответствует спецификациям системных вызовов в других операционных системах, таких как Solaris.

Заключение

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

Для дальнейшего изучения, вы можете ознакомиться с [документацией по clock_gettime()] (http://man7.org/linux/man-pages/man2/clock_gettime.2.html), которая даст более глубокое понимание работы монотонных часов в Linux.

Оцените материал
Добавить комментарий

Капча загружается...