Руководство пользователя инструментов измерения
Измеряйте поведение 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. Используйте их отдельно для ответа на конкретный вопрос измерения.
| Компонент | Описываемая версия | Основной вопрос |
|---|---|---|
| CPUJitter | 3.2.2 | Какова длительность интервалов между соседними чтениями счётчика на выбранном CPU? |
| MEMjitter | 3.5.2 | Сколько занимают обращения к резидентной памяти, первые записи или успешные вызовы mmap? |
| IRQjitter | 1.3.0 | Какие наблюдаемые обработчики и ожидания IRQ/softirq имеют большую длительность? |
| Машиночитаемый поток | jitter.stream/0.6.0 | Как записываются измерения, покрытие, качество и очистка ресурсов? |
./cpujitter --version
./memjitter --version
./irqjitter --version
Примеры ниже выполняются из распакованного бинарного дистрибутива. После сборки из исходного кода те же файлы находятся в ./bin/. Если они установлены в PATH, опустите префикс ./. Номера CPU приведены для примера, а не как рекомендация промышленного размещения. Замените их разрешёнными активными идентификаторами CPU Linux на своём сервере.
grep -E "Cpus_allowed_list|Mems_allowed_list" /proc/self/status
cat /sys/devices/system/cpu/online
./cpujitter -c 4 --duration 10
./memjitter -c 4 --duration 10
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
./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. |
--json | JSON 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. Повторные параметры отклоняются.
./cpujitter -c4 -n0.1 --duration 5
./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 и доступ к счётчику; неподдерживаемые счётчики отклоняются, а не заменяются без уведомления.
./cpujitter -c 4 -n 1 --duration 30
./cpujitter -c 4 -n 1 --duration 30 --counter-read relaxed
./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|relaxed | ordered. Сравнивайте одинаковые контексты чтения счётчика. |
--batch-records N | 4096; 1..65536. Предварительно выделенная ёмкость пакета последовательных чтений. |
--buffer-bytes N | 8388608; 16384..8388608. Ограниченная очередь stdout. |
--write-timeout-ms N | 1000; 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-touch | mem_first_touch_ns | Одна volatile-запись байта по нетронутому смещению в проверенной эпохе отображения/сброса. |
| alloc | mem_alloc_call_ns | Один успешный вызов API mmap для приватной анонимной памяти; без обращения к страницам и munmap внутри измеряемого интервала. |
Чтение и чтение/изменение/запись резидентной памяти
По умолчанию: resident, read, sequential, отображение 16777216 байт (16 MiB), шаг размером в системную страницу, смещение 0 и seed 1. Подготовка обращается к каждой базовой странице, прогревает план доступа и проверяет начальную резидентность через mincore. Без явной блокировки этот снимок не гарантирует дальнейшую резидентность.
./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
./memjitter -c 4 --mode first-touch --reset madvise \
--pattern permutation --seed 1 --duration 30
First-touch разрешает sequential или permutation без повторного выбора внутри эпохи. write является единственной операцией и не требует указания. После каждого успешного повторного отображения/отбрасывания mincore должен подтвердить отсутствие резидентных страниц перед началом новой эпохи. Работа сброса относится к исключённому служебному времени. Первая запись байта не обязательно соответствует отдельной ошибке страницы или выделению физической страницы, особенно если THP покрывает несколько смещений. Remap и madvise являются разными экспериментами.
Вызовы API выделения памяти
./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 и автоматическое создание давления на память в этом режиме не реализованы.
Параметры размещения и режима
| Параметр | Значения и ограничения |
|---|---|
--mode | resident | first-touch | alloc; по умолчанию resident. |
--operation | resident: 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. |
--pattern | Resident: 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 | Используйте точную метрику выбранного режима; в окнах применяется строгое сравнение >. |
./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. Инструмент не перенастраивает систему, не увеличивает лимиты блокировки, не меняет пул огромных страниц и не повторяет запрос с более слабой политикой. Явный неподдерживаемый запрос завершается с указанием причины.
| Политика | resident | first-touch | alloc |
|---|---|---|---|
--lock none | По умолчанию | По умолчанию | Разрешено |
--lock resident | mlock перед подготовкой | Отклоняется | Отклоняется |
--lock onfault | mlock2 с последующей подготовкой резидентной памяти | Только с --reset remap | Отклоняется |
--thp system | По умолчанию, без рекомендации | По умолчанию, без рекомендации | Разрешено |
--thp never или --thp prefer | MADV_NOHUGEPAGE / MADV_HUGEPAGE | Разрешено, применяется повторно после remap | Отклоняется |
--numa-node N | MPOL_BIND в пределах диапазона | MPOL_BIND в пределах диапазона | Отклоняется |
--hugetlb-bytes N | Явное отображение HugeTLB | Отклоняется | Отклоняется |
./memjitter -c 4 --bytes 65536 --lock resident --duration 10
./memjitter -c 4 --mode first-touch --lock onfault \
--reset remap --bytes 65536 --duration 10
./memjitter -c 4 --thp never --duration 10
./memjitter -c 4 --thp prefer --duration 10
./memjitter -c 4 --numa-node 0 --duration 10
./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 и не включает альтернативный механизм сбора.
grep " tracefs " /proc/mounts
sudo ./irqjitter -c 1 --tracefs /sys/kernel/tracing --duration 15
CPU сборщика и наблюдаемые CPU
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, номером и именем источника. Счётчики описывают завершённые наблюдения обработчиков, а не физические прерывания или пакеты. Одинаковые пары номера/имени источника не доказывают постоянство устройства после перенастройки. Нулевое время может отражать разрешение текстовых временных меток трассировки, обычно микросекундное, а не нулевое физическое время.
Обзор, детали и необработанные события
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
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
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 N | 256 для окон, 4096 для raw; диапазон 1..4096. |
--window-memory-mib N | 64; 1..512. Максимум памяти окон. |
--buffer-kb N | 256 на каждый возможный CPU; 16..16384. |
--max-trace-mib N | 256; 1..4096. Консервативный общий бюджет буферов трассировки ядра, а не всей памяти процесса. |
--output-bytes N | 8388608; 65536..8388608. Ограниченная очередь вывода. |
--write-timeout-ms N | 1000; 1..60000. Кооперативный срок вывода. |
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. |
| LOSS | seen означает, что наблюдалось уведомление о потерях; флаг сохраняется. Дефис означает отсутствие наблюдаемого уведомления, а не доказанную полноту. |
| QUALITY | Сохранённая классификация качества данных. partial может описывать неквалифицированные средства измерения. |
| PART | yes означает, что последнее статистическое окно короче запрошенной ширины. Независимо от QUALITY. |
Временной порог добавляет суффикс вроде >5000=N, где N означает число значений строго выше предела. Пустая совокупность имеет COUNT=0 и статистики NA, а не нулевую latency. IRQ --details добавляет METRIC, SOURCE, UNIT и специфичные для NAPI поля BUDGET_MAX, AT_BUDGET и OVER_BUDGET; неприменимые значения равны NA.
Столбцы обзора IRQ
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 | Завершённые образцы, отклонённые после публикации их окна. Неизвестные количества остаются неизвестными. |
| BUFFER | not-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 '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.
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.jsonREADME.mddocs/BINARY_README.mdscripts/run-tests.pyscripts/static_release.pyvalidation/qualification.json
S2. Разбор командной строки и проверка
tools/cpujitter/src/cli.rstools/memjitter/src/cli.rstools/irqjitter/src/cli.rsvendor/jitter-common/src/interval.rsdocs/CLI_TRACEFS.md
S3. Захват CPU, часы и размещение
tools/cpujitter/src/counter.rstools/cpujitter/src/model.rstools/cpujitter/src/runtime.rsvendor/jitter-common/src/observed_placement.rsdocs/CPUJITTER.mddocs/LAUNCH.md
S4. Операции с резидентной памятью
tools/memjitter/src/resident.rstools/memjitter/src/counter.rstools/memjitter/src/runtime.rsdocs/MEMJITTER.md
S5. Режимы first-touch и выделения памяти
tools/memjitter/src/first_touch.rstools/memjitter/src/first_touch_runtime.rstools/memjitter/src/alloc.rstools/memjitter/src/alloc_runtime.rstools/memjitter/native/allocation.cdocs/FIRST_TOUCH.mddocs/ALLOC.md
S6. Явные политики памяти для отдельных отображений
tools/memjitter/src/policy.rstools/memjitter/native/policy.cdocs/MEMORY_POLICIES.md
S7. Пассивный сбор IRQ и жизненный цикл tracefs
tools/irqjitter/src/engine.rstools/irqjitter/src/parser.rstools/irqjitter/src/runtime.rstools/irqjitter/src/session.rstools/irqjitter/src/native.rsdocs/IRQJITTER.mddocs/CLI_TRACEFS.md
S8. Окна IRQ, обзор и NAPI
tools/irqjitter/src/windows.rsvendor/jitter-common/src/irq_overview.rsdocs/IRQ_OVERVIEW.mddocs/IRQ_WINDOWS_NAPI.md
S9. Вывод, гистограммы, сводка и схема потока
vendor/jitter-common/src/compact.rsvendor/jitter-common/src/run_summary.rsvendor/jitter-common/src/histogram.rsvendor/jitter-common/src/record.rsvendor/jitter-common/src/lifecycle.rsdocs/OUTPUT.mdcontracts/stream/schemas/stream.schema.jsoncontracts/stream/contracts/metrics.json