Руководство пользователя инструментов измерения

Измеряйте поведение CPU, памяти и IRQ.

Команды, границы измерений, поля вывода и воспроизводимые сравнения для Jitter Tools 1.3.0.

Jitter Tools 1.3.0

Начните здесь

Выберите инструмент, проверьте версию и выполните ограниченное по времени измерение.

Jitter Tools 1.3.0 предоставляет три автономных инструмента командной строки Linux. CPUJitter наблюдает паузы выполнения на одном CPU. MEMjitter измеряет заявленные операции памяти. IRQjitter наблюдает события IRQ и softirq ядра через tracefs. Используйте их отдельно для ответа на конкретный вопрос измерения.

КомпонентОписываемая версияОсновной вопрос
CPUJitter3.2.2Какова длительность интервалов между соседними чтениями счётчика на выбранном CPU?
MEMjitter3.5.2Сколько занимают обращения к резидентной памяти, первые записи или успешные вызовы mmap?
IRQjitter1.3.0Какие наблюдаемые обработчики и ожидания IRQ/softirq имеют большую длительность?
Машиночитаемый потокjitter.stream/0.6.0Как записываются измерения, покрытие, качество и очистка ресурсов?
Из каталога с тремя исполняемыми файлами
./cpujitter --version
./memjitter --version
./irqjitter --version

Примеры ниже выполняются из распакованного бинарного дистрибутива. После сборки из исходного кода те же файлы находятся в ./bin/. Если они установлены в PATH, опустите префикс ./. Номера CPU приведены для примера, а не как рекомендация промышленного размещения. Замените их разрешёнными активными идентификаторами CPU Linux на своём сервере.

Прочитать ограничения CPU и узлов памяти текущего процесса
grep -E "Cpus_allowed_list|Mems_allowed_list" /proc/self/status
cat /sys/devices/system/cpu/online
Интервалы выполнения CPU, одна сводка в секунду
./cpujitter -c 4 --duration 10
Чтение байтов резидентной памяти, одна сводка в секунду
./memjitter -c 4 --duration 10
Обзор IRQ; сборщик работает на CPU 1, наблюдаются все активные CPU
sudo ./irqjitter -c 1 --duration 10

Выполняйте примеры по одному. Тесты CPU и памяти создают активную нагрузку. IRQjitter пассивен в том смысле, что не генерирует тестовый трафик, но трассировка и сбор всё равно имеют накладные расходы. CPU/MEM не требуют root, отключения SMT, изоляции CPU, эксклюзивного CPU или HFTKernel. Сбор IRQ требует доступа к существующей точке монтирования tracefs и права создания собственного экземпляра; sudo является одним из способов предоставить эти права.

Jitter Tools 1.3.0

Сборка и проверка

Разделяйте проверки сборки из исходного кода и бинарного дистрибутива.

Предоставленный архив 1.3.0 содержит только исходный код, без готовых к запуску ELF-файлов. Зафиксированная квалификация не подтверждает завершённую сборку Rust или реальный запуск IRQ. Поддерживаемая точка входа для исходного кода: test.sh; она собирает и тестирует перед публикацией бинарных файлов.

Требование сборкиНазначение
Linux GNU, x86_64 или aarch64Собирайте нативно для архитектуры сервера.
Rust 1.85 или новее, rustfmt и clippyКомпилятор и проверки качества Rust.
Компилятор C, ar, файлы разработки статической libc, readelfНативный код ABI, статическая линковка GNU и проверки ELF.
Python 3.10 или новее и зависимости тестовТесты исходного кода и организация сборки. Итоговые исполняемые инструменты измерения не требуют Python.
Поддерживаемая точка входа для сборки и тестирования исходного кода
cd jitter-tools-1.3.0
./test.sh

Cargo работает без сети с зафиксированным набором зависимостей и без зависимостей реестра. Зависимости тестов Python могут устанавливаться в локальную для проекта .test-env/. Используйте --offline, если среда уже подготовлена и загрузки из индекса пакетов нужно отключить.

Приёмочная проверка исходного кода с уже доступными зависимостями
./test.sh --offline --acceptance

После прохождения всех обязательных проверок процесс публикует bin/cpujitter, bin/memjitter, bin/irqjitter, bin/build-ok.json и версионированный архив статического релиза. В публичных ссылках используется каноническое имя jitter-tools-1.3.0.tgz. Комплект релиза включает BUILD.json, ELF.json, контрольные суммы, уведомления и документацию. Не считайте частично завершённую сборку квалифицированным статическим дистрибутивом.

В распакованном бинарном дистрибутиве test.sh проверяет поставленные файлы
./test.sh
./cpujitter --build-info
./memjitter --build-info
./irqjitter --build-info

Бинарный test.sh требует sh, readelf, sha256sum и grep. Это не средство сборки исходного кода. Статические исполняемые файлы GNU не требуют Rust, Python, интерпретатора ELF или соседних разделяемых библиотек во время работы. Им всё же нужны совместимое по архитектуре ядро Linux, необходимые системные вызовы, /proc и /sys; IRQjitter дополнительно требует tracefs. Проверки ELF подтверждают упаковку, а не гарантируют точность измерений или поддержку каждой версии ядра.

Jitter Tools 1.3.0

Общие параметры

Выберите CPU, задайте ограничение запуска и выберите оконный или необработанный вывод.

ПараметрПоведение
-c CPUОбязателен для всех измерений. Один десятичный идентификатор CPU Linux, 0..65535. Списки и диапазоны здесь не принимаются. Автоматического выбора другого CPU нет.
-n SECШирина окна и интервал сводок; по умолчанию 1 секунда, диапазон 0.001..86400. Не задаёт частоту выборки.
--duration SECКонечная длительность наблюдения, 0.001..86400 секунд. Подготовка и калибровка CPU/MEM предшествуют наблюдению.
--samples NТолько CPU/MEM. Остановиться после положительного числа завершённых наблюдений. У IRQjitter нет параметра --samples.
--jsonJSON Lines. Сохраняет секундные окна по умолчанию, если не указан также --raw.
--rawОтдельные наблюдения с полными записями протокола. Нельзя сочетать с -n или параметрами только для окон.
--help, --version, --build-infoЗапускайте каждый информационный параметр отдельно. Не нужны -c, калибровка или измерение.

CPU/MEM также принимают --cpu и --interval. IRQjitter 1.3.0 использует для этих настроек только -c и -n. Все три принимают присоединённые короткие значения, например -c4 -n0.1. Используйте обычные десятичные секунды, например 0.1, а не 100ms, 1e-1 или .1. Повторные параметры отклоняются.

Статистические окна 100 ms; цикл захвата продолжается между сводками
./cpujitter -c4 -n0.1 --duration 5
Ограниченный необработанный захват; без параметра -n
./cpujitter -c 4 --raw --json --samples 1000 > cpu-raw.jsonl 2> cpu-raw.stderr.log

Данные направляются в stdout, диагностика в stderr. Перенаправление stdout не выбирает режим JSON или raw. Для остановки используйте конечную длительность или Ctrl+C. Обработанный SIGINT/SIGTERM выдаёт конечные записи, если канал вывода доступен и очистка успешна. Заблокированный системный вызов, SIGKILL, отказ сервера или закрытый канал исключают гарантию немедленной остановки и полного конечного вывода.

Jitter Tools 1.3.0

CPUJitter

Измеряйте соседние интервалы выполнения на одном выбранном CPU.

Метрика cpu_iteration_elapsed_ns представляет откалиброванное время между соседними чтениями аппаратного счётчика внутри пакета захвата. Она включает ветвление цикла, сохранение временных меток и расходы чтения счётчика. Это не число тактов ядра CPU, не измерение доставки прерывания устройства и не прямое определение причины паузы.

ordered является режимом чтения счётчика по умолчанию; relaxed является явной альтернативой с отдельным контекстом. Калибровка использует семь сегментов не короче 50 ms относительно CLOCK_MONOTONIC_RAW с фиксированным масштабом на весь запуск. Базовое значение и стоимость счётчика не вычитаются. На x86 требуется заявленная поддержка invariant-TSC и доступ к счётчику; неподдерживаемые счётчики отклоняются, а не заменяются без уведомления.

Выполняйте ordered и relaxed отдельно; не объединяйте их распределения
./cpujitter -c 4 -n 1 --duration 30
./cpujitter -c 4 -n 1 --duration 30 --counter-read relaxed
Подсчёт интервалов строго больше 5 микросекунд без фильтрации образцов
./cpujitter -c 4 -n 1 --duration 30 \
  --threshold cpu_iteration_elapsed_ns=5000
Сохранение окон, метаданных и состояния завершения
./cpujitter -c 4 --duration 30 --json > cpu.jsonl 2> cpu.stderr.log
Параметр CPU или захватаЗначение по умолчанию и диапазон
--counter-read ordered|relaxedordered. Сравнивайте одинаковые контексты чтения счётчика.
--batch-records N4096; 1..65536. Предварительно выделенная ёмкость пакета последовательных чтений.
--buffer-bytes N8388608; 16384..8388608. Ограниченная очередь stdout.
--write-timeout-ms N1000; 1..60000. Кооперативный срок вывода, а не жёсткая гарантия реального времени.
--threshold cpu_iteration_elapsed_ns=NНеотрицательные целые наносекунды. Подсчитывает значения > N в окнах.

Пакет содержит начальную временную метку и завершённые наблюдения. Захват отделён от временных опор, проверки, агрегации и вывода. Кооперативный бюджет счётчика проверяет примерно 20 ms работы захвата каждые 256 записей; он не обрезает большую наблюдаемую задержку. ACTIVE% описывает покрытую часть захвата, а не общую загрузку CPU. Паузы вне захвата этой метрикой не наблюдаются.

Наносекунды вычисляются проверенной целочисленной арифметикой с округлением к ближайшему: (delta_ticks * 1000000000 + hz / 2) / hz. Временные метки событий для назначения окна используют ограниченное опорными точками отображение счётчика в MONOTONIC. Значение и сопоставленный интервал начала/окончания служат разным целям и не обязаны численно совпадать. Неизвестная физическая точность остаётся null в потоке.

Jitter Tools 1.3.0

MEMjitter

Выберите обращения к резидентной памяти, first-touch или latency вызова mmap.

РежимМетрикаИзмеряемая операция
resident, по умолчаниюmem_resident_operation_nsОдно чтение байта, неатомарное чтение/изменение/запись или шаг цепочки указателей.
first-touchmem_first_touch_nsОдна volatile-запись байта по нетронутому смещению в проверенной эпохе отображения/сброса.
allocmem_alloc_call_nsОдин успешный вызов API mmap для приватной анонимной памяти; без обращения к страницам и munmap внутри измеряемого интервала.

Чтение и чтение/изменение/запись резидентной памяти

По умолчанию: resident, read, sequential, отображение 16777216 байт (16 MiB), шаг размером в системную страницу, смещение 0 и seed 1. Подготовка обращается к каждой базовой странице, прогревает план доступа и проверяет начальную резидентность через mincore. Без явной блокировки этот снимок не гарантирует дальнейшую резидентность.

Отдельные тесты резидентной памяти: чтение по умолчанию и случайный неатомарный байтовый RMW
./memjitter -c 4 --bytes 16777216 --duration 30
./memjitter -c 4 --operation rmw --pattern random --seed 1 --duration 30

read измеряет одну volatile-загрузку байта. rmw измеряет загрузку байта, инкремент с переполнением и запись; операция неатомарна и не измеряет завершение записи, видимое всем CPU. Интервал включает расходы временных меток/барьеров. Результат не является чистой latency DRAM.

Зависимый обход указателей

Зависимая цепочка по выбранным смещениям
./memjitter -c 4 --operation chase --bytes 16777216 \
  --seed 1 --duration 30

--operation chase автоматически выбирает pointer-chase, если шаблон не задан явно. Явный шаблон также должен быть pointer-chase. Другие шаблоны resident: sequential, random с возвращением и permutation. Выбор адреса и учёт находятся вне измеряемой операции. Отображение 16 MiB с шагом в страницу на сервере со страницами 4096 байт имеет 4096 измеряемых позиций, а не 16 MiB данных, читаемых за каждый проход.

Записи first-touch

Свежие отображения со сбросом вне измеряемой записи
./memjitter -c 4 --mode first-touch --reset remap \
  --bytes 16777216 --duration 30
Явное отбрасывание MADV_DONTNEED с воспроизводимым порядком доступа
./memjitter -c 4 --mode first-touch --reset madvise \
  --pattern permutation --seed 1 --duration 30

First-touch разрешает sequential или permutation без повторного выбора внутри эпохи. write является единственной операцией и не требует указания. После каждого успешного повторного отображения/отбрасывания mincore должен подтвердить отсутствие резидентных страниц перед началом новой эпохи. Работа сброса относится к исключённому служебному времени. Первая запись байта не обязательно соответствует отдельной ошибке страницы или выделению физической страницы, особенно если THP покрывает несколько смещений. Remap и madvise являются разными экспериментами.

Вызовы API выделения памяти

Обычная latency вызова mmap; это отдельные запуски
./memjitter -c 4 --mode alloc --bytes 65536 --duration 30
./memjitter -c 4 --mode alloc --operation mmap --samples 65 --json

Alloc создаёт не более одного собственного отображения одновременно и удаляет его до следующего вызова. В гистограмму попадают только успешные интервалы mmap. mmap создаёт виртуальное отображение, а не физически заполняет каждую страницу. Обёртка C ABI/libc и временные метки остаются частью значения. Устаревший alloc-cycle, latency malloc/calloc и автоматическое создание давления на память в этом режиме не реализованы.

Параметры размещения и режима

ПараметрЗначения и ограничения
--moderesident | first-touch | alloc; по умолчанию resident.
--operationresident: read | rmw | chase. first-touch: write. alloc: mmap.
--bytes NДесятичное число байт, кратное странице; по умолчанию 16777216, максимум 1073741824. Не строка с суффиксом MiB.
--stride-bytes NНе меньше страницы ОС, выровнен по странице и делит --bytes; по умолчанию размер системной страницы. Только resident/first-touch.
--offset-bytes NБайтовое смещение внутри измеряемой базовой страницы; по умолчанию 0. Chase также требует выравнивания usize и размещения целиком в странице.
--seed NНенулевое целое; по умолчанию 1. Только resident/first-touch.
--patternResident: sequential | random | permutation | pointer-chase. First-touch: sequential | permutation.
--resetТолько first-touch: remap (по умолчанию) | madvise.
--batch-records, --buffer-bytes, --write-timeout-msТе же значения по умолчанию и ограничения, что у CPUJitter.
--threshold METRIC=NИспользуйте точную метрику выбранного режима; в окнах применяется строгое сравнение >.
Подсчёт значений first-touch свыше 20 микросекунд
./memjitter -c 4 --mode first-touch --duration 30 \
  --threshold mem_first_touch_ns=20000

Alloc отклоняет параметры pattern, stride, offset, seed и reset, даже если значения похожи на значения по умолчанию. Ни один режим памяти не принимает --counter-read из CPUJitter. При сравнении сохраняйте одинаковые operation, pattern, bytes, stride, offset, seed, reset и режим вывода.

Jitter Tools 1.3.0

Политики памяти

Применяйте необязательные политики только к отображению, принадлежащему инструменту.

По умолчанию используются --lock none, --thp system, унаследованная политика NUMA и отсутствие явного запроса HugeTLB. Инструмент не перенастраивает систему, не увеличивает лимиты блокировки, не меняет пул огромных страниц и не повторяет запрос с более слабой политикой. Явный неподдерживаемый запрос завершается с указанием причины.

Политикаresidentfirst-touchalloc
--lock noneПо умолчаниюПо умолчаниюРазрешено
--lock residentmlock перед подготовкойОтклоняетсяОтклоняется
--lock onfaultmlock2 с последующей подготовкой резидентной памятиТолько с --reset remapОтклоняется
--thp systemПо умолчанию, без рекомендацииПо умолчанию, без рекомендацииРазрешено
--thp never или --thp preferMADV_NOHUGEPAGE / MADV_HUGEPAGEРазрешено, применяется повторно после remapОтклоняется
--numa-node NMPOL_BIND в пределах диапазонаMPOL_BIND в пределах диапазонаОтклоняется
--hugetlb-bytes NЯвное отображение HugeTLBОтклоняетсяОтклоняется
Небольшой заблокированный резидентный рабочий набор с учётом RLIMIT_MEMLOCK
./memjitter -c 4 --bytes 65536 --lock resident --duration 10
Блокировка при ошибке страницы с сохранением подготовки first-touch
./memjitter -c 4 --mode first-touch --lock onfault \
  --reset remap --bytes 65536 --duration 10
Отдельные эксперименты с рекомендациями THP, а не глобальная настройка THP
./memjitter -c 4 --thp never --duration 10
./memjitter -c 4 --thp prefer --duration 10
Привязка собственного отображения к разрешённому физическому узлу NUMA
./memjitter -c 4 --numa-node 0 --duration 10
Явные страницы HugeTLB 2 MiB, только если пул и поддержка сервера уже доступны
./memjitter -c 4 --bytes 2097152 \
  --hugetlb-bytes 2097152 --duration 10

Блокировка предотвращает выгрузку отображения в swap, пока удерживается; она не закрепляет данные навсегда в кеше CPU. Успешная рекомендация THP не доказывает использование огромных страниц. Чтение политики NUMA отличается от наблюдаемого физического размещения страниц. Идентификаторы NUMA находятся в диапазоне 0..4095 и должны быть разрешены сервером.

Явный размер HugeTLB должен быть степенью двойки больше базовой страницы ОС, не больше 1 GiB и делить размер отображения. Он несовместим с явной блокировкой и рекомендацией THP, отличной от system. Подготовка resident требует успешного MADV_POPULATE_WRITE для диапазона. Существующий пул, квоты, разрешения и необходимая операция ядра должны поддерживать запрос; перехода к обычным страницам нет.

Запрошенная политика, успешные операции и наблюдаемое состояние отображения записываются отдельно. Начальные наблюдения находятся в meta; конечные наблюдения отображения выводятся в stderr перед unmap. Недоступная информация или информация, которую нельзя отнести к отображению, остаётся null. Снимки proc-файлов и проверки политик добавляют служебную работу, поэтому сравнивайте запуски с одинаковыми политиками.

Jitter Tools 1.3.0

IRQjitter

Наблюдайте длительность обработчиков и ожидания softirq без изменения размещения IRQ.

IRQjitter использует один поток чтения в пользовательском пространстве и собственный экземпляр tracefs. Обязательные точки трассировки IRQ: irq_handler_entry, irq_handler_exit, softirq_raise, softirq_entry и softirq_exit. Экземпляр должен поддерживать часы трассировки mono. Инструмент не монтирует tracefs, не меняет права chmod, привязку IRQ/RSS, не останавливает irqbalance и не включает альтернативный механизм сбора.

Проверить существующее монтирование tracefs; использовать фактическую точку монтирования
grep " tracefs " /proc/mounts
Явный путь монтирования tracefs с одной обзорной строкой в секунду
sudo ./irqjitter -c 1 --tracefs /sys/kernel/tracing --duration 15

CPU сборщика и наблюдаемые CPU

Сборщик на CPU 1; наблюдать только CPU с 4 по 7
sudo ./irqjitter -c 1 --target-cpus 4-7 --duration 30

Без --target-cpus наблюдаются поддерживаемые события на всех активных CPU, включая CPU сборщика. Список вроде 2,4-7 ограничивает сбор, а не только отображение. Активность IRQ за пределами выбранного набора не входит в покрытие. Горячее подключение CPU отслеживается в пределах начального набора возможных CPU, изменения сообщаются вместе с информацией о покрытии.

Три разные временные метрики

МетрикаЧто измеряетИнтерпретация
irq_handler_elapsed_nsОдна согласованная пара входа/выхода обработчика действия на одном CPUВключает промежуточную/вложенную работу; не является latency доставки прерывания от устройства к CPU.
softirq_elapsed_nsОдна согласованная пара входа/выхода вектора softirq на одном CPUНе исключительное время CPU и не время обработки отдельного пакета.
softirq_observed_raise_to_entry_nsОт первого сохранённого наблюдаемого ожидающего raise до следующего входа на данном CPU/вектореНаблюдаемое ожидание, возможно объединённое; не время ожидания отдельного пакета.

Источник IRQ идентифицируется метрикой, фактическим CPU, номером и именем источника. Счётчики описывают завершённые наблюдения обработчиков, а не физические прерывания или пакеты. Одинаковые пары номера/имени источника не доказывают постоянство устройства после перенастройки. Нулевое время может отражать разрешение текстовых временных меток трассировки, обычно микросекундное, а не нулевое физическое время.

Обзор, детали и необработанные события

Отдельные запуски: обзор, компактная таблица по источникам и подробные окна JSON
sudo ./irqjitter -c 1 -n 1 --duration 30
sudo ./irqjitter -c 1 -n 1 --details --duration 30
sudo ./irqjitter -c 1 -n 1 --json --duration 30 > irq.jsonl 2> irq.stderr.log
Короткий необработанный захват для одного наблюдаемого CPU
sudo ./irqjitter -c 1 --target-cpus 4 --raw --json \
  --duration 2 > irq-raw.jsonl 2> irq-raw.stderr.log

--details допустим только для компактных окон и несовместим с --json или --raw. JSON уже сохраняет записи окон по CPU/источникам. В этом релизе нет режима timerlat или механизма eBPF. Реальный TIMER softirq по-прежнему наблюдаем.

Необязательные наблюдения работы/бюджета NAPI

NAPI добавляет наблюдения работы/бюджета в оба компактных представления
sudo ./irqjitter -c 1 --napi --duration 15
sudo ./irqjitter -c 1 --napi --details --duration 15

--napi требует поддерживаемой точки трассировки napi:napi_poll. Метрика: napi_poll_work, единица work, а не наносекунды. Она показывает возвращённый объём работы и бюджет. at_budget требует положительного бюджета и равенства работы бюджету; over_budget требует превышения положительного бюджета. Ни то ни другое само по себе не доказывает наличие очереди пакетов. Длительность NAPI, latency IRQ-to-NAPI и предполагаемый идентификатор аппаратной очереди не предоставляются.

Параметры окон и ресурсов

ПараметрЗначение по умолчанию и диапазон
--threshold NSНеотрицательное целое; применяется только к временным рядам. В отличие от CPU/MEM, имя метрики не указывается.
--lateness SECПо умолчанию min(window / 10, 0.01 секунды). Диапазон 0..window, до девяти дробных знаков. Только для окон.
--max-series N256 для окон, 4096 для raw; диапазон 1..4096.
--window-memory-mib N64; 1..512. Максимум памяти окон.
--buffer-kb N256 на каждый возможный CPU; 16..16384.
--max-trace-mib N256; 1..4096. Консервативный общий бюджет буферов трассировки ядра, а не всей памяти процесса.
--output-bytes N8388608; 65536..8388608. Ограниченная очередь вывода.
--write-timeout-ms N1000; 1..60000. Кооперативный срок вывода.
Наблюдать временные значения свыше 10 микросекунд в выбранном наборе CPU
sudo ./irqjitter -c 1 --target-cpus 4-7 -n 1 \
  --threshold 10000 --duration 30

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

Jitter Tools 1.3.0

Чтение результатов

Разделяйте измеренные значения, покрытие, статистические границы и статус запуска.

Столбцы компактного вывода CPU/MEM

Только расположение столбцов, не результаты измерений
TIME(s) CPU COUNT MIN AVG P99<= P99.9<= MAX ACTIVE% LOSS QUALITY PART
СтолбецЗначение
TIME(s)Конец окна относительно начала наблюдения в секундах, не UTC.
COUNTЧисло принятых наблюдений в строке.
MIN / MAXТочные экстремумы представленных целых значений, в ns для временных метрик. Это не утверждение физической точности.
AVGВыводится с точностью 0.1 ns с целочисленной арифметикой; JSON сохраняет точные сумму/число.
P99<= / P99.9<=Верхние границы соответствующих интервалов гистограммы, ограниченные наблюдаемыми экстремумами. Не точный отсортированный перцентиль и не доверительный интервал.
ACTIVE%Покрытое время измерений, делённое на длительность окна; не загрузка CPU.
LOSSseen означает, что наблюдалось уведомление о потерях; флаг сохраняется. Дефис означает отсутствие наблюдаемого уведомления, а не доказанную полноту.
QUALITYСохранённая классификация качества данных. partial может описывать неквалифицированные средства измерения.
PARTyes означает, что последнее статистическое окно короче запрошенной ширины. Независимо от QUALITY.

Временной порог добавляет суффикс вроде >5000=N, где N означает число значений строго выше предела. Пустая совокупность имеет COUNT=0 и статистики NA, а не нулевую latency. IRQ --details добавляет METRIC, SOURCE, UNIT и специфичные для NAPI поля BUDGET_MAX, AT_BUDGET и OVER_BUDGET; неприменимые значения равны NA.

Столбцы обзора IRQ

Обзор IRQ по умолчанию; --napi добавляет отдельную группу работы/бюджета
TIME(s) IRQ_N IRQ_P99<= IRQ_MAX SOFT_N SOFT_P99<= SOFT_MAX WAIT_N WAIT_P99<= WAIT_MAX PAIR_GAPS LATE BUFFER OTHER PART

IRQ, SOFT и WAIT являются отдельными совокупностями. Каждая объединяет совместимые гистограммы источников по наблюдаемым CPU для данной метрики и окна; перцентили пересчитываются из объединённых счётчиков интервалов, а не усредняются по перцентилям источников.

Диагностический столбецЗначение
PAIR_GAPSЧисло обнаруженных уведомлений о сопоставлении пар. Не число потерянных аппаратных прерываний или пакетов.
LATEЗавершённые образцы, отклонённые после публикации их окна. Неизвестные количества остаются неизвестными.
BUFFERnot-observed, loss-observed или unknown. not-observed не подтверждает отсутствие потерь.
OTHERДругие диагностические уведомления, не счётчики IRQ.
PARTБолее короткое последнее статистическое окно.

Например, softirq_entry_without_observed_raise увеличивает диагностику сопоставления пар. Это не доказывает переполнение кольца трассировки, и корректная последующая длительность входа/выхода может быть сохранена. Статистика буфера и текстовые маркеры потерь могут перекрываться; не складывайте их в выдуманное общее число потерь.

Итоговые сводки запуска

Компактный вывод печатает # SUMMARY, строки # TOTAL и конечный статус после последнего окна, включая последнее неполное окно. Детали CPU/MEM и IRQ суммируют каждый ряд; обзор IRQ формирует отдельные объединённые временные итоги и необязательные итоги работы NAPI. Сводка обзора IRQ содержит MAX_CPU и MAX_SOURCE, сохраняя источник наибольшего наблюдаемого события.

Итоги используют точные количества и суммы полностью выведенных окон, взвешенное среднее, экстремумы и объединённые интервалы гистограмм. Это не средние от средних окон или перцентилей. scope=reported_windows исключает невыведенные и поздние образцы. Источник, связанный с максимумом, идентифицирует наблюдение, а не доказывает первопричину.

JSON Lines для автоматизации

Используйте --json для сохранения метаданных, окон по рядам, причин качества, записей потерь/пропусков и конечной записи end. Используйте --raw --json для отдельных образцов. Текст компактной сводки не добавляется к JSON. Большие целые значения, такие как наносекунды, количества и суммы, являются десятичными строками; разбирайте их как целые, а не числа с плавающей точкой. null означает неизвестность, а не ноль.

Необязательные примеры jq для изучения сохранённого файла JSONL
jq 'select(.type == "meta")' cpu.jsonl
jq 'select(.type == "end") | {execution, exit_code, quality, cleanup}' cpu.jsonl
jq 'select(.type == "window") | {series, stats, coverage}' cpu.jsonl

Конечная запись разделяет execution, качество и cleanup.confirmed. observations_aggregated важно для оконного режима; нулевое observations_emitted не означает отсутствие собранных данных, если значения агрегированы в окна. Сохраняйте полный файл и stderr, а не только выбранные строки окон.

Jitter Tools 1.3.0

Автоматизация и запуски A/B

Сохраняйте полные запуски и код завершения производителя данных.

Код завершенияЗначение
0Полное выполнение/данные в рамках заявленного контракта. Текущие работающие производители обычно сохраняют вместо этого неквалифицированный статус.
2Ошибка CLI, возможностей, выполнения, вывода или очистки. Изучите stderr и доступную конечную запись.
3Частичные или неквалифицированные данные. Возможен функционально завершённый запуск с подтверждённой очисткой.
130Обработанный SIGINT, например Ctrl+C, при успешной очистке.
143Обработанный SIGTERM при успешной очистке.

Это документированные коды инструмента, а не гарантия для каждой оболочки, обёртки тайм-аута или фатального сигнала. Сохраняйте ненулевой статус; не добавляйте || true, чтобы представить результат успешным. Канал, закрытый head, может помешать конечным записям. Поддерживаемый способ ограничения захвата: --samples или --duration.

Пример Bash, сохраняющий вывод, диагностику, идентификацию сборки и код завершения
out="jitter-run-$(date -u +%Y%m%dT%H%M%SZ)"
mkdir "$out"
./cpujitter --build-info > "$out/build-info.json"

if ./cpujitter -c 4 -n 1 --duration 30 --json \
    > "$out/cpu.jsonl" 2> "$out/cpu.stderr.log"; then
    rc=0
else
    rc=$?
fi
printf "%s\n" "$rc" > "$out/exit-code.txt"
printf "Saved %s, exit code %s\n" "$out" "$rc"

case "$rc" in
  0) echo "Completed; inspect the end record." ;;
  3) echo "Partial/unqualified; inspect quality and cleanup before comparing." ;;
  *) echo "Run did not complete normally; inspect diagnostics." >&2 ;;
esac

Сравнивайте сопоставимые запуски

Для сравнения стандартного ядра с HFTKernel используйте одну сборку исполняемого файла, одинаковые роль CPU, режим памяти, operation, pattern, размер, seed, политику reset, явные политики памяти, режим чтения счётчика, пакет, место вывода, размер окна и длительность. Сохраняйте метаданные ядра, топологии и планировщика каждого запуска. Меняйте целевую переменную, не меняя одновременно определение измерения.

Выполняйте каждый эксперимент отдельно. Запуск двух активных инструментов на одном CPU разрешён этим релизом, но запуски будут мешать друг другу и не станут независимыми базовыми измерениями. Отделяйте диагностическую трассировку от основного сравнения A/B, если цель состоит в том, чтобы не добавлять разную нагрузку трассировки только на одной стороне.

Сравнивайте количества, распределения, максимумы, превышения порогов, покрытие и качество совместно. Не усредняйте p99 между запусками или окнами. Компактный итог всего запуска объединяет выведенные гистограммы внутри этого запуска; точный анализ совокупности между запусками требует сохранения совместимых исходных данных. CLI CPU/MEM 3.x и совокупности измерений невзаимозаменяемы со старыми профилями тестирования 2.x, уже опубликованными на сайте HFTKernel.

Jitter Tools 1.3.0

Устранение неполадок

Найдите этап сбоя, не меняя эксперимент без уведомления.

НаблюдениеИнтерпретация и следующая проверка
Нет строки сразу после запускаСначала CPU/MEM выполняют подготовку и калибровку. Затем должно пройти полное окно -n. Более короткий ограниченный запуск выводит последнее неполное окно.
CPU отклонён или ошибка привязкиПроверьте запрошенный идентификатор CPU Linux, активность и разрешения cpuset. Выберите допустимый CPU явно; инструмент не выберет другой без уведомления.
Ошибка доступа к счётчику или калибровкиИзучите диагностику счётчика и часов. CPU/MEM требуют доступных счётчиков конкретной архитектуры; этот CLI не переключается на альтернативные часы.
Код 3 / partial / producer_unqualifiedЧитайте выполнение и очистку как отдельные факты. Сам по себе этот статус не доказывает перегрузку обработки IRQ или плохую настройку ядра.
Нулевые значения IRQ или NAНоль может отражать разрешение временных меток трассировки; NA может означать отсутствие завершённого образца. Ни то ни другое не доказывает отсутствие задержек в системе.
softirq_entry_without_observed_raiseНеполная наблюдаемая ожидающая пара. Проверьте PAIR_GAPS и подробный JSON; не называйте это потерей пакетов или переполнением кольца.
Поздние события или потери буфераСохраняйте свидетельства потерь. Проверьте охват событий, скорость вывода и бюджеты ресурсов. Более короткие окна и raw-вывод могут увеличить нагрузку. Новый запуск с изменёнными настройками является другой конфигурацией.
Не удаётся открыть/создать экземпляр tracefsПроверьте монтирование, разрешения, часы mono и поддерживаемые форматы событий. Программа не монтирует, не выполняет chmod и не захватывает чужой сеанс.
В экземпляре отсутствует record-cmd или record-tgidЭти глобальные кеши необязательны для сборщика. Диагностируйте реально требуемый элемент управления и errno; не меняйте глобальные кеши только ради требований инструмента.
NAPI запрошен, но не поддерживаетсяЗапрос --napi явно завершается ошибкой. Запуск без --napi допустим только как сознательно отдельный эксперимент исключительно с IRQ.
Запрос mlock / NUMA / HugeTLB отклонёнИзучите errno, лимит блокировки, разрешённые узлы, существующий пул огромных страниц и поддержку сервера. Автоматическое повышение прав, создание пула или переход на другую политику не выполняются.
Тайм-аут вывода, EPIPE или отсутствие конечной записиВывод неполон. Сохраните stderr, используйте ограниченные запуски и достаточно быстрое место назначения. Не классифицируйте обрезанный захват как полный.
Ошибка очистки или оставшийся экземплярИзучите cleanup.errors и recovery_required. До действий администратора проверьте указанный собственный экземпляр и отсутствие живого владельца. Не удаляйте экземпляры tracefs рекурсивно.

Штатное завершение IRQ останавливает запись, дочитывает в ограниченных пределах, отключает собственные события, закрывает дескрипторы, удаляет только собственный экземпляр и восстанавливает привязку. Обработанная ошибка остаётся ошибкой, даже если позднейшая очистка освободила ресурсы. При SIGKILL и отказе сервера полное удаление экземпляра не гарантируется.

Ссылки на исходный код

Ссылки на реализацию для указанной версии

Руководство составлено по предоставленному исходному коду Jitter Tools 1.3.0, обработчикам CLI и контрактам измерений. Оно не подтверждает точность реальных измерений времени или совместимость с каждым дистрибутивом. Пути к файлам ниже указаны относительно архива исходного кода.

Архив исходного кода: jitter-tools-1.3.0.tgz
SHA-256: 39f803db80f8e598af67fa93171b0c0ead0c6350d2911bc9368b639cdee746ec

S1. Идентификация релиза и процесс сборки
  • package.json
  • README.md
  • docs/BINARY_README.md
  • scripts/run-tests.py
  • scripts/static_release.py
  • validation/qualification.json
S2. Разбор командной строки и проверка
  • tools/cpujitter/src/cli.rs
  • tools/memjitter/src/cli.rs
  • tools/irqjitter/src/cli.rs
  • vendor/jitter-common/src/interval.rs
  • docs/CLI_TRACEFS.md
S3. Захват CPU, часы и размещение
  • tools/cpujitter/src/counter.rs
  • tools/cpujitter/src/model.rs
  • tools/cpujitter/src/runtime.rs
  • vendor/jitter-common/src/observed_placement.rs
  • docs/CPUJITTER.md
  • docs/LAUNCH.md
S4. Операции с резидентной памятью
  • tools/memjitter/src/resident.rs
  • tools/memjitter/src/counter.rs
  • tools/memjitter/src/runtime.rs
  • docs/MEMJITTER.md
S5. Режимы first-touch и выделения памяти
  • tools/memjitter/src/first_touch.rs
  • tools/memjitter/src/first_touch_runtime.rs
  • tools/memjitter/src/alloc.rs
  • tools/memjitter/src/alloc_runtime.rs
  • tools/memjitter/native/allocation.c
  • docs/FIRST_TOUCH.md
  • docs/ALLOC.md
S6. Явные политики памяти для отдельных отображений
  • tools/memjitter/src/policy.rs
  • tools/memjitter/native/policy.c
  • docs/MEMORY_POLICIES.md
S7. Пассивный сбор IRQ и жизненный цикл tracefs
  • tools/irqjitter/src/engine.rs
  • tools/irqjitter/src/parser.rs
  • tools/irqjitter/src/runtime.rs
  • tools/irqjitter/src/session.rs
  • tools/irqjitter/src/native.rs
  • docs/IRQJITTER.md
  • docs/CLI_TRACEFS.md
S8. Окна IRQ, обзор и NAPI
  • tools/irqjitter/src/windows.rs
  • vendor/jitter-common/src/irq_overview.rs
  • docs/IRQ_OVERVIEW.md
  • docs/IRQ_WINDOWS_NAPI.md
S9. Вывод, гистограммы, сводка и схема потока
  • vendor/jitter-common/src/compact.rs
  • vendor/jitter-common/src/run_summary.rs
  • vendor/jitter-common/src/histogram.rs
  • vendor/jitter-common/src/record.rs
  • vendor/jitter-common/src/lifecycle.rs
  • docs/OUTPUT.md
  • contracts/stream/schemas/stream.schema.json
  • contracts/stream/contracts/metrics.json