Как получить время эпохи с помощью trace-cmd (фронтенд для ftrace)?

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

  <...>-32578 [001] **133767.868869**: kfree:            call_site=ffffffff810e6f06 ptr=(nil)

Как сделать так, чтобы trace-cmd отображал время в формате эпохи? По умолчанию, как я думаю, это время с момента запуска приложения. Это необходимо для точного определения времени события.

trace-cmd list -O также не помогает.

Время 133767.868869 в этом случае – это время с момента запуска процессора (при условии, что вы не изменили значение файла, который обычно монтируется в /sys/kernel/debug/tracing/trace_clock). Вопрос в том, насколько точное время вам нужно для точного времени события. Если, например, точность до секунды вас устраивает, то вы можете просто добавить результат вывода

  date | cat > /dev/null # Убедитесь, что программы находятся в кэше
  set -- $(date +%s.%N) $(cat /proc/uptime)
  echo "$1-$2" | bc

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

Если вам нужна большая точность, то вам, вероятно, следует сделать что-то вроде

  echo global > /sys/kernel/debug/tracing/trace_clock # Только один раз
  date +"Time=%s.%N" > /sys/kernel/debug/tracing/trace_marker

несколько раз и сравнить сообщения Time= с временными метками, чтобы получить оценку того, насколько значения сдвинуты и насколько велика их изменчивость.

Как только вы узнаете величину корректировки, вы можете выполнить однократный расчет, чтобы узнать, когда произошло конкретное событие, или вы можете написать сценарий на awk, perl, python или другом языке, чтобы скорректировать столбец в выводе.

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

Конечно, давайте рассмотрим, как можно преобразовать время, отображаемое в trace-cmd, в Unix Epoch Time, чтобы точно определить момент события с примера. По умолчанию trace-cmd показывает время с момента загрузки процессора, и, если необходимо точное время события, можно использовать несколько методов для корректировки этого значения до Epoch Time.

Шаги для конверсии времени из trace-cmd в Epoch Time

  1. Выяснить момент загрузки системы:
    Чтобы преобразовать показания trace-cmd в Unix Epoch Time, вам сначала нужно определить точное время загрузки системы. Используйте следующую команду:

    set -- $(date +%s.%N) $(cat /proc/uptime)
    echo "$1-$2" | bc

    Это вычислит время загрузки системы в виде Unix Epoch Time. Убедитесь, что системные часы настроены правильно.

  2. Настроить отсчёт времени в ftrace:
    Вы можете переключить использующееся trace-cmd время таким образом, чтобы оно основываться на глобальных системных часах. Для этого выполните:

    echo global > /sys/kernel/debug/tracing/trace_clock

    Это переключит часы трассировки на использование системы стандартных времени.

  3. Проверка точности времени:
    Для достижения большей точности вам необходимо несколько раз записать актуальное время в трассировочный маркер и сопоставить полученные значения с временными метками:

    date +"Time=%s.%N" > /sys/kernel/debug/tracing/trace_marker

    Сравните полученные значения Time= с временными отметками в отслеживании, чтобы определить величину смещения и возможную изменчивость.

  4. Коррекция временных меток:
    Зная точное смещение, вы можете либо вручную рассчитать момент конкретного события, либо написать скрипт на Awk, Python или другом языке, чтобы автоматизировать корректировку времени в выводе trace-cmd.

  5. Создание сценария для автоматизации:
    Если подобные преобразования нужно делать регулярно, можно написать скрипт на языке, удобном для вас, который бы осуществлял все вышеописанные действия в автоматическом режиме, преобразуя время из вывода trace-cmd в Unix Epoch Time.

Эти шаги помогут вам достичь необходимой точности в отслеживании событий, учитывая фактор смещения и изменчивости в отчёте временных меток trace-cmd. Надеюсь, это решение будет полезным в вашей работе с системной трассировкой.

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

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