diff --git a/PROJECT_LOG.md b/PROJECT_LOG.md index bc1571c..7694db2 100644 --- a/PROJECT_LOG.md +++ b/PROJECT_LOG.md @@ -1754,3 +1754,108 @@ Lab050 git add/commit и push/pull/fetch не выполнялись. и ускорение строгой проверки ложных кандидатов на C/500k с сохранением независимости RX и FEC/CRC. До доказанной скорости и свежести не выполнять RF, QPSK, новый видеокодек или перенос SDR на 180 МГц. + +# Запись 040 + +## Дата + +8 сентября 2026 года + +## Тема + +Lab051 — алгоритмическое ускорение потокового BPSK-приёмника на 500 ксимв/с +и проверка свежести JPEG при измеренной стоимости обработки + +## Выполнено + +Перед новой разработкой проверены HEAD, status, diff stat и diff check. +По прямому разрешению текущего задания Lab050 закреплена коммитом +60691a09f193f36983c7174c5252ed0897c559e9: +Lab050: model fresh-frame SDR video stream. +В показанный staged scope вошли девять файлов: код и тесты Lab050, необходимые +изменения прежних модулей, отчёт, журнал, индекс и небольшой receiver_benchmarks.json. +Большой result.json, JPEG-профили и посторонние файлы не добавлялись. Push не выполнялся. + +Lab051 начата от нового HEAD. Аудит прочитал Lab046B/C, Lab047/048/050, +связанные функции Lab043/044/045 и convolutional_fec. Рабочая точка строго +500000 символов/с, Fs=8000000, 16 отсчётов/символ; профиль C 128×96 RGB q25, +1740–1893 байта. Управление ELRS/CRSF и локальная защита остаются отдельно. +Ни один файл protocol в Lab051 не менялся. + +Воспроизведён прежний короткий шумный опыт Lab050: три JPEG, 24 пакета, +seed50050, coded-bit Eb/N0=7 дБ, CFO+10 Гц, фаза0,73 и чередование полярности. +Историческая стоимость 55,157553 с / 0,323745 с IQ =170,373647. +Свежий инструментированный baseline занял49,614327 с, отношение153,251430; +это отдельный замер, с влиянием настольной нагрузки/инструментации. +Обнаружены2374 кандидата:24 valid и2350 false; средние72,967/20,099 мс. + +Главная стоимость ложных кандидатов — timing:41,833 с из47,232 с. +При nominal416 и диапазоне±800 прежняя функция возвращалась к Python-перебору +1601 смещения. Matched filter на ложных кандидатах занимал0,934 с, уточнение2,797 с. +Ранний отказ PHY header уже существовал и не запускал тело/Viterbi/CRC. + +Добавлен отдельный вычислительный адаптер Lab051. Повторно используется внутренняя +часть децимации с точным совпадением отсчётов; пересчитываются новые края. +Общая корреляция уточнения и общий перенос/RRC обслуживают срезы кандидатов. +Сохранены локальный DC и нулевые края. Результат извлечения кэшируется по +уточнённому положению/длине в пределах блока. Timing вычисляет все прежние1601 +смещения через корреляцию и накопленные энергии, без сужения диапазона. +Для неразделимых FFT-пиков и постоянного IQ сохранён исходный выбор первого максимума. + +Viterbi использует предвычисленные четыре пары евклидовых метрик и сравнение +двух ветвей с прежним tie→branch0. K7,R1/2,171/133,tail6,интерливер,CRC и +результаты декодирования сохранены. CFO-оценка прежняя; кэшируются векторы переноса. +Новый порог отсева, GPU, multiprocessing и зависимости не добавлены. +Фиксированный порог кандидатов0.030964473262429237 не изменялся. + +Финальный короткий контроль:24/24 пакета,3/3 JPEG, SHA MATCH; совпали число +кандидатов и все причины отказов. Медиана трёх проходов1,144176 с, +processing/RF3,534193 — ускорение48,21 раза относительно исторической базы. +Средний valid candidate17,7675 мс, false0,187317 мс; false-медиана0,0605 мс. +Полная стоимость с ложными кандидатами/фоном47,674 мс на физический пакет. + +Основной опыт:30 изображений, вход5/с, окно6 с, LATEST_ONLY, MAX_VIDEO_AGE200 мс. +Реально поданы6,044416 с синтетического IQ блоками; receiver не получал TX-границы, +payload или ожидаемый счётчик. Все240/240 пакетов и30/30 JPEG восстановлены точно. +Фактическая стоимость каждого push, сборки и JPEG decode использована в событийной +шкале CPU. Суммарно38,630132 с, processing/RF6,391045,160,959 мс/пакет. +Получены147082 кандидата,12239 новых окон синхронизации и135057 cache hits. +Ни один JPEG не уложился в200 мс: DISPLAYED=FRESH DISPLAYED=0,FRESH DISPLAY FPS=0. +Цель5 свежих/с и минимальная цель>0 НЕ достигнуты. + +Переданы30 изображений, до TX удалено0, после decode по возрасту удалено30. +Возраст декодированных/отброшенных JPEG min/median/max: +276,515/15691,203/31150,009 мс. Это не измерение камеры/экрана: их задержки UNKNOWN. +Capture lookup используется только после независимого JPEG для отчётной метрики; +в прежнем fragment format нет capture timestamp. Live-контроль возраста не доказан. +Видеочередь≤1, однако непрерывный IQ-источник потребовал бы внешнего backlog +2088473848 байт при отставании32,632404 с. Такой буфер не реализован и не скрыт. +REAL-TIME CAPABLE=NO. Поток воспроизводится офлайн с обратным давлением источнику. + +Пик удерживаемого IQ3177728 байт(3,031 МиБ), проверяемый предел3398912 байт. +Инженерная оценка рабочих массивов136,161 МиБ; это не универсальный предел и не RSS. +RSS процесса после потока154,105 МиБ, peak178,004 МиБ, включая Python/генератор/кэши. +Длинный тест4096 блоков(33,554432 с,нулевой фон) не показал роста IQ и децимации: +2653440 и397216 байт после прогрева. RSS156,199–156,250 МиБ. Finish освобождает буферы. +В отдельном replay посчитана нижняя граница наблюдаемых ndarray/владельцев и +tracemalloc peak. Внутренние C-аллокации не объявляются полностью измеренными; +холодные общие массивы могут занимать больше памяти, чем отдельное старое окно. + +Сохранённая Lab047-запись20 ксимв/с повторно разобрана штатным Lab048: +36/36,FEC/CRC PASS,JPEG SHA MATCH,19 ошибок до FEC и0 после. Исходные IQ/JPEG сохранены. +Новый адаптер рассчитан только на500 ксимв/с; аппаратных запусков не было. + +38 целевых тестов PASS. Verifier независимо нашёл два FFT tie-расхождения; +оба исправлены и повторно воспроизведены с совпадением старого результата. +Adversary проверил malformed PHY без body/Viterbi, дубликаты/старые ID, +лимиты объекта, усечение, восстановление подмен и арифметику возраста/backlog. +Таблицы отчёта сверены с JSON. Документ проверен в UTF-8, ссылки существуют. +quick_gate PASS:688 тестов,17 функциональных проверок,13 штатных пропусков. +Полный pytest:688 passed за72,92 с,0 failed; одно предупреждение доступа к .pytest_cache. +git diff --check PASS. Lab051 git add/commit и push не выполнялись; индекс пуст. +RF TX=0; HackRF,180 МГц,QPSK,новый FEC/кодек и аппаратные500 ксимв/с не запускались. + +Следующий этап: STOP. Рекомендуемый Lab052 — отдельное программное исследование +стоимости уникальных фоновых кандидатов в полном режиме5 изображений/с, +с неизменными PHY/FEC/CRC и независимыми положительными/отрицательными регрессиями. +До отдельного разрешения не выполнять RF или аппаратные500 ксимв/с. diff --git a/data/processed/lab051/baseline_profile.json b/data/processed/lab051/baseline_profile.json new file mode 100644 index 0000000..95c3b63 --- /dev/null +++ b/data/processed/lab051/baseline_profile.json @@ -0,0 +1,209 @@ +{ + "benchmark": { + "symbol_rate": 500000, + "samples_per_symbol": 16, + "detection_decimation": 8, + "input_images": 3, + "tx_rf_packets": 24, + "accepted_rf_packets": 24, + "completed_images": 3, + "all_sha_match": true, + "packets_before_finish": 24, + "images_before_finish": 3, + "capture_seconds": 0.323744625, + "payload_airtime_seconds": 0.276768, + "processing_seconds": 49.61432680033613, + "processing_per_rf_second": 153.25143019852803, + "processing_per_payload_airtime_second": 179.26323419013804, + "coarse_seconds": 0.4982285003643483, + "strict_seconds": 49.04027030314319, + "assembly_jpeg_decode_seconds": 0.0013099998468533158, + "processing_seconds_per_rf_packet": 2.067263616680672, + "peak_iq_buffer_samples": 424309, + "iq_buffer_limit_samples": 424864, + "working_arrays_estimate_bytes": 74928288, + "memory_is_process_rss_measurement": false, + "peak_object_payload_bytes": 1821, + "candidate_count": 2374, + "peak_candidates_in_block": 2114, + "rejected_reasons": { + "PHY_HEADER_MAGIC_MISMATCH": 2298, + "TRUNCATED_SYMBOLS": 38, + "TRUNCATED_IQ_WINDOW": 14 + }, + "buffer_release_delay_upper_seconds": 0.052608, + "noisy": true, + "coded_bit_ebn0_db": 7, + "cfo_hz": 10, + "candidate_threshold": 0.030964473262429237, + "completed": [ + { + "image_id": 1, + "sha256": "15723773a8788c9d610c874707ad2d513582322ee1d42009b0b39d3de336e10d", + "bytes": 1740, + "dimensions": [ + 128, + 96 + ], + "first_sample": 4321, + "last_sample": 747682, + "emitted_after_sample": 1025782 + }, + { + "image_id": 2, + "sha256": "66404b14ca9e3a6627871ad9d3b5dd4311915d7820a99dfa182fc3a20fbe9d85", + "bytes": 1790, + "dimensions": [ + 128, + 96 + ], + "first_sample": 747989, + "last_sample": 1491022, + "emitted_after_sample": 1742690 + }, + { + "image_id": 3, + "sha256": "166d33d72820bf3385e0d30823d991b453147c84ca75f788ab8819ad5e3c3ced", + "bytes": 1821, + "dimensions": [ + 128, + 96 + ], + "first_sample": 1491425, + "last_sample": 2234130, + "emitted_after_sample": 2496773 + } + ], + "rf_tx": 0 + }, + "profile": { + "shared_stages": { + "phy_header": { + "calls": 24, + "seconds": 0.0005645002238452435, + "exclusive_seconds": 0.0005645002238452435 + }, + "coarse_localization": { + "calls": 36, + "seconds": 0.4980395002057776, + "exclusive_seconds": 0.4980395002057776 + } + }, + "valid": { + "count": 24, + "mean_seconds": 0.07296675831700365, + "median_seconds": 0.07252859993604943, + "total_seconds": 1.7512021996080875, + "stages": { + "refinement": { + "calls": 24, + "seconds": 0.028973900014534593, + "exclusive_seconds": 0.028973900014534593 + }, + "matched_filter": { + "calls": 48, + "seconds": 0.1906564999371767, + "exclusive_seconds": 0.1906564999371767 + }, + "timing": { + "calls": 48, + "seconds": 0.9146315004909411, + "exclusive_seconds": 0.0007350004743784666 + }, + "timing_fallback": { + "calls": 48, + "seconds": 0.9138965000165626, + "exclusive_seconds": 0.9138965000165626 + }, + "phase_diagnostics": { + "calls": 48, + "seconds": 0.019832400372251868, + "exclusive_seconds": 0.008994300849735737 + }, + "cfo_gain": { + "calls": 48, + "seconds": 0.010838099522516131, + "exclusive_seconds": 0.010838099522516131 + }, + "phy_header": { + "calls": 48, + "seconds": 0.0017112999921664596, + "exclusive_seconds": 0.0017112999921664596 + }, + "body_pipeline": { + "calls": 24, + "seconds": 0.49711450026370585, + "exclusive_seconds": 0.011535500641912222 + }, + "viterbi": { + "calls": 24, + "seconds": 0.4843809995800257, + "exclusive_seconds": 0.4843809995800257 + }, + "crc_parser": { + "calls": 24, + "seconds": 0.0002698999596759677, + "exclusive_seconds": 0.0002698999596759677 + } + } + }, + "false": { + "count": 2350, + "mean_seconds": 0.02009875251049612, + "median_seconds": 0.019996499991975725, + "total_seconds": 47.23206839966588, + "stages": { + "refinement": { + "calls": 2350, + "seconds": 2.7974041998386383, + "exclusive_seconds": 2.7974041998386383 + }, + "matched_filter": { + "calls": 2336, + "seconds": 0.9339654004434124, + "exclusive_seconds": 0.9339654004434124 + }, + "timing": { + "calls": 2336, + "seconds": 41.83316580078099, + "exclusive_seconds": 0.028656100272201 + }, + "timing_fallback": { + "calls": 2336, + "seconds": 41.80450970050879, + "exclusive_seconds": 41.80450970050879 + }, + "phase_diagnostics": { + "calls": 2336, + "seconds": 0.910528302541934, + "exclusive_seconds": 0.4247559007490054 + }, + "cfo_gain": { + "calls": 2336, + "seconds": 0.4857724017929286, + "exclusive_seconds": 0.4857724017929286 + }, + "phy_header": { + "calls": 2298, + "seconds": 0.06713570095598698, + "exclusive_seconds": 0.06713570095598698 + } + } + } + }, + "rf_tx": 0, + "array_observation": { + "valid": { + "observed_array_objects": 14361, + "observed_owned_arrays": 8704, + "observed_owned_bytes_total": 16681890, + "tracemalloc_retained_bytes": 1842, + "tracemalloc_peak_bytes": 4787123, + "array_count_is_lower_bound": true + } + }, + "process_memory_after_profiling": { + "rss_bytes": 156041216, + "peak_rss_bytes": 169754624 + } +} diff --git a/data/processed/lab051/benchmark.json b/data/processed/lab051/benchmark.json new file mode 100644 index 0000000..7793fdb --- /dev/null +++ b/data/processed/lab051/benchmark.json @@ -0,0 +1,419 @@ +{ + "repeats": [ + { + "symbol_rate": 500000, + "samples_per_symbol": 16, + "detection_decimation": 8, + "input_images": 3, + "tx_rf_packets": 24, + "accepted_rf_packets": 24, + "completed_images": 3, + "all_sha_match": true, + "packets_before_finish": 24, + "images_before_finish": 3, + "capture_seconds": 0.323744625, + "payload_airtime_seconds": 0.276768, + "processing_seconds": 1.2077819011174142, + "processing_per_rf_second": 3.7306624044103103, + "processing_per_payload_airtime_second": 4.363878414836304, + "coarse_seconds": 0.0927895000204444, + "strict_seconds": 0.9242713990388438, + "assembly_jpeg_decode_seconds": 0.0011941003613173962, + "processing_seconds_per_rf_packet": 0.05032424587989226, + "peak_iq_buffer_samples": 424309, + "iq_buffer_limit_samples": 424864, + "working_arrays_estimate_bytes": 74928288, + "memory_is_process_rss_measurement": false, + "peak_object_payload_bytes": 1821, + "candidate_count": 2374, + "peak_candidates_in_block": 2114, + "rejected_reasons": { + "PHY_HEADER_MAGIC_MISMATCH": 2298, + "TRUNCATED_SYMBOLS": 38, + "TRUNCATED_IQ_WINDOW": 14 + }, + "buffer_release_delay_upper_seconds": 0.052608, + "noisy": true, + "coded_bit_ebn0_db": 7, + "cfo_hz": 10, + "candidate_threshold": 0.030964473262429237, + "completed": [ + { + "image_id": 1, + "sha256": "15723773a8788c9d610c874707ad2d513582322ee1d42009b0b39d3de336e10d", + "bytes": 1740, + "dimensions": [ + 128, + 96 + ], + "first_sample": 4321, + "last_sample": 747682, + "emitted_after_sample": 1025782 + }, + { + "image_id": 2, + "sha256": "66404b14ca9e3a6627871ad9d3b5dd4311915d7820a99dfa182fc3a20fbe9d85", + "bytes": 1790, + "dimensions": [ + 128, + 96 + ], + "first_sample": 747989, + "last_sample": 1491022, + "emitted_after_sample": 1742690 + }, + { + "image_id": 3, + "sha256": "166d33d72820bf3385e0d30823d991b453147c84ca75f788ab8819ad5e3c3ced", + "bytes": 1821, + "dimensions": [ + 128, + 96 + ], + "first_sample": 1491425, + "last_sample": 2234130, + "emitted_after_sample": 2496773 + } + ], + "rf_tx": 0 + }, + { + "symbol_rate": 500000, + "samples_per_symbol": 16, + "detection_decimation": 8, + "input_images": 3, + "tx_rf_packets": 24, + "accepted_rf_packets": 24, + "completed_images": 3, + "all_sha_match": true, + "packets_before_finish": 24, + "images_before_finish": 3, + "capture_seconds": 0.323744625, + "payload_airtime_seconds": 0.276768, + "processing_seconds": 1.144175999914296, + "processing_per_rf_second": 3.534193038461398, + "processing_per_payload_airtime_second": 4.134061740932101, + "coarse_seconds": 0.08686010027304292, + "strict_seconds": 0.8724833994638175, + "assembly_jpeg_decode_seconds": 0.0011348994448781013, + "processing_seconds_per_rf_packet": 0.047673999996428996, + "peak_iq_buffer_samples": 424309, + "iq_buffer_limit_samples": 424864, + "working_arrays_estimate_bytes": 74928288, + "memory_is_process_rss_measurement": false, + "peak_object_payload_bytes": 1821, + "candidate_count": 2374, + "peak_candidates_in_block": 2114, + "rejected_reasons": { + "PHY_HEADER_MAGIC_MISMATCH": 2298, + "TRUNCATED_SYMBOLS": 38, + "TRUNCATED_IQ_WINDOW": 14 + }, + "buffer_release_delay_upper_seconds": 0.052608, + "noisy": true, + "coded_bit_ebn0_db": 7, + "cfo_hz": 10, + "candidate_threshold": 0.030964473262429237, + "completed": [ + { + "image_id": 1, + "sha256": "15723773a8788c9d610c874707ad2d513582322ee1d42009b0b39d3de336e10d", + "bytes": 1740, + "dimensions": [ + 128, + 96 + ], + "first_sample": 4321, + "last_sample": 747682, + "emitted_after_sample": 1025782 + }, + { + "image_id": 2, + "sha256": "66404b14ca9e3a6627871ad9d3b5dd4311915d7820a99dfa182fc3a20fbe9d85", + "bytes": 1790, + "dimensions": [ + 128, + 96 + ], + "first_sample": 747989, + "last_sample": 1491022, + "emitted_after_sample": 1742690 + }, + { + "image_id": 3, + "sha256": "166d33d72820bf3385e0d30823d991b453147c84ca75f788ab8819ad5e3c3ced", + "bytes": 1821, + "dimensions": [ + 128, + 96 + ], + "first_sample": 1491425, + "last_sample": 2234130, + "emitted_after_sample": 2496773 + } + ], + "rf_tx": 0 + }, + { + "symbol_rate": 500000, + "samples_per_symbol": 16, + "detection_decimation": 8, + "input_images": 3, + "tx_rf_packets": 24, + "accepted_rf_packets": 24, + "completed_images": 3, + "all_sha_match": true, + "packets_before_finish": 24, + "images_before_finish": 3, + "capture_seconds": 0.323744625, + "payload_airtime_seconds": 0.276768, + "processing_seconds": 1.1161368001485243, + "processing_per_rf_second": 3.4475840337071983, + "processing_per_payload_airtime_second": 4.032752341847773, + "coarse_seconds": 0.08814430015627295, + "strict_seconds": 0.841466698795557, + "assembly_jpeg_decode_seconds": 0.0011885995045304298, + "processing_seconds_per_rf_packet": 0.04650570000618851, + "peak_iq_buffer_samples": 424309, + "iq_buffer_limit_samples": 424864, + "working_arrays_estimate_bytes": 74928288, + "memory_is_process_rss_measurement": false, + "peak_object_payload_bytes": 1821, + "candidate_count": 2374, + "peak_candidates_in_block": 2114, + "rejected_reasons": { + "PHY_HEADER_MAGIC_MISMATCH": 2298, + "TRUNCATED_SYMBOLS": 38, + "TRUNCATED_IQ_WINDOW": 14 + }, + "buffer_release_delay_upper_seconds": 0.052608, + "noisy": true, + "coded_bit_ebn0_db": 7, + "cfo_hz": 10, + "candidate_threshold": 0.030964473262429237, + "completed": [ + { + "image_id": 1, + "sha256": "15723773a8788c9d610c874707ad2d513582322ee1d42009b0b39d3de336e10d", + "bytes": 1740, + "dimensions": [ + 128, + 96 + ], + "first_sample": 4321, + "last_sample": 747682, + "emitted_after_sample": 1025782 + }, + { + "image_id": 2, + "sha256": "66404b14ca9e3a6627871ad9d3b5dd4311915d7820a99dfa182fc3a20fbe9d85", + "bytes": 1790, + "dimensions": [ + 128, + 96 + ], + "first_sample": 747989, + "last_sample": 1491022, + "emitted_after_sample": 1742690 + }, + { + "image_id": 3, + "sha256": "166d33d72820bf3385e0d30823d991b453147c84ca75f788ab8819ad5e3c3ced", + "bytes": 1821, + "dimensions": [ + 128, + 96 + ], + "first_sample": 1491425, + "last_sample": 2234130, + "emitted_after_sample": 2496773 + } + ], + "rf_tx": 0 + } + ], + "median_processing_seconds": 1.144175999914296, + "profile": { + "shared_stages": { + "phy_header": { + "calls": 24, + "seconds": 0.00042649987153708935, + "exclusive_seconds": 0.00042649987153708935 + }, + "coarse_localization": { + "calls": 36, + "seconds": 0.08918269968125969, + "exclusive_seconds": 0.08918269968125969 + } + }, + "valid": { + "count": 24, + "mean_seconds": 0.01776749997710188, + "median_seconds": 0.017930250032804906, + "total_seconds": 0.4264199994504452, + "stages": { + "refinement": { + "calls": 24, + "seconds": 0.09387810016050935, + "exclusive_seconds": 0.09387810016050935 + }, + "matched_filter": { + "calls": 48, + "seconds": 0.1028753004502505, + "exclusive_seconds": 0.1028753004502505 + }, + "timing": { + "calls": 48, + "seconds": 0.04353450005874038, + "exclusive_seconds": 0.04353450005874038 + }, + "phase_diagnostics": { + "calls": 48, + "seconds": 0.016765999956987798, + "exclusive_seconds": 0.008323899819515646 + }, + "cfo_gain": { + "calls": 48, + "seconds": 0.008442100137472153, + "exclusive_seconds": 0.008442100137472153 + }, + "phy_header": { + "calls": 48, + "seconds": 0.001451600226573646, + "exclusive_seconds": 0.001451600226573646 + }, + "body_pipeline": { + "calls": 24, + "seconds": 0.14421880000736564, + "exclusive_seconds": 0.011199799599125981 + }, + "viterbi": { + "calls": 24, + "seconds": 0.1321190003072843, + "exclusive_seconds": 0.1321190003072843 + }, + "crc_parser": { + "calls": 24, + "seconds": 0.00021099986042827368, + "exclusive_seconds": 0.00021099986042827368 + } + } + }, + "false": { + "count": 2350, + "mean_seconds": 0.00018731676512695057, + "median_seconds": 6.049999501556158e-05, + "total_seconds": 0.4401943980483338, + "stages": { + "refinement": { + "calls": 2350, + "seconds": 0.11974260024726391, + "exclusive_seconds": 0.11974260024726391 + }, + "matched_filter": { + "calls": 174, + "seconds": 0.026502199470996857, + "exclusive_seconds": 0.026502199470996857 + }, + "timing": { + "calls": 174, + "seconds": 0.13858849939424545, + "exclusive_seconds": 0.13858849939424545 + }, + "phase_diagnostics": { + "calls": 174, + "seconds": 0.05482260056305677, + "exclusive_seconds": 0.028438000474125147 + }, + "cfo_gain": { + "calls": 174, + "seconds": 0.02638460008893162, + "exclusive_seconds": 0.02638460008893162 + }, + "phy_header": { + "calls": 2298, + "seconds": 0.03204370115417987, + "exclusive_seconds": 0.03204370115417987 + } + } + } + }, + "profiled_benchmark": { + "symbol_rate": 500000, + "samples_per_symbol": 16, + "detection_decimation": 8, + "input_images": 3, + "tx_rf_packets": 24, + "accepted_rf_packets": 24, + "completed_images": 3, + "all_sha_match": true, + "packets_before_finish": 24, + "images_before_finish": 3, + "capture_seconds": 0.323744625, + "payload_airtime_seconds": 0.276768, + "processing_seconds": 1.16440529958345, + "processing_per_rf_second": 3.5966783991655458, + "processing_per_payload_airtime_second": 4.207152920798105, + "coarse_seconds": 0.08932610007468611, + "strict_seconds": 0.8848743984708562, + "assembly_jpeg_decode_seconds": 0.0011538001708686352, + "processing_seconds_per_rf_packet": 0.048516887482643746, + "peak_iq_buffer_samples": 424309, + "iq_buffer_limit_samples": 424864, + "working_arrays_estimate_bytes": 74928288, + "memory_is_process_rss_measurement": false, + "peak_object_payload_bytes": 1821, + "candidate_count": 2374, + "peak_candidates_in_block": 2114, + "rejected_reasons": { + "PHY_HEADER_MAGIC_MISMATCH": 2298, + "TRUNCATED_SYMBOLS": 38, + "TRUNCATED_IQ_WINDOW": 14 + }, + "buffer_release_delay_upper_seconds": 0.052608, + "noisy": true, + "coded_bit_ebn0_db": 7, + "cfo_hz": 10, + "candidate_threshold": 0.030964473262429237, + "completed": [ + { + "image_id": 1, + "sha256": "15723773a8788c9d610c874707ad2d513582322ee1d42009b0b39d3de336e10d", + "bytes": 1740, + "dimensions": [ + 128, + 96 + ], + "first_sample": 4321, + "last_sample": 747682, + "emitted_after_sample": 1025782 + }, + { + "image_id": 2, + "sha256": "66404b14ca9e3a6627871ad9d3b5dd4311915d7820a99dfa182fc3a20fbe9d85", + "bytes": 1790, + "dimensions": [ + 128, + 96 + ], + "first_sample": 747989, + "last_sample": 1491022, + "emitted_after_sample": 1742690 + }, + { + "image_id": 3, + "sha256": "166d33d72820bf3385e0d30823d991b453147c84ca75f788ab8819ad5e3c3ced", + "bytes": 1821, + "dimensions": [ + 128, + 96 + ], + "first_sample": 1491425, + "last_sample": 2234130, + "emitted_after_sample": 2496773 + } + ], + "rf_tx": 0 + }, + "rf_tx": 0 +} diff --git a/data/processed/lab051/memory.json b/data/processed/lab051/memory.json new file mode 100644 index 0000000..efd1d17 --- /dev/null +++ b/data/processed/lab051/memory.json @@ -0,0 +1,67 @@ +{ + "blocks": 4096, + "model_seconds": 33.554432, + "background": "zeros; noisy background covered by six-second integration", + "peak_iq_bytes": 3177728, + "iq_limit_bytes": 3398912, + "retained_after_finish": 0, + "checkpoints": [ + { + "block": 512, + "iq_bytes": 2653440, + "decimated_bytes": 397216, + "rss_bytes": 163840000, + "peak_rss_bytes": 186650624 + }, + { + "block": 1024, + "iq_bytes": 2653440, + "decimated_bytes": 397216, + "rss_bytes": 163840000, + "peak_rss_bytes": 186650624 + }, + { + "block": 1536, + "iq_bytes": 2653440, + "decimated_bytes": 397216, + "rss_bytes": 163786752, + "peak_rss_bytes": 186650624 + }, + { + "block": 2048, + "iq_bytes": 2653440, + "decimated_bytes": 397216, + "rss_bytes": 163786752, + "peak_rss_bytes": 186650624 + }, + { + "block": 2560, + "iq_bytes": 2653440, + "decimated_bytes": 397216, + "rss_bytes": 163786752, + "peak_rss_bytes": 186650624 + }, + { + "block": 3072, + "iq_bytes": 2653440, + "decimated_bytes": 397216, + "rss_bytes": 163786752, + "peak_rss_bytes": 186650624 + }, + { + "block": 3584, + "iq_bytes": 2653440, + "decimated_bytes": 397216, + "rss_bytes": 163786752, + "peak_rss_bytes": 186650624 + }, + { + "block": 4096, + "iq_bytes": 2653440, + "decimated_bytes": 397216, + "rss_bytes": 163790848, + "peak_rss_bytes": 186650624 + } + ], + "rf_tx": 0 +} diff --git a/data/processed/lab051/regression20k/result.json b/data/processed/lab051/regression20k/result.json new file mode 100644 index 0000000..ccde643 --- /dev/null +++ b/data/processed/lab051/regression20k/result.json @@ -0,0 +1,198 @@ +{ + "stage": "LAB048_OFFLINE_RECEIVER_PERFORMANCE", + "baseline": { + "capture_seconds": 15.0, + "full_processing_seconds": 37.423910000012256, + "strict_stage_seconds": 32.45996900013415, + "average_strict_candidate_seconds": 0.47043433333527757, + "approximate_peak_bytes": 1545755352 + }, + "optimized": { + "capture_seconds": 15.0, + "full_processing_seconds": 12.978691199910827, + "coarse_search_seconds": 4.4797875001095235, + "strict_stage_seconds": 8.487128499895334, + "average_strict_candidate_seconds": 0.12300186231732368, + "approximate_peak_bytes": 1545755352, + "stage_measurements": { + "cs8_to_complex64": { + "calls": 113, + "cumulative_seconds": 1.306003100471571 + }, + "refine_start": { + "calls": 69, + "cumulative_seconds": 2.930933100869879 + }, + "matched_filter": { + "calls": 105, + "cumulative_seconds": 2.9355400999775156 + }, + "timing": { + "calls": 105, + "cumulative_seconds": 1.2902987005654722 + }, + "cfo_phase_soft": { + "calls": 105, + "cumulative_seconds": 0.039461099775508046 + }, + "phy_header": { + "calls": 105, + "cumulative_seconds": 0.00410620030015707 + }, + "post_preamble_fec_crc": { + "calls": 36, + "cumulative_seconds": 0.6347944003064185 + }, + "viterbi": { + "calls": 36, + "cumulative_seconds": 0.6168836002470925 + } + }, + "memory_arrays": [ + { + "name": "coarse_iq_window", + "dtype": "complex64", + "shape": [ + 16000000 + ], + "bytes": 128000000, + "mib": 122.0703125 + }, + { + "name": "coarse_decimated", + "dtype": "complex64", + "shape": [ + 800000 + ], + "bytes": 6400000, + "mib": 6.103515625 + }, + { + "name": "coarse_downconversion_vector", + "dtype": "complex64", + "shape": [ + 800000 + ], + "bytes": 6400000, + "mib": 6.103515625 + }, + { + "name": "coarse_correlation_scores", + "dtype": "float32", + "shape": [ + 773561 + ], + "bytes": 3094244, + "mib": 2.9509010314941406 + }, + { + "name": "strict_full_iq_window", + "dtype": "complex64", + "shape": [ + 2306400 + ], + "bytes": 18451200, + "mib": 17.596435546875 + }, + { + "name": "strict_cached_carrier_vector", + "dtype": "complex64", + "shape": [ + 2306400 + ], + "bytes": 18451200, + "mib": 17.596435546875 + }, + { + "name": "strict_baseband", + "dtype": "complex64", + "shape": [ + 2306400 + ], + "bytes": 18451200, + "mib": 17.596435546875 + }, + { + "name": "strict_matched_output", + "dtype": "complex64", + "shape": [ + 2310400 + ], + "bytes": 18483200, + "mib": 17.626953125 + }, + { + "name": "matched_filter_taps", + "dtype": "float32", + "shape": [ + 4001 + ], + "bytes": 16004, + "mib": 0.015262603759765625 + } + ] + }, + "speedup": 2.883488745018403, + "processing_to_capture_ratio": 0.8652460799940551, + "real_time_capable": true, + "threshold": 0.030964473262429237, + "threshold_changed": false, + "coarse": { + "total_local_peaks": 185828, + "first_stage_candidates": 32414, + "skipped_as_owned_event": 32345, + "exact_duplicates": 0 + }, + "strict": { + "candidates_processed": 69, + "rejected_during_refinement": 0, + "refinement_pass": 69, + "timing_pass": 69, + "carrier_pass": 69, + "phy_header_pass": 36, + "phy_header_fail": 33, + "fec_attempts": 36, + "fec_pass": 36, + "fec_fail": 0, + "protocol_parse_pass": 36, + "crc_pass": 36, + "crc_fail": 0, + "valid_frames": 36 + }, + "object": { + "valid_fragments": 36, + "missing_fragments": [], + "object_complete": true + }, + "after_independent_verdict": { + "stage": "AFTER_COMPLETED_INDEPENDENT_VERDICT_ONLY", + "expected_tx_frames": 36, + "matched_valid_frames": 36, + "missed_tx_frames": [], + "false_crc_pass": 0, + "duplicate_valid_detections": 0, + "total_pre_fec_coded_bit_errors": 19, + "total_post_fec_protocol_bit_errors": 0, + "jpeg_size": 8724, + "recovered_sha256": "e913dab9ac32795250880a4be67fbbbf89a4f96536842476ab591d1acaafc02a", + "tx_sha256": "e913dab9ac32795250880a4be67fbbbf89a4f96536842476ab591d1acaafc02a", + "sha_match": true, + "byte_errors": 0, + "bit_errors": 0, + "jpeg_decode": "PASS", + "width": 320, + "height": 240 + }, + "receiver_oracles": { + "expected_frame_count": false, + "tx_coded_bits": false, + "tx_fragment_indexes": false, + "tx_frame_offsets": false, + "tx_image": false, + "tx_packets": false + }, + "phy_changed": false, + "fec_changed": false, + "bpsk_changed": false, + "rf_tx": 0 +} \ No newline at end of file diff --git a/data/processed/lab051/replay.json b/data/processed/lab051/replay.json new file mode 100644 index 0000000..ab5bb8c --- /dev/null +++ b/data/processed/lab051/replay.json @@ -0,0 +1,40 @@ +{ + "false": { + "reason": "PHY_HEADER_MAGIC_MISMATCH", + "baseline_arrays": { + "observed_array_objects": 2888, + "observed_owned_arrays": 61, + "observed_owned_bytes_total": 6612268, + "tracemalloc_retained_bytes": 1481, + "tracemalloc_peak_bytes": 2104129, + "array_count_is_lower_bound": true + }, + "optimized_arrays": { + "observed_array_objects": 76, + "observed_owned_arrays": 61, + "observed_owned_bytes_total": 5906101, + "tracemalloc_retained_bytes": 1936, + "tracemalloc_peak_bytes": 5524392, + "array_count_is_lower_bound": true + } + }, + "valid": { + "reason": "CRC_PASS", + "baseline_arrays": { + "observed_array_objects": 14361, + "observed_owned_arrays": 8704, + "observed_owned_bytes_total": 16681890, + "tracemalloc_retained_bytes": 2130, + "tracemalloc_peak_bytes": 5885299, + "array_count_is_lower_bound": true + }, + "optimized_arrays": { + "observed_array_objects": 6594, + "observed_owned_arrays": 6560, + "observed_owned_bytes_total": 12345244, + "tracemalloc_retained_bytes": 2645, + "tracemalloc_peak_bytes": 7771675, + "array_count_is_lower_bound": true + } + } +} diff --git a/data/processed/lab051/stream.json b/data/processed/lab051/stream.json new file mode 100644 index 0000000..c6ba443 --- /dev/null +++ b/data/processed/lab051/stream.json @@ -0,0 +1,7253 @@ +{ + "scope": "continuous synthetic IQ; measured per-block CPU event replay; camera/display latency UNKNOWN", + "symbol_rate": 500000, + "samples_per_symbol": 16, + "input_fps": 5, + "input_frames": 30, + "observation_seconds": 6.0, + "iq_seconds": 6.044416, + "tx_images": 30, + "tx_physical_packets": 240, + "dropped_before_tx": 0, + "maximum_waiting_frames": 1, + "rx_physical_packets": 240, + "received_images": 30, + "object_jpeg_integrity": true, + "dropped_stale_at_display": 30, + "displayed": 0, + "fresh_displayed": 0, + "raw_received_fps": 0.8333333333333334, + "raw_display_fps": 0.0, + "fresh_display_fps": 0.0, + "drain_fresh_displayed": 0, + "image_age_min_seconds": 0.2765154999291971, + "image_age_median_seconds": 15.691202650459713, + "image_age_max_seconds": 31.150008799213214, + "fresh_image_age_seconds": [], + "max_video_age_seconds": 0.2, + "processing_seconds": 38.630131699494086, + "rx_processing_seconds": 38.619084799312986, + "assembly_seconds": 0.005451100296340883, + "jpeg_decode_seconds": 0.00559579988475889, + "processing_per_rf_second": 6.391044511081647, + "physical_packet_processing_seconds": 0.16095888208122536, + "maximum_cpu_lag_seconds": 32.63240379935919, + "implied_external_iq_backlog_bytes": 2088473848, + "live_external_queue_implemented": false, + "retained_iq_peak_bytes": 3177728, + "working_arrays_upper_estimate_bytes": 142775456, + "object_payload_peak_bytes": 1893, + "process_memory": { + "rss_bytes": 161591296, + "peak_rss_bytes": 186650624 + }, + "rss_samples": [ + { + "samples": 4194304, + "rss_bytes": 163315712, + "peak_rss_bytes": 184958976 + }, + { + "samples": 8388608, + "rss_bytes": 163098624, + "peak_rss_bytes": 184958976 + }, + { + "samples": 12582912, + "rss_bytes": 164163584, + "peak_rss_bytes": 184958976 + }, + { + "samples": 16777216, + "rss_bytes": 166592512, + "peak_rss_bytes": 184958976 + }, + { + "samples": 20971520, + "rss_bytes": 162603008, + "peak_rss_bytes": 184958976 + }, + { + "samples": 25165824, + "rss_bytes": 164147200, + "peak_rss_bytes": 184958976 + }, + { + "samples": 29360128, + "rss_bytes": 162447360, + "peak_rss_bytes": 184958976 + }, + { + "samples": 33554432, + "rss_bytes": 164155392, + "peak_rss_bytes": 184958976 + }, + { + "samples": 37748736, + "rss_bytes": 167849984, + "peak_rss_bytes": 184958976 + }, + { + "samples": 41943040, + "rss_bytes": 163905536, + "peak_rss_bytes": 184958976 + }, + { + "samples": 46137344, + "rss_bytes": 164601856, + "peak_rss_bytes": 184958976 + } + ], + "candidate_count": 147082, + "rejected_reasons": { + "PHY_HEADER_MAGIC_MISMATCH": 145093, + "TRUNCATED_SYMBOLS": 1723, + "TRUNCATED_IQ_WINDOW": 26 + }, + "front_statistics": { + "shared_refinement_correlations": 619, + "shared_matched_calls": 619, + "unique_soft_windows": 12239, + "soft_window_cache_hits": 135057, + "local_body_matched_calls": 239, + "refinement_tie_fallbacks": 44 + }, + "decimated_samples_reused": 30373507, + "actual_decimator_input_samples": 48607480, + "images": [ + { + "image_id": 1, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 2312, + "last_rf_sample": 740360, + "first_rx_time": 0.08551929996651411, + "decode_complete_timestamp": 0.2765154999291971, + "capture_timestamp": 0.0, + "image_age_seconds": 0.2765154999291971, + "fresh": false, + "sha256": "15723773a8788c9d610c874707ad2d513582322ee1d42009b0b39d3de336e10d", + "sha_match": true + }, + { + "image_id": 2, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 1601496, + "last_rf_sample": 2339544, + "first_rx_time": 1.452430500190936, + "decode_complete_timestamp": 1.6454716001248433, + "capture_timestamp": 0.2, + "image_age_seconds": 1.4454716001248433, + "fresh": false, + "sha256": "66404b14ca9e3a6627871ad9d3b5dd4311915d7820a99dfa182fc3a20fbe9d85", + "sha_match": true + }, + { + "image_id": 3, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 3201472, + "last_rf_sample": 3939520, + "first_rx_time": 2.6987997999025954, + "decode_complete_timestamp": 2.8932942997275366, + "capture_timestamp": 0.4, + "image_age_seconds": 2.4932942997275367, + "fresh": false, + "sha256": "166d33d72820bf3385e0d30823d991b453147c84ca75f788ab8819ad5e3c3ced", + "sha_match": true + }, + { + "image_id": 4, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 4801472, + "last_rf_sample": 5539520, + "first_rx_time": 3.9168950000388993, + "decode_complete_timestamp": 4.110197799870043, + "capture_timestamp": 0.6, + "image_age_seconds": 3.5101977998700433, + "fresh": false, + "sha256": "38052148ffbc024d2ba28049ea20b1172eebe9c990cb2fd94b25d2eaf9b46584", + "sha_match": true + }, + { + "image_id": 5, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 6401344, + "last_rf_sample": 7139392, + "first_rx_time": 5.0958967998235, + "decode_complete_timestamp": 5.2996191998322, + "capture_timestamp": 0.8, + "image_age_seconds": 4.499619199832201, + "fresh": false, + "sha256": "1e135c2854bef0f7dffb84cf8eb71e200c958d7d7426d24d16bb36d471b52c1d", + "sha_match": true + }, + { + "image_id": 6, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 8001913, + "last_rf_sample": 8739961, + "first_rx_time": 6.378608099774688, + "decode_complete_timestamp": 6.573474199402376, + "capture_timestamp": 1.0, + "image_age_seconds": 5.573474199402376, + "fresh": false, + "sha256": "b59b7e834374fa00757abcb57282a1b7c46c08b41e0adb1cb5803135b009cb7f", + "sha_match": true + }, + { + "image_id": 7, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 9601392, + "last_rf_sample": 10339440, + "first_rx_time": 7.7501086994383925, + "decode_complete_timestamp": 7.951364099637836, + "capture_timestamp": 1.2, + "image_age_seconds": 6.7513640996378355, + "fresh": false, + "sha256": "8f6452262ea5a82d195de8cd23e3d21ab186ce5a20b031acf8295c30daa98572", + "sha_match": true + }, + { + "image_id": 8, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 11201232, + "last_rf_sample": 11939280, + "first_rx_time": 8.881508599275953, + "decode_complete_timestamp": 9.07254959946335, + "capture_timestamp": 1.4, + "image_age_seconds": 7.67254959946335, + "fresh": false, + "sha256": "eb0f69a3e57c1860d98e79591ee9b472ac3a0929883be2a2992397f594d176f4", + "sha_match": true + }, + { + "image_id": 9, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 12801232, + "last_rf_sample": 13539280, + "first_rx_time": 10.245677399573147, + "decode_complete_timestamp": 10.438651399694614, + "capture_timestamp": 1.6, + "image_age_seconds": 8.838651399694614, + "fresh": false, + "sha256": "22c41e53d1d086baf886e6f65c011e1360ef26ad7781eced4655664cb7adcf06", + "sha_match": true + }, + { + "image_id": 10, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 14401560, + "last_rf_sample": 15139608, + "first_rx_time": 11.414928399732567, + "decode_complete_timestamp": 11.605219899917252, + "capture_timestamp": 1.8, + "image_age_seconds": 9.805219899917251, + "fresh": false, + "sha256": "e907decbbf66cc21c6b6e767b6c9baef856754d3cc95625cca38fd07aa5408c1", + "sha_match": true + }, + { + "image_id": 11, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 16001457, + "last_rf_sample": 16739505, + "first_rx_time": 12.800601699979275, + "decode_complete_timestamp": 12.992655000074997, + "capture_timestamp": 2.0, + "image_age_seconds": 10.992655000074997, + "fresh": false, + "sha256": "ab681a9cce96a8aaa71f3a612634748a2df743f1c76092f5a674e0dd36ca7caf", + "sha_match": true + }, + { + "image_id": 12, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 17601464, + "last_rf_sample": 18339512, + "first_rx_time": 13.969097600093342, + "decode_complete_timestamp": 14.162574300200909, + "capture_timestamp": 2.2, + "image_age_seconds": 11.96257430020091, + "fresh": false, + "sha256": "9c3d4258ddf1085f8da6ca87b6c3071aa031d58a5c42739a5527a27e6c2f17af", + "sha_match": true + }, + { + "image_id": 13, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 19201416, + "last_rf_sample": 19939464, + "first_rx_time": 15.182438500698886, + "decode_complete_timestamp": 15.37690930069261, + "capture_timestamp": 2.4, + "image_age_seconds": 12.97690930069261, + "fresh": false, + "sha256": "6615eb4fe58fb4d0854c3c856e65a0990eba2361fc977c524acf9f0a5ab7accb", + "sha_match": true + }, + { + "image_id": 14, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 20801728, + "last_rf_sample": 21539776, + "first_rx_time": 16.391536700663387, + "decode_complete_timestamp": 16.58641660051257, + "capture_timestamp": 2.6, + "image_age_seconds": 13.986416600512571, + "fresh": false, + "sha256": "8fbb4fa0fce1e3deedb3fd838d69835b7670d73d793b792b2ffde69d733bbb40", + "sha_match": true + }, + { + "image_id": 15, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 22401536, + "last_rf_sample": 23139584, + "first_rx_time": 17.74771130050835, + "decode_complete_timestamp": 17.943737500471293, + "capture_timestamp": 2.8, + "image_age_seconds": 15.143737500471293, + "fresh": false, + "sha256": "9109553288f7b07311be951bd36cc389034496b6665b874dd92cfea84ac60d13", + "sha_match": true + }, + { + "image_id": 16, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 24001136, + "last_rf_sample": 24739184, + "first_rx_time": 19.036045300316296, + "decode_complete_timestamp": 19.238667800448134, + "capture_timestamp": 3.0, + "image_age_seconds": 16.238667800448134, + "fresh": false, + "sha256": "5b264bae760e7103f645f4a4203c435dfb8bd7555ec679b750d4c4cefe642f3a", + "sha_match": true + }, + { + "image_id": 17, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 25601488, + "last_rf_sample": 26339536, + "first_rx_time": 20.17491330044181, + "decode_complete_timestamp": 20.371031400289617, + "capture_timestamp": 3.2, + "image_age_seconds": 17.171031400289618, + "fresh": false, + "sha256": "df7d2804878be2b11c0233cee2401504d3545fad2f856fedb5e3aedfc1a0bf36", + "sha_match": true + }, + { + "image_id": 18, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 27201384, + "last_rf_sample": 27939432, + "first_rx_time": 21.430392300368517, + "decode_complete_timestamp": 21.617195400300666, + "capture_timestamp": 3.4, + "image_age_seconds": 18.217195400300668, + "fresh": false, + "sha256": "9fc4dded148ed750d53cadf0abe059cb01acab50999ebf9f521b2685c77c3025", + "sha_match": true + }, + { + "image_id": 19, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 28801272, + "last_rf_sample": 29539320, + "first_rx_time": 22.728266200058393, + "decode_complete_timestamp": 22.918563200284957, + "capture_timestamp": 3.6, + "image_age_seconds": 19.318563200284956, + "fresh": false, + "sha256": "820d8d0916c53b1937d002e6b0632100b7a2d0a216f1022cdc55ba5fd0844cb5", + "sha_match": true + }, + { + "image_id": 20, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 30401368, + "last_rf_sample": 31139416, + "first_rx_time": 24.017221299939088, + "decode_complete_timestamp": 24.211717799895673, + "capture_timestamp": 3.8, + "image_age_seconds": 20.411717799895673, + "fresh": false, + "sha256": "ef9903b6c8d9ab6f572a7fa54af7570f6c321346117f9c4e156e1b71c97c46fd", + "sha_match": true + }, + { + "image_id": 21, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 32001352, + "last_rf_sample": 32739400, + "first_rx_time": 25.213637599845647, + "decode_complete_timestamp": 25.407755400178253, + "capture_timestamp": 4.0, + "image_age_seconds": 21.407755400178253, + "fresh": false, + "sha256": "6605b523265e1229959f94fdad35d672037a902e9c7c585e22aafb875fb9e287", + "sha_match": true + }, + { + "image_id": 22, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 33600992, + "last_rf_sample": 34339040, + "first_rx_time": 26.49461480009672, + "decode_complete_timestamp": 26.6906435000787, + "capture_timestamp": 4.2, + "image_age_seconds": 22.4906435000787, + "fresh": false, + "sha256": "8cf09da5a66ca3b3b18c1e4db63c8d57ed5044ba6f758368f7bcfb04f86a3839", + "sha_match": true + }, + { + "image_id": 23, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 35201472, + "last_rf_sample": 35939520, + "first_rx_time": 27.925361100009873, + "decode_complete_timestamp": 28.109049800092585, + "capture_timestamp": 4.4, + "image_age_seconds": 23.709049800092586, + "fresh": false, + "sha256": "282ee75b1d6c2963fec0ecaed77f5663d9a49bcfa1561c5b0f40ea93089e06f1", + "sha_match": true + }, + { + "image_id": 24, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 36801272, + "last_rf_sample": 37539320, + "first_rx_time": 29.101257500129982, + "decode_complete_timestamp": 29.29822729982738, + "capture_timestamp": 4.6, + "image_age_seconds": 24.69822729982738, + "fresh": false, + "sha256": "ba6c6a8aeae49674442d1079d15f4b0fa4202e7cc72cb66d2853c312ced16132", + "sha_match": true + }, + { + "image_id": 25, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 38401328, + "last_rf_sample": 39139376, + "first_rx_time": 30.26070119976834, + "decode_complete_timestamp": 30.463250299806937, + "capture_timestamp": 4.8, + "image_age_seconds": 25.663250299806936, + "fresh": false, + "sha256": "bd7841541d47d9a9844e6302825db98f3c72e5258946c3d2d0a2d2b7f0cee92e", + "sha_match": true + }, + { + "image_id": 26, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 40001448, + "last_rf_sample": 40739496, + "first_rx_time": 31.636858599850207, + "decode_complete_timestamp": 31.83461709973239, + "capture_timestamp": 5.0, + "image_age_seconds": 26.83461709973239, + "fresh": false, + "sha256": "70cdf837f756084e3d5a6dd438b615d71e669936c4d17c9ed7be88f4b4dcf965", + "sha_match": true + }, + { + "image_id": 27, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 41601544, + "last_rf_sample": 42339592, + "first_rx_time": 32.79699019983713, + "decode_complete_timestamp": 32.994742700022876, + "capture_timestamp": 5.2, + "image_age_seconds": 27.794742700022876, + "fresh": false, + "sha256": "a31da69de44bff031631997cc27724025f293528b4d97f2825d34a704ec224af", + "sha_match": true + }, + { + "image_id": 28, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 43201368, + "last_rf_sample": 43939416, + "first_rx_time": 34.163415299969024, + "decode_complete_timestamp": 34.3657058997855, + "capture_timestamp": 5.4, + "image_age_seconds": 28.965705899785505, + "fresh": false, + "sha256": "4380eae166bc37a7de7367642559b948cf1cc77939d1c84406de7cff372b6a76", + "sha_match": true + }, + { + "image_id": 29, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 44801288, + "last_rf_sample": 45539336, + "first_rx_time": 35.48912599974614, + "decode_complete_timestamp": 35.681690899662904, + "capture_timestamp": 5.6, + "image_age_seconds": 30.081690899662902, + "fresh": false, + "sha256": "c2e1a913dc48d622e1097f31543208ce610ce42d266857d8a76961f143dd9a4b", + "sha_match": true + }, + { + "image_id": 30, + "dimensions": [ + 128, + 96 + ], + "first_rf_sample": 46401016, + "last_rf_sample": 47139064, + "first_rx_time": 36.75321229955484, + "decode_complete_timestamp": 36.950008799213215, + "capture_timestamp": 5.8, + "image_age_seconds": 31.150008799213214, + "fresh": false, + "sha256": "bbbd15eac04b06ea05ec548f4c95b577b8ffc280c00fc473fb2a6914c40f7939", + "sha_match": true + } + ], + "blocks": [ + { + "samples_received": 65536, + "arrival_time": 0.008192, + "worker_start": 0.008192, + "worker_end": 0.008401999969229102, + "rx_cpu_seconds": 0.00020999996922910213, + "packets": 0, + "lag_seconds": 0.00020999996922910213 + }, + { + "samples_received": 131072, + "arrival_time": 0.016384, + "worker_start": 0.016384, + "worker_end": 0.016767100006729364, + "rx_cpu_seconds": 0.0003831000067293644, + "packets": 0, + "lag_seconds": 0.0003831000067293644 + }, + { + "samples_received": 196608, + "arrival_time": 0.024576, + "worker_start": 0.024576, + "worker_end": 0.025150199948459864, + "rx_cpu_seconds": 0.0005741999484598637, + "packets": 0, + "lag_seconds": 0.0005741999484598637 + }, + { + "samples_received": 262144, + "arrival_time": 0.032768, + "worker_start": 0.032768, + "worker_end": 0.033599700046546756, + "rx_cpu_seconds": 0.0008317000465467572, + "packets": 0, + "lag_seconds": 0.0008317000465467572 + }, + { + "samples_received": 327680, + "arrival_time": 0.04096, + "worker_start": 0.04096, + "worker_end": 0.041707799989767376, + "rx_cpu_seconds": 0.0007477999897673726, + "packets": 0, + "lag_seconds": 0.0007477999897673726 + }, + { + "samples_received": 393216, + "arrival_time": 0.049152, + "worker_start": 0.049152, + "worker_end": 0.08554809995298088, + "rx_cpu_seconds": 0.03636729996651411, + "packets": 1, + "lag_seconds": 0.036396099952980876 + }, + { + "samples_received": 458752, + "arrival_time": 0.057344, + "worker_start": 0.08554809995298088, + "worker_end": 0.11021449988079071, + "rx_cpu_seconds": 0.024643899989314377, + "packets": 1, + "lag_seconds": 0.05287049988079071 + }, + { + "samples_received": 524288, + "arrival_time": 0.065536, + "worker_start": 0.11021449988079071, + "worker_end": 0.13685489993844926, + "rx_cpu_seconds": 0.026619500014930964, + "packets": 1, + "lag_seconds": 0.07131889993844927 + }, + { + "samples_received": 589824, + "arrival_time": 0.073728, + "worker_start": 0.13685489993844926, + "worker_end": 0.14398499998100847, + "rx_cpu_seconds": 0.0071301000425592065, + "packets": 0, + "lag_seconds": 0.07025699998100847 + }, + { + "samples_received": 655360, + "arrival_time": 0.08192, + "worker_start": 0.14398499998100847, + "worker_end": 0.168336699957259, + "rx_cpu_seconds": 0.024330400046892464, + "packets": 1, + "lag_seconds": 0.086416699957259 + }, + { + "samples_received": 720896, + "arrival_time": 0.090112, + "worker_start": 0.168336699957259, + "worker_end": 0.19271489990246296, + "rx_cpu_seconds": 0.024353399989195168, + "packets": 1, + "lag_seconds": 0.10260289990246296 + }, + { + "samples_received": 786432, + "arrival_time": 0.098304, + "worker_start": 0.19271489990246296, + "worker_end": 0.19975119992927462, + "rx_cpu_seconds": 0.007036300026811659, + "packets": 0, + "lag_seconds": 0.10144719992927462 + }, + { + "samples_received": 851968, + "arrival_time": 0.106496, + "worker_start": 0.19975119992927462, + "worker_end": 0.22518549988348782, + "rx_cpu_seconds": 0.025410400005057454, + "packets": 1, + "lag_seconds": 0.11868949988348783 + }, + { + "samples_received": 917504, + "arrival_time": 0.114688, + "worker_start": 0.22518549988348782, + "worker_end": 0.25015719992411134, + "rx_cpu_seconds": 0.024950999999418855, + "packets": 1, + "lag_seconds": 0.13546919992411133 + }, + { + "samples_received": 983040, + "arrival_time": 0.12288, + "worker_start": 0.25015719992411134, + "worker_end": 0.2765154999291971, + "rx_cpu_seconds": 0.026156999985687435, + "packets": 1, + "lag_seconds": 0.15363549992919712 + }, + { + "samples_received": 1048576, + "arrival_time": 0.131072, + "worker_start": 0.2765154999291971, + "worker_end": 0.2836904999644011, + "rx_cpu_seconds": 0.007175000035203993, + "packets": 0, + "lag_seconds": 0.1526184999644011 + }, + { + "samples_received": 1114112, + "arrival_time": 0.139264, + "worker_start": 0.2836904999644011, + "worker_end": 0.35922829993837324, + "rx_cpu_seconds": 0.07553779997397214, + "packets": 0, + "lag_seconds": 0.21996429993837324 + }, + { + "samples_received": 1179648, + "arrival_time": 0.147456, + "worker_start": 0.35922829993837324, + "worker_end": 0.45360440004919467, + "rx_cpu_seconds": 0.09437610011082143, + "packets": 0, + "lag_seconds": 0.30614840004919464 + }, + { + "samples_received": 1245184, + "arrival_time": 0.155648, + "worker_start": 0.45360440004919467, + "worker_end": 0.5378141000478044, + "rx_cpu_seconds": 0.08420969999860972, + "packets": 0, + "lag_seconds": 0.3821661000478044 + }, + { + "samples_received": 1310720, + "arrival_time": 0.16384, + "worker_start": 0.5378141000478044, + "worker_end": 0.6307757000981346, + "rx_cpu_seconds": 0.09296160005033016, + "packets": 0, + "lag_seconds": 0.46693570009813457 + }, + { + "samples_received": 1376256, + "arrival_time": 0.172032, + "worker_start": 0.6307757000981346, + "worker_end": 0.7341554000817686, + "rx_cpu_seconds": 0.10337969998363405, + "packets": 0, + "lag_seconds": 0.5621234000817686 + }, + { + "samples_received": 1441792, + "arrival_time": 0.180224, + "worker_start": 0.7341554000817686, + "worker_end": 0.8293948001305088, + "rx_cpu_seconds": 0.09523940004874021, + "packets": 0, + "lag_seconds": 0.6491708001305088 + }, + { + "samples_received": 1507328, + "arrival_time": 0.188416, + "worker_start": 0.8293948001305088, + "worker_end": 0.9292539000820815, + "rx_cpu_seconds": 0.09985909995157272, + "packets": 0, + "lag_seconds": 0.7408379000820815 + }, + { + "samples_received": 1572864, + "arrival_time": 0.196608, + "worker_start": 0.9292539000820815, + "worker_end": 1.0480517001200913, + "rx_cpu_seconds": 0.11879780003800988, + "packets": 0, + "lag_seconds": 0.8514437001200913 + }, + { + "samples_received": 1638400, + "arrival_time": 0.2048, + "worker_start": 1.0480517001200913, + "worker_end": 1.1339977000683992, + "rx_cpu_seconds": 0.08594599994830787, + "packets": 0, + "lag_seconds": 0.9291977000683992 + }, + { + "samples_received": 1703936, + "arrival_time": 0.212992, + "worker_start": 1.1339977000683992, + "worker_end": 1.1542487001356183, + "rx_cpu_seconds": 0.020251000067219138, + "packets": 0, + "lag_seconds": 0.9412567001356184 + }, + { + "samples_received": 1769472, + "arrival_time": 0.221184, + "worker_start": 1.1542487001356183, + "worker_end": 1.2462652002072407, + "rx_cpu_seconds": 0.09201650007162243, + "packets": 0, + "lag_seconds": 1.0250812002072407 + }, + { + "samples_received": 1835008, + "arrival_time": 0.229376, + "worker_start": 1.2462652002072407, + "worker_end": 1.3106382002665176, + "rx_cpu_seconds": 0.06437300005927682, + "packets": 0, + "lag_seconds": 1.0812622002665175 + }, + { + "samples_received": 1900544, + "arrival_time": 0.237568, + "worker_start": 1.3106382002665176, + "worker_end": 1.399087500184074, + "rx_cpu_seconds": 0.08844929991755635, + "packets": 0, + "lag_seconds": 1.161519500184074 + }, + { + "samples_received": 1966080, + "arrival_time": 0.24576, + "worker_start": 1.399087500184074, + "worker_end": 1.4524572001614122, + "rx_cpu_seconds": 0.053343000006861985, + "packets": 1, + "lag_seconds": 1.2066972001614122 + }, + { + "samples_received": 2031616, + "arrival_time": 0.253952, + "worker_start": 1.4524572001614122, + "worker_end": 1.4772745000740959, + "rx_cpu_seconds": 0.024797299993224442, + "packets": 1, + "lag_seconds": 1.223322500074096 + }, + { + "samples_received": 2097152, + "arrival_time": 0.262144, + "worker_start": 1.4772745000740959, + "worker_end": 1.4838929000620245, + "rx_cpu_seconds": 0.006618399987928569, + "packets": 0, + "lag_seconds": 1.2217489000620245 + }, + { + "samples_received": 2162688, + "arrival_time": 0.270336, + "worker_start": 1.4838929000620245, + "worker_end": 1.5092117000680862, + "rx_cpu_seconds": 0.025297599961049855, + "packets": 1, + "lag_seconds": 1.2388757000680863 + }, + { + "samples_received": 2228224, + "arrival_time": 0.278528, + "worker_start": 1.5092117000680862, + "worker_end": 1.5330892001588343, + "rx_cpu_seconds": 0.023854300030507147, + "packets": 1, + "lag_seconds": 1.2545612001588342 + }, + { + "samples_received": 2293760, + "arrival_time": 0.28672, + "worker_start": 1.5330892001588343, + "worker_end": 1.5396666001838146, + "rx_cpu_seconds": 0.006577400024980307, + "packets": 0, + "lag_seconds": 1.2529466001838148 + }, + { + "samples_received": 2359296, + "arrival_time": 0.294912, + "worker_start": 1.5396666001838146, + "worker_end": 1.5630759002019166, + "rx_cpu_seconds": 0.02338719996623695, + "packets": 1, + "lag_seconds": 1.2681639002019165 + }, + { + "samples_received": 2424832, + "arrival_time": 0.303104, + "worker_start": 1.5630759002019166, + "worker_end": 1.587917500183217, + "rx_cpu_seconds": 0.024821800063364208, + "packets": 1, + "lag_seconds": 1.284813500183217 + }, + { + "samples_received": 2490368, + "arrival_time": 0.311296, + "worker_start": 1.587917500183217, + "worker_end": 1.6127573001508115, + "rx_cpu_seconds": 0.02481690002605319, + "packets": 1, + "lag_seconds": 1.3014613001508115 + }, + { + "samples_received": 2555904, + "arrival_time": 0.319488, + "worker_start": 1.6127573001508115, + "worker_end": 1.6196985001519768, + "rx_cpu_seconds": 0.006941200001165271, + "packets": 0, + "lag_seconds": 1.3002105001519768 + }, + { + "samples_received": 2621440, + "arrival_time": 0.32768, + "worker_start": 1.6196985001519768, + "worker_end": 1.6454716001248433, + "rx_cpu_seconds": 0.025553600047715008, + "packets": 1, + "lag_seconds": 1.3177916001248433 + }, + { + "samples_received": 2686976, + "arrival_time": 0.335872, + "worker_start": 1.6454716001248433, + "worker_end": 1.6862096000772415, + "rx_cpu_seconds": 0.04073799995239824, + "packets": 0, + "lag_seconds": 1.3503376000772416 + }, + { + "samples_received": 2752512, + "arrival_time": 0.344064, + "worker_start": 1.6862096000772415, + "worker_end": 1.7830260000268443, + "rx_cpu_seconds": 0.09681639994960278, + "packets": 0, + "lag_seconds": 1.4389620000268444 + }, + { + "samples_received": 2818048, + "arrival_time": 0.352256, + "worker_start": 1.7830260000268443, + "worker_end": 1.8800725999830736, + "rx_cpu_seconds": 0.09704659995622933, + "packets": 0, + "lag_seconds": 1.5278165999830735 + }, + { + "samples_received": 2883584, + "arrival_time": 0.360448, + "worker_start": 1.8800725999830736, + "worker_end": 1.9791343000328614, + "rx_cpu_seconds": 0.09906170004978776, + "packets": 0, + "lag_seconds": 1.6186863000328615 + }, + { + "samples_received": 2949120, + "arrival_time": 0.36864, + "worker_start": 1.9791343000328614, + "worker_end": 2.071882000084266, + "rx_cpu_seconds": 0.09274770005140454, + "packets": 0, + "lag_seconds": 1.7032420000842659 + }, + { + "samples_received": 3014656, + "arrival_time": 0.376832, + "worker_start": 2.071882000084266, + "worker_end": 2.1646545000916793, + "rx_cpu_seconds": 0.09277250000741333, + "packets": 0, + "lag_seconds": 1.7878225000916792 + }, + { + "samples_received": 3080192, + "arrival_time": 0.385024, + "worker_start": 2.1646545000916793, + "worker_end": 2.2569707000006436, + "rx_cpu_seconds": 0.09231619990896434, + "packets": 0, + "lag_seconds": 1.8719467000006436 + }, + { + "samples_received": 3145728, + "arrival_time": 0.393216, + "worker_start": 2.2569707000006436, + "worker_end": 2.3471802999342306, + "rx_cpu_seconds": 0.09020959993358701, + "packets": 0, + "lag_seconds": 1.9539642999342306 + }, + { + "samples_received": 3211264, + "arrival_time": 0.401408, + "worker_start": 2.3471802999342306, + "worker_end": 2.4374094000163002, + "rx_cpu_seconds": 0.09022910008206964, + "packets": 0, + "lag_seconds": 2.0360014000163003 + }, + { + "samples_received": 3276800, + "arrival_time": 0.4096, + "worker_start": 2.4374094000163002, + "worker_end": 2.4903168000823332, + "rx_cpu_seconds": 0.052907400066033006, + "packets": 0, + "lag_seconds": 2.080716800082333 + }, + { + "samples_received": 3342336, + "arrival_time": 0.417792, + "worker_start": 2.4903168000823332, + "worker_end": 2.505214900018878, + "rx_cpu_seconds": 0.014898099936544895, + "packets": 0, + "lag_seconds": 2.087422900018878 + }, + { + "samples_received": 3407872, + "arrival_time": 0.425984, + "worker_start": 2.505214900018878, + "worker_end": 2.573589699932605, + "rx_cpu_seconds": 0.06837479991372675, + "packets": 0, + "lag_seconds": 2.1476056999326048 + }, + { + "samples_received": 3473408, + "arrival_time": 0.434176, + "worker_start": 2.573589699932605, + "worker_end": 2.638502399910472, + "rx_cpu_seconds": 0.0649126999778673, + "packets": 0, + "lag_seconds": 2.2043263999104723 + }, + { + "samples_received": 3538944, + "arrival_time": 0.442368, + "worker_start": 2.638502399910472, + "worker_end": 2.6988203998266234, + "rx_cpu_seconds": 0.060297399992123246, + "packets": 1, + "lag_seconds": 2.2564523998266233 + }, + { + "samples_received": 3604480, + "arrival_time": 0.45056, + "worker_start": 2.6988203998266234, + "worker_end": 2.7060231998406796, + "rx_cpu_seconds": 0.007202800014056265, + "packets": 0, + "lag_seconds": 2.2554631998406798 + }, + { + "samples_received": 3670016, + "arrival_time": 0.458752, + "worker_start": 2.7060231998406796, + "worker_end": 2.7310486998253016, + "rx_cpu_seconds": 0.025002800044603646, + "packets": 1, + "lag_seconds": 2.2722966998253016 + }, + { + "samples_received": 3735552, + "arrival_time": 0.466944, + "worker_start": 2.7310486998253016, + "worker_end": 2.7559035997914596, + "rx_cpu_seconds": 0.024831099901348352, + "packets": 1, + "lag_seconds": 2.2889595997914594 + }, + { + "samples_received": 3801088, + "arrival_time": 0.475136, + "worker_start": 2.7559035997914596, + "worker_end": 2.7626552997466622, + "rx_cpu_seconds": 0.006751699955202639, + "packets": 0, + "lag_seconds": 2.2875192997466622 + }, + { + "samples_received": 3866624, + "arrival_time": 0.483328, + "worker_start": 2.7626552997466622, + "worker_end": 2.7870663998259677, + "rx_cpu_seconds": 0.024390700040385127, + "packets": 1, + "lag_seconds": 2.303738399825968 + }, + { + "samples_received": 3932160, + "arrival_time": 0.49152, + "worker_start": 2.7870663998259677, + "worker_end": 2.8114686998382656, + "rx_cpu_seconds": 0.02438259997870773, + "packets": 1, + "lag_seconds": 2.3199486998382657 + }, + { + "samples_received": 3997696, + "arrival_time": 0.499712, + "worker_start": 2.8114686998382656, + "worker_end": 2.836330599857725, + "rx_cpu_seconds": 0.02484059997368604, + "packets": 1, + "lag_seconds": 2.336618599857725 + }, + { + "samples_received": 4063232, + "arrival_time": 0.507904, + "worker_start": 2.836330599857725, + "worker_end": 2.8433140998317374, + "rx_cpu_seconds": 0.006983499974012375, + "packets": 0, + "lag_seconds": 2.3354100998317375 + }, + { + "samples_received": 4128768, + "arrival_time": 0.516096, + "worker_start": 2.8433140998317374, + "worker_end": 2.867029499735914, + "rx_cpu_seconds": 0.023695699987001717, + "packets": 1, + "lag_seconds": 2.350933499735914 + }, + { + "samples_received": 4194304, + "arrival_time": 0.524288, + "worker_start": 2.867029499735914, + "worker_end": 2.8932942997275366, + "rx_cpu_seconds": 0.026044099940918386, + "packets": 1, + "lag_seconds": 2.3690062997275367 + }, + { + "samples_received": 4259840, + "arrival_time": 0.53248, + "worker_start": 2.8932942997275366, + "worker_end": 2.900160599740453, + "rx_cpu_seconds": 0.0068663000129163265, + "packets": 0, + "lag_seconds": 2.367680599740453 + }, + { + "samples_received": 4325376, + "arrival_time": 0.540672, + "worker_start": 2.900160599740453, + "worker_end": 2.9704264997348635, + "rx_cpu_seconds": 0.07026589999441057, + "packets": 0, + "lag_seconds": 2.4297544997348632 + }, + { + "samples_received": 4390912, + "arrival_time": 0.548864, + "worker_start": 2.9704264997348635, + "worker_end": 3.062866599655941, + "rx_cpu_seconds": 0.09244009992107749, + "packets": 0, + "lag_seconds": 2.514002599655941 + }, + { + "samples_received": 4456448, + "arrival_time": 0.557056, + "worker_start": 3.062866599655941, + "worker_end": 3.1617978997605367, + "rx_cpu_seconds": 0.09893130010459572, + "packets": 0, + "lag_seconds": 2.604741899760537 + }, + { + "samples_received": 4521984, + "arrival_time": 0.565248, + "worker_start": 3.1617978997605367, + "worker_end": 3.2539803998155965, + "rx_cpu_seconds": 0.09218250005505979, + "packets": 0, + "lag_seconds": 2.6887323998155965 + }, + { + "samples_received": 4587520, + "arrival_time": 0.57344, + "worker_start": 3.2539803998155965, + "worker_end": 3.3485439998407363, + "rx_cpu_seconds": 0.09456360002513975, + "packets": 0, + "lag_seconds": 2.775103999840736 + }, + { + "samples_received": 4653056, + "arrival_time": 0.581632, + "worker_start": 3.3485439998407363, + "worker_end": 3.4430727998337223, + "rx_cpu_seconds": 0.09452879999298602, + "packets": 0, + "lag_seconds": 2.8614407998337223 + }, + { + "samples_received": 4718592, + "arrival_time": 0.589824, + "worker_start": 3.4430727998337223, + "worker_end": 3.5399726998370586, + "rx_cpu_seconds": 0.09689990000333637, + "packets": 0, + "lag_seconds": 2.9501486998370585 + }, + { + "samples_received": 4784128, + "arrival_time": 0.598016, + "worker_start": 3.5399726998370586, + "worker_end": 3.6321218998713865, + "rx_cpu_seconds": 0.0921492000343278, + "packets": 0, + "lag_seconds": 3.0341058998713866 + }, + { + "samples_received": 4849664, + "arrival_time": 0.606208, + "worker_start": 3.6321218998713865, + "worker_end": 3.699702399906933, + "rx_cpu_seconds": 0.06758050003554672, + "packets": 0, + "lag_seconds": 3.093494399906933 + }, + { + "samples_received": 4915200, + "arrival_time": 0.6144, + "worker_start": 3.699702399906933, + "worker_end": 3.738439799876183, + "rx_cpu_seconds": 0.038737399969249964, + "packets": 0, + "lag_seconds": 3.1240397998761833 + }, + { + "samples_received": 4980736, + "arrival_time": 0.622592, + "worker_start": 3.738439799876183, + "worker_end": 3.7716974999133943, + "rx_cpu_seconds": 0.03325770003721118, + "packets": 0, + "lag_seconds": 3.1491054999133943 + }, + { + "samples_received": 5046272, + "arrival_time": 0.630784, + "worker_start": 3.7716974999133943, + "worker_end": 3.830240599935174, + "rx_cpu_seconds": 0.05854310002177954, + "packets": 0, + "lag_seconds": 3.199456599935174 + }, + { + "samples_received": 5111808, + "arrival_time": 0.638976, + "worker_start": 3.830240599935174, + "worker_end": 3.8773663999822436, + "rx_cpu_seconds": 0.04712580004706979, + "packets": 0, + "lag_seconds": 3.2383903999822437 + }, + { + "samples_received": 5177344, + "arrival_time": 0.647168, + "worker_start": 3.8773663999822436, + "worker_end": 3.916920900003284, + "rx_cpu_seconds": 0.039528600056655705, + "packets": 1, + "lag_seconds": 3.269752900003284 + }, + { + "samples_received": 5242880, + "arrival_time": 0.65536, + "worker_start": 3.916920900003284, + "worker_end": 3.940717499943681, + "rx_cpu_seconds": 0.02377649990376085, + "packets": 1, + "lag_seconds": 3.285357499943681 + }, + { + "samples_received": 5308416, + "arrival_time": 0.663552, + "worker_start": 3.940717499943681, + "worker_end": 3.9474143999472706, + "rx_cpu_seconds": 0.00669690000358969, + "packets": 0, + "lag_seconds": 3.2838623999472705 + }, + { + "samples_received": 5373952, + "arrival_time": 0.671744, + "worker_start": 3.9474143999472706, + "worker_end": 3.9713685999235584, + "rx_cpu_seconds": 0.02393369993660599, + "packets": 1, + "lag_seconds": 3.2996245999235585 + }, + { + "samples_received": 5439488, + "arrival_time": 0.679936, + "worker_start": 3.9713685999235584, + "worker_end": 3.9968209000148325, + "rx_cpu_seconds": 0.025429400033317506, + "packets": 1, + "lag_seconds": 3.3168849000148324 + }, + { + "samples_received": 5505024, + "arrival_time": 0.688128, + "worker_start": 3.9968209000148325, + "worker_end": 4.022785399931713, + "rx_cpu_seconds": 0.02594279998447746, + "packets": 1, + "lag_seconds": 3.3346573999317135 + }, + { + "samples_received": 5570560, + "arrival_time": 0.69632, + "worker_start": 4.022785399931713, + "worker_end": 4.0301844999270955, + "rx_cpu_seconds": 0.00739909999538213, + "packets": 0, + "lag_seconds": 3.3338644999270954 + }, + { + "samples_received": 5636096, + "arrival_time": 0.704512, + "worker_start": 4.0301844999270955, + "worker_end": 4.054881399854317, + "rx_cpu_seconds": 0.02467289997730404, + "packets": 1, + "lag_seconds": 3.3503693998543165 + }, + { + "samples_received": 5701632, + "arrival_time": 0.712704, + "worker_start": 4.054881399854317, + "worker_end": 4.079406399753175, + "rx_cpu_seconds": 0.024503099964931607, + "packets": 1, + "lag_seconds": 3.366702399753175 + }, + { + "samples_received": 5767168, + "arrival_time": 0.720896, + "worker_start": 4.079406399753175, + "worker_end": 4.086233799819134, + "rx_cpu_seconds": 0.0068274000659585, + "packets": 0, + "lag_seconds": 3.365337799819134 + }, + { + "samples_received": 5832704, + "arrival_time": 0.729088, + "worker_start": 4.086233799819134, + "worker_end": 4.110197799870043, + "rx_cpu_seconds": 0.02371610002592206, + "packets": 1, + "lag_seconds": 3.3811097998700435 + }, + { + "samples_received": 5898240, + "arrival_time": 0.73728, + "worker_start": 4.110197799870043, + "worker_end": 4.159053999938301, + "rx_cpu_seconds": 0.04885620006825775, + "packets": 0, + "lag_seconds": 3.421773999938301 + }, + { + "samples_received": 5963776, + "arrival_time": 0.745472, + "worker_start": 4.159053999938301, + "worker_end": 4.263236499864838, + "rx_cpu_seconds": 0.10418249992653728, + "packets": 0, + "lag_seconds": 3.5177644998648385 + }, + { + "samples_received": 6029312, + "arrival_time": 0.753664, + "worker_start": 4.263236499864838, + "worker_end": 4.3548184998875925, + "rx_cpu_seconds": 0.09158200002275407, + "packets": 0, + "lag_seconds": 3.6011544998875924 + }, + { + "samples_received": 6094848, + "arrival_time": 0.761856, + "worker_start": 4.3548184998875925, + "worker_end": 4.449663999847367, + "rx_cpu_seconds": 0.09484549995977432, + "packets": 0, + "lag_seconds": 3.687807999847367 + }, + { + "samples_received": 6160384, + "arrival_time": 0.770048, + "worker_start": 4.449663999847367, + "worker_end": 4.540358099861301, + "rx_cpu_seconds": 0.09069410001393408, + "packets": 0, + "lag_seconds": 3.770310099861301 + }, + { + "samples_received": 6225920, + "arrival_time": 0.77824, + "worker_start": 4.540358099861301, + "worker_end": 4.632175899816907, + "rx_cpu_seconds": 0.09181779995560646, + "packets": 0, + "lag_seconds": 3.853935899816907 + }, + { + "samples_received": 6291456, + "arrival_time": 0.786432, + "worker_start": 4.632175899816907, + "worker_end": 4.7301133998048, + "rx_cpu_seconds": 0.0979374999878928, + "packets": 0, + "lag_seconds": 3.9436813998048 + }, + { + "samples_received": 6356992, + "arrival_time": 0.794624, + "worker_start": 4.7301133998048, + "worker_end": 4.83263599978131, + "rx_cpu_seconds": 0.10252259997650981, + "packets": 0, + "lag_seconds": 4.03801199978131 + }, + { + "samples_received": 6422528, + "arrival_time": 0.802816, + "worker_start": 4.83263599978131, + "worker_end": 4.915951199837259, + "rx_cpu_seconds": 0.08331520005594939, + "packets": 0, + "lag_seconds": 4.113135199837259 + }, + { + "samples_received": 6488064, + "arrival_time": 0.811008, + "worker_start": 4.915951199837259, + "worker_end": 4.990848799825876, + "rx_cpu_seconds": 0.074897599988617, + "packets": 0, + "lag_seconds": 4.179840799825876 + }, + { + "samples_received": 6553600, + "arrival_time": 0.8192, + "worker_start": 4.990848799825876, + "worker_end": 5.0276844998665595, + "rx_cpu_seconds": 0.03683570004068315, + "packets": 0, + "lag_seconds": 4.208484499866559 + }, + { + "samples_received": 6619136, + "arrival_time": 0.827392, + "worker_start": 5.0276844998665595, + "worker_end": 5.045147999895967, + "rx_cpu_seconds": 0.01746350002940744, + "packets": 0, + "lag_seconds": 4.217755999895967 + }, + { + "samples_received": 6684672, + "arrival_time": 0.835584, + "worker_start": 5.045147999895967, + "worker_end": 5.053686599836915, + "rx_cpu_seconds": 0.008538599940948188, + "packets": 0, + "lag_seconds": 4.218102599836915 + }, + { + "samples_received": 6750208, + "arrival_time": 0.843776, + "worker_start": 5.053686599836915, + "worker_end": 5.095917499864704, + "rx_cpu_seconds": 0.042210199986584485, + "packets": 1, + "lag_seconds": 4.252141499864704 + }, + { + "samples_received": 6815744, + "arrival_time": 0.851968, + "worker_start": 5.095917499864704, + "worker_end": 5.10370479990565, + "rx_cpu_seconds": 0.007787300040945411, + "packets": 0, + "lag_seconds": 4.2517367999056495 + }, + { + "samples_received": 6881280, + "arrival_time": 0.86016, + "worker_start": 5.10370479990565, + "worker_end": 5.130625799888044, + "rx_cpu_seconds": 0.0268982999259606, + "packets": 1, + "lag_seconds": 4.2704657998880435 + }, + { + "samples_received": 6946816, + "arrival_time": 0.868352, + "worker_start": 5.130625799888044, + "worker_end": 5.155219099957726, + "rx_cpu_seconds": 0.024571400019340217, + "packets": 1, + "lag_seconds": 4.2868670999577265 + }, + { + "samples_received": 7012352, + "arrival_time": 0.876544, + "worker_start": 5.155219099957726, + "worker_end": 5.182578299900747, + "rx_cpu_seconds": 0.027337800012901425, + "packets": 1, + "lag_seconds": 4.306034299900747 + }, + { + "samples_received": 7077888, + "arrival_time": 0.884736, + "worker_start": 5.182578299900747, + "worker_end": 5.18950309989345, + "rx_cpu_seconds": 0.006924799992702901, + "packets": 0, + "lag_seconds": 4.30476709989345 + }, + { + "samples_received": 7143424, + "arrival_time": 0.892928, + "worker_start": 5.18950309989345, + "worker_end": 5.214979799821272, + "rx_cpu_seconds": 0.025454799993894994, + "packets": 1, + "lag_seconds": 4.3220517998212715 + }, + { + "samples_received": 7208960, + "arrival_time": 0.90112, + "worker_start": 5.214979799821272, + "worker_end": 5.241311099853597, + "rx_cpu_seconds": 0.026309900102205575, + "packets": 1, + "lag_seconds": 4.340191099853597 + }, + { + "samples_received": 7274496, + "arrival_time": 0.909312, + "worker_start": 5.241311099853597, + "worker_end": 5.248104099890448, + "rx_cpu_seconds": 0.006793000036850572, + "packets": 0, + "lag_seconds": 4.338792099890448 + }, + { + "samples_received": 7340032, + "arrival_time": 0.917504, + "worker_start": 5.248104099890448, + "worker_end": 5.272823099869534, + "rx_cpu_seconds": 0.02469570003449917, + "packets": 1, + "lag_seconds": 4.355319099869534 + }, + { + "samples_received": 7405568, + "arrival_time": 0.925696, + "worker_start": 5.272823099869534, + "worker_end": 5.2996191998322, + "rx_cpu_seconds": 0.026576300035230815, + "packets": 1, + "lag_seconds": 4.3739231998322 + }, + { + "samples_received": 7471104, + "arrival_time": 0.933888, + "worker_start": 5.2996191998322, + "worker_end": 5.318849499810717, + "rx_cpu_seconds": 0.019230299978516996, + "packets": 0, + "lag_seconds": 4.384961499810718 + }, + { + "samples_received": 7536640, + "arrival_time": 0.94208, + "worker_start": 5.318849499810717, + "worker_end": 5.419899899753041, + "rx_cpu_seconds": 0.10105039994232357, + "packets": 0, + "lag_seconds": 4.477819899753041 + }, + { + "samples_received": 7602176, + "arrival_time": 0.950272, + "worker_start": 5.419899899753041, + "worker_end": 5.519696299692846, + "rx_cpu_seconds": 0.09979639993980527, + "packets": 0, + "lag_seconds": 4.569424299692846 + }, + { + "samples_received": 7667712, + "arrival_time": 0.958464, + "worker_start": 5.519696299692846, + "worker_end": 5.617232099648795, + "rx_cpu_seconds": 0.09753579995594919, + "packets": 0, + "lag_seconds": 4.658768099648795 + }, + { + "samples_received": 7733248, + "arrival_time": 0.966656, + "worker_start": 5.617232099648795, + "worker_end": 5.722148199689805, + "rx_cpu_seconds": 0.10491610004100949, + "packets": 0, + "lag_seconds": 4.7554921996898045 + }, + { + "samples_received": 7798784, + "arrival_time": 0.974848, + "worker_start": 5.722148199689805, + "worker_end": 5.823275799637891, + "rx_cpu_seconds": 0.10112759994808584, + "packets": 0, + "lag_seconds": 4.848427799637891 + }, + { + "samples_received": 7864320, + "arrival_time": 0.98304, + "worker_start": 5.823275799637891, + "worker_end": 5.914692099679492, + "rx_cpu_seconds": 0.09141630004160106, + "packets": 0, + "lag_seconds": 4.931652099679492 + }, + { + "samples_received": 7929856, + "arrival_time": 0.991232, + "worker_start": 5.914692099679492, + "worker_end": 6.008596999694824, + "rx_cpu_seconds": 0.0939049000153318, + "packets": 0, + "lag_seconds": 5.0173649996948235 + }, + { + "samples_received": 7995392, + "arrival_time": 0.999424, + "worker_start": 6.008596999694824, + "worker_end": 6.102774299688868, + "rx_cpu_seconds": 0.094177299994044, + "packets": 0, + "lag_seconds": 5.103350299688867 + }, + { + "samples_received": 8060928, + "arrival_time": 1.007616, + "worker_start": 6.102774299688868, + "worker_end": 6.175374599647007, + "rx_cpu_seconds": 0.07260029995813966, + "packets": 0, + "lag_seconds": 5.167758599647007 + }, + { + "samples_received": 8126464, + "arrival_time": 1.015808, + "worker_start": 6.175374599647007, + "worker_end": 6.234464899644486, + "rx_cpu_seconds": 0.059090299997478724, + "packets": 0, + "lag_seconds": 5.218656899644486 + }, + { + "samples_received": 8192000, + "arrival_time": 1.024, + "worker_start": 6.234464899644486, + "worker_end": 6.301159799688726, + "rx_cpu_seconds": 0.06669490004424006, + "packets": 0, + "lag_seconds": 5.277159799688726 + }, + { + "samples_received": 8257536, + "arrival_time": 1.032192, + "worker_start": 6.301159799688726, + "worker_end": 6.317688299699917, + "rx_cpu_seconds": 0.016528500011190772, + "packets": 0, + "lag_seconds": 5.285496299699917 + }, + { + "samples_received": 8323072, + "arrival_time": 1.040384, + "worker_start": 6.317688299699917, + "worker_end": 6.347025999690636, + "rx_cpu_seconds": 0.029337699990719557, + "packets": 0, + "lag_seconds": 5.306641999690637 + }, + { + "samples_received": 8388608, + "arrival_time": 1.048576, + "worker_start": 6.347025999690636, + "worker_end": 6.378632999731458, + "rx_cpu_seconds": 0.03158210008405149, + "packets": 1, + "lag_seconds": 5.330056999731458 + }, + { + "samples_received": 8454144, + "arrival_time": 1.056768, + "worker_start": 6.378632999731458, + "worker_end": 6.403582199717171, + "rx_cpu_seconds": 0.024925899924710393, + "packets": 1, + "lag_seconds": 5.346814199717171 + }, + { + "samples_received": 8519680, + "arrival_time": 1.06496, + "worker_start": 6.403582199717171, + "worker_end": 6.4285458996968785, + "rx_cpu_seconds": 0.0249399000313133, + "packets": 1, + "lag_seconds": 5.363585899696878 + }, + { + "samples_received": 8585216, + "arrival_time": 1.073152, + "worker_start": 6.4285458996968785, + "worker_end": 6.437191699639193, + "rx_cpu_seconds": 0.008645799942314625, + "packets": 0, + "lag_seconds": 5.364039699639193 + }, + { + "samples_received": 8650752, + "arrival_time": 1.081344, + "worker_start": 6.437191699639193, + "worker_end": 6.465534099618203, + "rx_cpu_seconds": 0.02831670001614839, + "packets": 1, + "lag_seconds": 5.384190099618204 + }, + { + "samples_received": 8716288, + "arrival_time": 1.089536, + "worker_start": 6.465534099618203, + "worker_end": 6.490174899583913, + "rx_cpu_seconds": 0.02461830002721399, + "packets": 1, + "lag_seconds": 5.400638899583913 + }, + { + "samples_received": 8781824, + "arrival_time": 1.097728, + "worker_start": 6.490174899583913, + "worker_end": 6.497406299582913, + "rx_cpu_seconds": 0.007231399999000132, + "packets": 0, + "lag_seconds": 5.399678299582913 + }, + { + "samples_received": 8847360, + "arrival_time": 1.10592, + "worker_start": 6.497406299582913, + "worker_end": 6.521554399522252, + "rx_cpu_seconds": 0.02412919991184026, + "packets": 1, + "lag_seconds": 5.415634399522252 + }, + { + "samples_received": 8912896, + "arrival_time": 1.114112, + "worker_start": 6.521554399522252, + "worker_end": 6.547262299464315, + "rx_cpu_seconds": 0.02568379999138415, + "packets": 1, + "lag_seconds": 5.433150299464314 + }, + { + "samples_received": 8978432, + "arrival_time": 1.122304, + "worker_start": 6.547262299464315, + "worker_end": 6.573474199402376, + "rx_cpu_seconds": 0.025992399896495044, + "packets": 1, + "lag_seconds": 5.451170199402377 + }, + { + "samples_received": 9043968, + "arrival_time": 1.130496, + "worker_start": 6.573474199402376, + "worker_end": 6.58050129947555, + "rx_cpu_seconds": 0.007027100073173642, + "packets": 0, + "lag_seconds": 5.45000529947555 + }, + { + "samples_received": 9109504, + "arrival_time": 1.138688, + "worker_start": 6.58050129947555, + "worker_end": 6.652164299514375, + "rx_cpu_seconds": 0.07166300003882498, + "packets": 0, + "lag_seconds": 5.513476299514375 + }, + { + "samples_received": 9175040, + "arrival_time": 1.14688, + "worker_start": 6.652164299514375, + "worker_end": 6.755091499428495, + "rx_cpu_seconds": 0.10292719991412014, + "packets": 0, + "lag_seconds": 5.608211499428496 + }, + { + "samples_received": 9240576, + "arrival_time": 1.155072, + "worker_start": 6.755091499428495, + "worker_end": 6.853973899393573, + "rx_cpu_seconds": 0.09888239996507764, + "packets": 0, + "lag_seconds": 5.698901899393572 + }, + { + "samples_received": 9306112, + "arrival_time": 1.163264, + "worker_start": 6.853973899393573, + "worker_end": 6.945567699389763, + "rx_cpu_seconds": 0.09159379999618977, + "packets": 0, + "lag_seconds": 5.782303699389763 + }, + { + "samples_received": 9371648, + "arrival_time": 1.171456, + "worker_start": 6.945567699389763, + "worker_end": 7.047769099481634, + "rx_cpu_seconds": 0.10220140009187162, + "packets": 0, + "lag_seconds": 5.876313099481634 + }, + { + "samples_received": 9437184, + "arrival_time": 1.179648, + "worker_start": 7.047769099481634, + "worker_end": 7.146922199412479, + "rx_cpu_seconds": 0.0991530999308452, + "packets": 0, + "lag_seconds": 5.967274199412479 + }, + { + "samples_received": 9502720, + "arrival_time": 1.18784, + "worker_start": 7.146922199412479, + "worker_end": 7.23564989947085, + "rx_cpu_seconds": 0.08872770005837083, + "packets": 0, + "lag_seconds": 6.047809899470851 + }, + { + "samples_received": 9568256, + "arrival_time": 1.196032, + "worker_start": 7.23564989947085, + "worker_end": 7.3267728994910115, + "rx_cpu_seconds": 0.09112300002016127, + "packets": 0, + "lag_seconds": 6.130740899491012 + }, + { + "samples_received": 9633792, + "arrival_time": 1.204224, + "worker_start": 7.3267728994910115, + "worker_end": 7.4184038994212145, + "rx_cpu_seconds": 0.09163099993020296, + "packets": 0, + "lag_seconds": 6.2141798994212145 + }, + { + "samples_received": 9699328, + "arrival_time": 1.212416, + "worker_start": 7.4184038994212145, + "worker_end": 7.491443999468579, + "rx_cpu_seconds": 0.07304010004736483, + "packets": 0, + "lag_seconds": 6.279027999468579 + }, + { + "samples_received": 9764864, + "arrival_time": 1.220608, + "worker_start": 7.491443999468579, + "worker_end": 7.590533299379281, + "rx_cpu_seconds": 0.09908929991070181, + "packets": 0, + "lag_seconds": 6.369925299379281 + }, + { + "samples_received": 9830400, + "arrival_time": 1.2288, + "worker_start": 7.590533299379281, + "worker_end": 7.666329999345585, + "rx_cpu_seconds": 0.075796699966304, + "packets": 0, + "lag_seconds": 6.4375299993455855 + }, + { + "samples_received": 9895936, + "arrival_time": 1.236992, + "worker_start": 7.666329999345585, + "worker_end": 7.703303999391615, + "rx_cpu_seconds": 0.03697400004602969, + "packets": 0, + "lag_seconds": 6.466311999391615 + }, + { + "samples_received": 9961472, + "arrival_time": 1.245184, + "worker_start": 7.703303999391615, + "worker_end": 7.750136499417245, + "rx_cpu_seconds": 0.046804700046777725, + "packets": 1, + "lag_seconds": 6.504952499417245 + }, + { + "samples_received": 10027008, + "arrival_time": 1.253376, + "worker_start": 7.750136499417245, + "worker_end": 7.776768499410942, + "rx_cpu_seconds": 0.02661079994868487, + "packets": 1, + "lag_seconds": 6.523392499410941 + }, + { + "samples_received": 10092544, + "arrival_time": 1.261568, + "worker_start": 7.776768499410942, + "worker_end": 7.783883199336238, + "rx_cpu_seconds": 0.007114699925296009, + "packets": 0, + "lag_seconds": 6.522315199336237 + }, + { + "samples_received": 10158080, + "arrival_time": 1.26976, + "worker_start": 7.783883199336238, + "worker_end": 7.811576699263647, + "rx_cpu_seconds": 0.027668299968354404, + "packets": 1, + "lag_seconds": 6.541816699263647 + }, + { + "samples_received": 10223616, + "arrival_time": 1.277952, + "worker_start": 7.811576699263647, + "worker_end": 7.837100899320326, + "rx_cpu_seconds": 0.02550270000938326, + "packets": 1, + "lag_seconds": 6.559148899320326 + }, + { + "samples_received": 10289152, + "arrival_time": 1.286144, + "worker_start": 7.837100899320326, + "worker_end": 7.844049499377839, + "rx_cpu_seconds": 0.006948600057512522, + "packets": 0, + "lag_seconds": 6.5579054993778385 + }, + { + "samples_received": 10354688, + "arrival_time": 1.294336, + "worker_start": 7.844049499377839, + "worker_end": 7.86750399939087, + "rx_cpu_seconds": 0.023430500063113868, + "packets": 1, + "lag_seconds": 6.57316799939087 + }, + { + "samples_received": 10420224, + "arrival_time": 1.302528, + "worker_start": 7.86750399939087, + "worker_end": 7.893649699406929, + "rx_cpu_seconds": 0.026123899966478348, + "packets": 1, + "lag_seconds": 6.591121699406929 + }, + { + "samples_received": 10485760, + "arrival_time": 1.31072, + "worker_start": 7.893649699406929, + "worker_end": 7.918350099477216, + "rx_cpu_seconds": 0.02467770001385361, + "packets": 1, + "lag_seconds": 6.607630099477216 + }, + { + "samples_received": 10551296, + "arrival_time": 1.318912, + "worker_start": 7.918350099477216, + "worker_end": 7.925436999540075, + "rx_cpu_seconds": 0.007086900062859058, + "packets": 0, + "lag_seconds": 6.606524999540075 + }, + { + "samples_received": 10616832, + "arrival_time": 1.327104, + "worker_start": 7.925436999540075, + "worker_end": 7.951364099637836, + "rx_cpu_seconds": 0.02571610000450164, + "packets": 1, + "lag_seconds": 6.624260099637835 + }, + { + "samples_received": 10682368, + "arrival_time": 1.335296, + "worker_start": 7.951364099637836, + "worker_end": 7.976631899604804, + "rx_cpu_seconds": 0.025267799966968596, + "packets": 0, + "lag_seconds": 6.641335899604805 + }, + { + "samples_received": 10747904, + "arrival_time": 1.343488, + "worker_start": 7.976631899604804, + "worker_end": 8.070742199554338, + "rx_cpu_seconds": 0.09411029994953424, + "packets": 0, + "lag_seconds": 6.727254199554339 + }, + { + "samples_received": 10813440, + "arrival_time": 1.35168, + "worker_start": 8.070742199554338, + "worker_end": 8.160739499501183, + "rx_cpu_seconds": 0.08999729994684458, + "packets": 0, + "lag_seconds": 6.809059499501183 + }, + { + "samples_received": 10878976, + "arrival_time": 1.359872, + "worker_start": 8.160739499501183, + "worker_end": 8.25190919941128, + "rx_cpu_seconds": 0.09116969991009682, + "packets": 0, + "lag_seconds": 6.89203719941128 + }, + { + "samples_received": 10944512, + "arrival_time": 1.368064, + "worker_start": 8.25190919941128, + "worker_end": 8.343894699363268, + "rx_cpu_seconds": 0.09198549995198846, + "packets": 0, + "lag_seconds": 6.975830699363268 + }, + { + "samples_received": 11010048, + "arrival_time": 1.376256, + "worker_start": 8.343894699363268, + "worker_end": 8.440360599321544, + "rx_cpu_seconds": 0.09646589995827526, + "packets": 0, + "lag_seconds": 7.064104599321544 + }, + { + "samples_received": 11075584, + "arrival_time": 1.384448, + "worker_start": 8.440360599321544, + "worker_end": 8.536300599349893, + "rx_cpu_seconds": 0.09594000002834946, + "packets": 0, + "lag_seconds": 7.151852599349893 + }, + { + "samples_received": 11141120, + "arrival_time": 1.39264, + "worker_start": 8.536300599349893, + "worker_end": 8.626015699359819, + "rx_cpu_seconds": 0.08971510000992566, + "packets": 0, + "lag_seconds": 7.233375699359819 + }, + { + "samples_received": 11206656, + "arrival_time": 1.400832, + "worker_start": 8.626015699359819, + "worker_end": 8.71886299935472, + "rx_cpu_seconds": 0.09284729999490082, + "packets": 0, + "lag_seconds": 7.318030999354719 + }, + { + "samples_received": 11272192, + "arrival_time": 1.409024, + "worker_start": 8.71886299935472, + "worker_end": 8.767925399363271, + "rx_cpu_seconds": 0.049062400008551776, + "packets": 0, + "lag_seconds": 7.358901399363271 + }, + { + "samples_received": 11337728, + "arrival_time": 1.417216, + "worker_start": 8.767925399363271, + "worker_end": 8.774558199344433, + "rx_cpu_seconds": 0.006632799981161952, + "packets": 0, + "lag_seconds": 7.3573421993444335 + }, + { + "samples_received": 11403264, + "arrival_time": 1.425408, + "worker_start": 8.774558199344433, + "worker_end": 8.8213240993286, + "rx_cpu_seconds": 0.046765899984166026, + "packets": 0, + "lag_seconds": 7.395916099328599 + }, + { + "samples_received": 11468800, + "arrival_time": 1.4336, + "worker_start": 8.8213240993286, + "worker_end": 8.83906529926066, + "rx_cpu_seconds": 0.017741199932061136, + "packets": 0, + "lag_seconds": 7.40546529926066 + }, + { + "samples_received": 11534336, + "arrival_time": 1.441792, + "worker_start": 8.83906529926066, + "worker_end": 8.881531999337717, + "rx_cpu_seconds": 0.04244330001529306, + "packets": 1, + "lag_seconds": 7.439739999337718 + }, + { + "samples_received": 11599872, + "arrival_time": 1.449984, + "worker_start": 8.881531999337717, + "worker_end": 8.888285499423041, + "rx_cpu_seconds": 0.006753500085324049, + "packets": 0, + "lag_seconds": 7.438301499423042 + }, + { + "samples_received": 11665408, + "arrival_time": 1.458176, + "worker_start": 8.888285499423041, + "worker_end": 8.912673099439822, + "rx_cpu_seconds": 0.024366799974814057, + "packets": 1, + "lag_seconds": 7.454497099439822 + }, + { + "samples_received": 11730944, + "arrival_time": 1.466368, + "worker_start": 8.912673099439822, + "worker_end": 8.937888099470406, + "rx_cpu_seconds": 0.02519330009818077, + "packets": 1, + "lag_seconds": 7.471520099470406 + }, + { + "samples_received": 11796480, + "arrival_time": 1.47456, + "worker_start": 8.937888099470406, + "worker_end": 8.944765699452951, + "rx_cpu_seconds": 0.00687759998254478, + "packets": 0, + "lag_seconds": 7.470205699452951 + }, + { + "samples_received": 11862016, + "arrival_time": 1.482752, + "worker_start": 8.944765699452951, + "worker_end": 8.968060799416385, + "rx_cpu_seconds": 0.023276899941265583, + "packets": 1, + "lag_seconds": 7.485308799416385 + }, + { + "samples_received": 11927552, + "arrival_time": 1.490944, + "worker_start": 8.968060799416385, + "worker_end": 8.993887399447381, + "rx_cpu_seconds": 0.02580519998446107, + "packets": 1, + "lag_seconds": 7.502943399447381 + }, + { + "samples_received": 11993088, + "arrival_time": 1.499136, + "worker_start": 8.993887399447381, + "worker_end": 9.018235999400027, + "rx_cpu_seconds": 0.024327399907633662, + "packets": 1, + "lag_seconds": 7.5190999994000265 + }, + { + "samples_received": 12058624, + "arrival_time": 1.507328, + "worker_start": 9.018235999400027, + "worker_end": 9.025266999386481, + "rx_cpu_seconds": 0.0070309999864548445, + "packets": 0, + "lag_seconds": 7.517938999386481 + }, + { + "samples_received": 12124160, + "arrival_time": 1.51552, + "worker_start": 9.025266999386481, + "worker_end": 9.048135799363486, + "rx_cpu_seconds": 0.02285049995407462, + "packets": 1, + "lag_seconds": 7.5326157993634855 + }, + { + "samples_received": 12189696, + "arrival_time": 1.523712, + "worker_start": 9.048135799363486, + "worker_end": 9.07254959946335, + "rx_cpu_seconds": 0.024214500095695257, + "packets": 1, + "lag_seconds": 7.548837599463351 + }, + { + "samples_received": 12255232, + "arrival_time": 1.531904, + "worker_start": 9.07254959946335, + "worker_end": 9.080546999474286, + "rx_cpu_seconds": 0.007997400010935962, + "packets": 0, + "lag_seconds": 7.5486429994742865 + }, + { + "samples_received": 12320768, + "arrival_time": 1.540096, + "worker_start": 9.080546999474286, + "worker_end": 9.166999299552522, + "rx_cpu_seconds": 0.08645230007823557, + "packets": 0, + "lag_seconds": 7.626903299552522 + }, + { + "samples_received": 12386304, + "arrival_time": 1.548288, + "worker_start": 9.166999299552522, + "worker_end": 9.258867199540369, + "rx_cpu_seconds": 0.09186789998784661, + "packets": 0, + "lag_seconds": 7.710579199540368 + }, + { + "samples_received": 12451840, + "arrival_time": 1.55648, + "worker_start": 9.258867199540369, + "worker_end": 9.358565699549622, + "rx_cpu_seconds": 0.09969850000925362, + "packets": 0, + "lag_seconds": 7.802085699549622 + }, + { + "samples_received": 12517376, + "arrival_time": 1.564672, + "worker_start": 9.358565699549622, + "worker_end": 9.450415499516062, + "rx_cpu_seconds": 0.0918497999664396, + "packets": 0, + "lag_seconds": 7.885743499516062 + }, + { + "samples_received": 12582912, + "arrival_time": 1.572864, + "worker_start": 9.450415499516062, + "worker_end": 9.55538469949574, + "rx_cpu_seconds": 0.1049691999796778, + "packets": 0, + "lag_seconds": 7.98252069949574 + }, + { + "samples_received": 12648448, + "arrival_time": 1.581056, + "worker_start": 9.55538469949574, + "worker_end": 9.6554052995129, + "rx_cpu_seconds": 0.10002060001716018, + "packets": 0, + "lag_seconds": 8.0743492995129 + }, + { + "samples_received": 12713984, + "arrival_time": 1.589248, + "worker_start": 9.6554052995129, + "worker_end": 9.775500199532367, + "rx_cpu_seconds": 0.12009490001946688, + "packets": 0, + "lag_seconds": 8.186252199532367 + }, + { + "samples_received": 12779520, + "arrival_time": 1.59744, + "worker_start": 9.775500199532367, + "worker_end": 9.877893299570538, + "rx_cpu_seconds": 0.10239310003817081, + "packets": 0, + "lag_seconds": 8.280453299570537 + }, + { + "samples_received": 12845056, + "arrival_time": 1.605632, + "worker_start": 9.877893299570538, + "worker_end": 9.960529999582327, + "rx_cpu_seconds": 0.0826367000117898, + "packets": 0, + "lag_seconds": 8.354897999582327 + }, + { + "samples_received": 12910592, + "arrival_time": 1.613824, + "worker_start": 9.960529999582327, + "worker_end": 10.056803099585927, + "rx_cpu_seconds": 0.09627310000360012, + "packets": 0, + "lag_seconds": 8.442979099585928 + }, + { + "samples_received": 12976128, + "arrival_time": 1.622016, + "worker_start": 10.056803099585927, + "worker_end": 10.145703999566145, + "rx_cpu_seconds": 0.08890089998021722, + "packets": 0, + "lag_seconds": 8.523687999566144 + }, + { + "samples_received": 13041664, + "arrival_time": 1.630208, + "worker_start": 10.145703999566145, + "worker_end": 10.19668619952467, + "rx_cpu_seconds": 0.0509821999585256, + "packets": 0, + "lag_seconds": 8.56647819952467 + }, + { + "samples_received": 13107200, + "arrival_time": 1.6384, + "worker_start": 10.19668619952467, + "worker_end": 10.2031736995636, + "rx_cpu_seconds": 0.006487500038929284, + "packets": 0, + "lag_seconds": 8.564773699563599 + }, + { + "samples_received": 13172736, + "arrival_time": 1.646592, + "worker_start": 10.2031736995636, + "worker_end": 10.245699199622727, + "rx_cpu_seconds": 0.042503700009547174, + "packets": 1, + "lag_seconds": 8.599107199622727 + }, + { + "samples_received": 13238272, + "arrival_time": 1.654784, + "worker_start": 10.245699199622727, + "worker_end": 10.269712099580325, + "rx_cpu_seconds": 0.023993900045752525, + "packets": 1, + "lag_seconds": 8.614928099580325 + }, + { + "samples_received": 13303808, + "arrival_time": 1.662976, + "worker_start": 10.269712099580325, + "worker_end": 10.276834399679906, + "rx_cpu_seconds": 0.00712230009958148, + "packets": 0, + "lag_seconds": 8.613858399679906 + }, + { + "samples_received": 13369344, + "arrival_time": 1.671168, + "worker_start": 10.276834399679906, + "worker_end": 10.300764899592146, + "rx_cpu_seconds": 0.023911199998110533, + "packets": 1, + "lag_seconds": 8.629596899592146 + }, + { + "samples_received": 13434880, + "arrival_time": 1.67936, + "worker_start": 10.300764899592146, + "worker_end": 10.324937299600101, + "rx_cpu_seconds": 0.024151899968273938, + "packets": 1, + "lag_seconds": 8.645577299600102 + }, + { + "samples_received": 13500416, + "arrival_time": 1.687552, + "worker_start": 10.324937299600101, + "worker_end": 10.351270399646133, + "rx_cpu_seconds": 0.026313000009395182, + "packets": 1, + "lag_seconds": 8.663718399646132 + }, + { + "samples_received": 13565952, + "arrival_time": 1.695744, + "worker_start": 10.351270399646133, + "worker_end": 10.358924999607957, + "rx_cpu_seconds": 0.007654599961824715, + "packets": 0, + "lag_seconds": 8.663180999607958 + }, + { + "samples_received": 13631488, + "arrival_time": 1.703936, + "worker_start": 10.358924999607957, + "worker_end": 10.382029299631945, + "rx_cpu_seconds": 0.023080599959939718, + "packets": 1, + "lag_seconds": 8.678093299631945 + }, + { + "samples_received": 13697024, + "arrival_time": 1.712128, + "worker_start": 10.382029299631945, + "worker_end": 10.405954399735897, + "rx_cpu_seconds": 0.02390410006046295, + "packets": 1, + "lag_seconds": 8.693826399735897 + }, + { + "samples_received": 13762560, + "arrival_time": 1.72032, + "worker_start": 10.405954399735897, + "worker_end": 10.413221199655204, + "rx_cpu_seconds": 0.007266799919307232, + "packets": 0, + "lag_seconds": 8.692901199655203 + }, + { + "samples_received": 13828096, + "arrival_time": 1.728512, + "worker_start": 10.413221199655204, + "worker_end": 10.438651399694614, + "rx_cpu_seconds": 0.025224599987268448, + "packets": 1, + "lag_seconds": 8.710139399694613 + }, + { + "samples_received": 13893632, + "arrival_time": 1.736704, + "worker_start": 10.438651399694614, + "worker_end": 10.471861599602967, + "rx_cpu_seconds": 0.03321019990835339, + "packets": 0, + "lag_seconds": 8.735157599602967 + }, + { + "samples_received": 13959168, + "arrival_time": 1.744896, + "worker_start": 10.471861599602967, + "worker_end": 10.565304699594385, + "rx_cpu_seconds": 0.09344309999141842, + "packets": 0, + "lag_seconds": 8.820408699594385 + }, + { + "samples_received": 14024704, + "arrival_time": 1.753088, + "worker_start": 10.565304699594385, + "worker_end": 10.656453199575886, + "rx_cpu_seconds": 0.09114849998150021, + "packets": 0, + "lag_seconds": 8.903365199575886 + }, + { + "samples_received": 14090240, + "arrival_time": 1.76128, + "worker_start": 10.656453199575886, + "worker_end": 10.746866099660515, + "rx_cpu_seconds": 0.09041290008462965, + "packets": 0, + "lag_seconds": 8.985586099660516 + }, + { + "samples_received": 14155776, + "arrival_time": 1.769472, + "worker_start": 10.746866099660515, + "worker_end": 10.837389399654462, + "rx_cpu_seconds": 0.09052329999394715, + "packets": 0, + "lag_seconds": 9.067917399654462 + }, + { + "samples_received": 14221312, + "arrival_time": 1.777664, + "worker_start": 10.837389399654462, + "worker_end": 10.93631779962056, + "rx_cpu_seconds": 0.09892839996609837, + "packets": 0, + "lag_seconds": 9.158653799620561 + }, + { + "samples_received": 14286848, + "arrival_time": 1.785856, + "worker_start": 10.93631779962056, + "worker_end": 11.03359479958494, + "rx_cpu_seconds": 0.09727699996437877, + "packets": 0, + "lag_seconds": 9.247738799584939 + }, + { + "samples_received": 14352384, + "arrival_time": 1.794048, + "worker_start": 11.03359479958494, + "worker_end": 11.126996299608841, + "rx_cpu_seconds": 0.09340150002390146, + "packets": 0, + "lag_seconds": 9.33294829960884 + }, + { + "samples_received": 14417920, + "arrival_time": 1.80224, + "worker_start": 11.126996299608841, + "worker_end": 11.223254399614639, + "rx_cpu_seconds": 0.09625810000579804, + "packets": 0, + "lag_seconds": 9.42101439961464 + }, + { + "samples_received": 14483456, + "arrival_time": 1.810432, + "worker_start": 11.223254399614639, + "worker_end": 11.25954749971465, + "rx_cpu_seconds": 0.03629310010001063, + "packets": 0, + "lag_seconds": 9.44911549971465 + }, + { + "samples_received": 14548992, + "arrival_time": 1.818624, + "worker_start": 11.25954749971465, + "worker_end": 11.275185399696461, + "rx_cpu_seconds": 0.015637899981811643, + "packets": 0, + "lag_seconds": 9.456561399696461 + }, + { + "samples_received": 14614528, + "arrival_time": 1.826816, + "worker_start": 11.275185399696461, + "worker_end": 11.291714799714505, + "rx_cpu_seconds": 0.016529400018043816, + "packets": 0, + "lag_seconds": 9.464898799714504 + }, + { + "samples_received": 14680064, + "arrival_time": 1.835008, + "worker_start": 11.291714799714505, + "worker_end": 11.339689599707022, + "rx_cpu_seconds": 0.04797479999251664, + "packets": 0, + "lag_seconds": 9.504681599707022 + }, + { + "samples_received": 14745600, + "arrival_time": 1.8432, + "worker_start": 11.339689599707022, + "worker_end": 11.414953499807275, + "rx_cpu_seconds": 0.07523880002554506, + "packets": 1, + "lag_seconds": 9.571753499807276 + }, + { + "samples_received": 14811136, + "arrival_time": 1.851392, + "worker_start": 11.414953499807275, + "worker_end": 11.421567199759416, + "rx_cpu_seconds": 0.0066136999521404505, + "packets": 0, + "lag_seconds": 9.570175199759415 + }, + { + "samples_received": 14876672, + "arrival_time": 1.859584, + "worker_start": 11.421567199759416, + "worker_end": 11.445759099799439, + "rx_cpu_seconds": 0.02417240000795573, + "packets": 1, + "lag_seconds": 9.586175099799439 + }, + { + "samples_received": 14942208, + "arrival_time": 1.867776, + "worker_start": 11.445759099799439, + "worker_end": 11.470068599920019, + "rx_cpu_seconds": 0.02428800007328391, + "packets": 1, + "lag_seconds": 9.60229259992002 + }, + { + "samples_received": 15007744, + "arrival_time": 1.875968, + "worker_start": 11.470068599920019, + "worker_end": 11.494685399935811, + "rx_cpu_seconds": 0.02459459996316582, + "packets": 1, + "lag_seconds": 9.61871739993581 + }, + { + "samples_received": 15073280, + "arrival_time": 1.88416, + "worker_start": 11.494685399935811, + "worker_end": 11.501596199938326, + "rx_cpu_seconds": 0.006910800002515316, + "packets": 0, + "lag_seconds": 9.617436199938327 + }, + { + "samples_received": 15138816, + "arrival_time": 1.892352, + "worker_start": 11.501596199938326, + "worker_end": 11.525211699896722, + "rx_cpu_seconds": 0.023593199905008078, + "packets": 1, + "lag_seconds": 9.632859699896722 + }, + { + "samples_received": 15204352, + "arrival_time": 1.900544, + "worker_start": 11.525211699896722, + "worker_end": 11.54982089997106, + "rx_cpu_seconds": 0.024588500033132732, + "packets": 1, + "lag_seconds": 9.64927689997106 + }, + { + "samples_received": 15269888, + "arrival_time": 1.908736, + "worker_start": 11.54982089997106, + "worker_end": 11.556894399931885, + "rx_cpu_seconds": 0.007073499960824847, + "packets": 0, + "lag_seconds": 9.648158399931885 + }, + { + "samples_received": 15335424, + "arrival_time": 1.916928, + "worker_start": 11.556894399931885, + "worker_end": 11.581111899934008, + "rx_cpu_seconds": 0.024196599959395826, + "packets": 1, + "lag_seconds": 9.664183899934008 + }, + { + "samples_received": 15400960, + "arrival_time": 1.92512, + "worker_start": 11.581111899934008, + "worker_end": 11.605219899917252, + "rx_cpu_seconds": 0.023893299978226423, + "packets": 1, + "lag_seconds": 9.680099899917252 + }, + { + "samples_received": 15466496, + "arrival_time": 1.933312, + "worker_start": 11.605219899917252, + "worker_end": 11.612366099849574, + "rx_cpu_seconds": 0.007146199932321906, + "packets": 0, + "lag_seconds": 9.679054099849573 + }, + { + "samples_received": 15532032, + "arrival_time": 1.941504, + "worker_start": 11.612366099849574, + "worker_end": 11.703455499846719, + "rx_cpu_seconds": 0.09108939999714494, + "packets": 0, + "lag_seconds": 9.761951499846719 + }, + { + "samples_received": 15597568, + "arrival_time": 1.949696, + "worker_start": 11.703455499846719, + "worker_end": 11.807921999840296, + "rx_cpu_seconds": 0.1044664999935776, + "packets": 0, + "lag_seconds": 9.858225999840297 + }, + { + "samples_received": 15663104, + "arrival_time": 1.957888, + "worker_start": 11.807921999840296, + "worker_end": 11.898363299791932, + "rx_cpu_seconds": 0.0904412999516353, + "packets": 0, + "lag_seconds": 9.940475299791931 + }, + { + "samples_received": 15728640, + "arrival_time": 1.96608, + "worker_start": 11.898363299791932, + "worker_end": 11.991836699781238, + "rx_cpu_seconds": 0.09347339998930693, + "packets": 0, + "lag_seconds": 10.025756699781239 + }, + { + "samples_received": 15794176, + "arrival_time": 1.974272, + "worker_start": 11.991836699781238, + "worker_end": 12.079643299810819, + "rx_cpu_seconds": 0.0878066000295803, + "packets": 0, + "lag_seconds": 10.10537129981082 + }, + { + "samples_received": 15859712, + "arrival_time": 1.982464, + "worker_start": 12.079643299810819, + "worker_end": 12.173502499710999, + "rx_cpu_seconds": 0.0938591999001801, + "packets": 0, + "lag_seconds": 10.191038499710999 + }, + { + "samples_received": 15925248, + "arrival_time": 1.990656, + "worker_start": 12.173502499710999, + "worker_end": 12.271142899764932, + "rx_cpu_seconds": 0.09764040005393326, + "packets": 0, + "lag_seconds": 10.280486899764933 + }, + { + "samples_received": 15990784, + "arrival_time": 1.998848, + "worker_start": 12.271142899764932, + "worker_end": 12.366681099760577, + "rx_cpu_seconds": 0.09553819999564439, + "packets": 0, + "lag_seconds": 10.367833099760576 + }, + { + "samples_received": 16056320, + "arrival_time": 2.00704, + "worker_start": 12.366681099760577, + "worker_end": 12.444505299798443, + "rx_cpu_seconds": 0.07782420003786683, + "packets": 0, + "lag_seconds": 10.437465299798443 + }, + { + "samples_received": 16121856, + "arrival_time": 2.015232, + "worker_start": 12.444505299798443, + "worker_end": 12.533943799797676, + "rx_cpu_seconds": 0.08943849999923259, + "packets": 0, + "lag_seconds": 10.518711799797675 + }, + { + "samples_received": 16187392, + "arrival_time": 2.023424, + "worker_start": 12.533943799797676, + "worker_end": 12.624841699850045, + "rx_cpu_seconds": 0.09089790005236864, + "packets": 0, + "lag_seconds": 10.601417699850044 + }, + { + "samples_received": 16252928, + "arrival_time": 2.031616, + "worker_start": 12.624841699850045, + "worker_end": 12.685408999918259, + "rx_cpu_seconds": 0.060567300068214536, + "packets": 0, + "lag_seconds": 10.65379299991826 + }, + { + "samples_received": 16318464, + "arrival_time": 2.039808, + "worker_start": 12.685408999918259, + "worker_end": 12.764684699949107, + "rx_cpu_seconds": 0.07927570003084838, + "packets": 0, + "lag_seconds": 10.724876699949107 + }, + { + "samples_received": 16384000, + "arrival_time": 2.048, + "worker_start": 12.764684699949107, + "worker_end": 12.800624599920816, + "rx_cpu_seconds": 0.0359170000301674, + "packets": 1, + "lag_seconds": 10.752624599920816 + }, + { + "samples_received": 16449536, + "arrival_time": 2.056192, + "worker_start": 12.800624599920816, + "worker_end": 12.825436899911843, + "rx_cpu_seconds": 0.024791299947537482, + "packets": 1, + "lag_seconds": 10.769244899911843 + }, + { + "samples_received": 16515072, + "arrival_time": 2.064384, + "worker_start": 12.825436899911843, + "worker_end": 12.848880699959814, + "rx_cpu_seconds": 0.023425400024279952, + "packets": 1, + "lag_seconds": 10.784496699959814 + }, + { + "samples_received": 16580608, + "arrival_time": 2.072576, + "worker_start": 12.848880699959814, + "worker_end": 12.855666799944125, + "rx_cpu_seconds": 0.006786099984310567, + "packets": 0, + "lag_seconds": 10.783090799944125 + }, + { + "samples_received": 16646144, + "arrival_time": 2.080768, + "worker_start": 12.855666799944125, + "worker_end": 12.878928399885304, + "rx_cpu_seconds": 0.02324050001334399, + "packets": 1, + "lag_seconds": 10.798160399885305 + }, + { + "samples_received": 16711680, + "arrival_time": 2.08896, + "worker_start": 12.878928399885304, + "worker_end": 12.903988299899034, + "rx_cpu_seconds": 0.025039700092747808, + "packets": 1, + "lag_seconds": 10.815028299899033 + }, + { + "samples_received": 16777216, + "arrival_time": 2.097152, + "worker_start": 12.903988299899034, + "worker_end": 12.911430099870309, + "rx_cpu_seconds": 0.007441799971275032, + "packets": 0, + "lag_seconds": 10.81427809987031 + }, + { + "samples_received": 16842752, + "arrival_time": 2.105344, + "worker_start": 12.911430099870309, + "worker_end": 12.93606169988238, + "rx_cpu_seconds": 0.02460940007586032, + "packets": 1, + "lag_seconds": 10.83071769988238 + }, + { + "samples_received": 16908288, + "arrival_time": 2.113536, + "worker_start": 12.93606169988238, + "worker_end": 12.96184749995195, + "rx_cpu_seconds": 0.02576240000780672, + "packets": 1, + "lag_seconds": 10.84831149995195 + }, + { + "samples_received": 16973824, + "arrival_time": 2.121728, + "worker_start": 12.96184749995195, + "worker_end": 12.968915999991118, + "rx_cpu_seconds": 0.007068500039167702, + "packets": 0, + "lag_seconds": 10.847187999991117 + }, + { + "samples_received": 17039360, + "arrival_time": 2.12992, + "worker_start": 12.968915999991118, + "worker_end": 12.992655000074997, + "rx_cpu_seconds": 0.023465099977329373, + "packets": 1, + "lag_seconds": 10.862735000074997 + }, + { + "samples_received": 17104896, + "arrival_time": 2.138112, + "worker_start": 12.992655000074997, + "worker_end": 13.036215800101168, + "rx_cpu_seconds": 0.04356080002617091, + "packets": 0, + "lag_seconds": 10.898103800101168 + }, + { + "samples_received": 17170432, + "arrival_time": 2.146304, + "worker_start": 13.036215800101168, + "worker_end": 13.129842500093623, + "rx_cpu_seconds": 0.09362669999245554, + "packets": 0, + "lag_seconds": 10.983538500093623 + }, + { + "samples_received": 17235968, + "arrival_time": 2.154496, + "worker_start": 13.129842500093623, + "worker_end": 13.22532280011405, + "rx_cpu_seconds": 0.09548030002042651, + "packets": 0, + "lag_seconds": 11.07082680011405 + }, + { + "samples_received": 17301504, + "arrival_time": 2.162688, + "worker_start": 13.22532280011405, + "worker_end": 13.326703100123673, + "rx_cpu_seconds": 0.10138030000962317, + "packets": 0, + "lag_seconds": 11.164015100123674 + }, + { + "samples_received": 17367040, + "arrival_time": 2.17088, + "worker_start": 13.326703100123673, + "worker_end": 13.417879800087071, + "rx_cpu_seconds": 0.09117669996339828, + "packets": 0, + "lag_seconds": 11.246999800087071 + }, + { + "samples_received": 17432576, + "arrival_time": 2.179072, + "worker_start": 13.417879800087071, + "worker_end": 13.513877200086831, + "rx_cpu_seconds": 0.09599739999976009, + "packets": 0, + "lag_seconds": 11.334805200086832 + }, + { + "samples_received": 17498112, + "arrival_time": 2.187264, + "worker_start": 13.513877200086831, + "worker_end": 13.61341640004725, + "rx_cpu_seconds": 0.09953919996041805, + "packets": 0, + "lag_seconds": 11.42615240004725 + }, + { + "samples_received": 17563648, + "arrival_time": 2.195456, + "worker_start": 13.61341640004725, + "worker_end": 13.707184900071702, + "rx_cpu_seconds": 0.0937685000244528, + "packets": 0, + "lag_seconds": 11.511728900071702 + }, + { + "samples_received": 17629184, + "arrival_time": 2.203648, + "worker_start": 13.707184900071702, + "worker_end": 13.781553099987327, + "rx_cpu_seconds": 0.07436819991562515, + "packets": 0, + "lag_seconds": 11.577905099987328 + }, + { + "samples_received": 17694720, + "arrival_time": 2.21184, + "worker_start": 13.781553099987327, + "worker_end": 13.827473899939328, + "rx_cpu_seconds": 0.04592079995200038, + "packets": 0, + "lag_seconds": 11.615633899939327 + }, + { + "samples_received": 17760256, + "arrival_time": 2.220032, + "worker_start": 13.827473899939328, + "worker_end": 13.845405299922682, + "rx_cpu_seconds": 0.017931399983353913, + "packets": 0, + "lag_seconds": 11.625373299922682 + }, + { + "samples_received": 17825792, + "arrival_time": 2.228224, + "worker_start": 13.845405299922682, + "worker_end": 13.88402509992779, + "rx_cpu_seconds": 0.03861980000510812, + "packets": 0, + "lag_seconds": 11.655801099927789 + }, + { + "samples_received": 17891328, + "arrival_time": 2.236416, + "worker_start": 13.88402509992779, + "worker_end": 13.905481999980516, + "rx_cpu_seconds": 0.02145690005272627, + "packets": 0, + "lag_seconds": 11.669065999980516 + }, + { + "samples_received": 17956864, + "arrival_time": 2.244608, + "worker_start": 13.905481999980516, + "worker_end": 13.969119500143684, + "rx_cpu_seconds": 0.06361560011282563, + "packets": 1, + "lag_seconds": 11.724511500143684 + }, + { + "samples_received": 18022400, + "arrival_time": 2.2528, + "worker_start": 13.969119500143684, + "worker_end": 13.995637900203697, + "rx_cpu_seconds": 0.02649870002642274, + "packets": 1, + "lag_seconds": 11.742837900203696 + }, + { + "samples_received": 18087936, + "arrival_time": 2.260992, + "worker_start": 13.995637900203697, + "worker_end": 14.002528400168053, + "rx_cpu_seconds": 0.006890499964356422, + "packets": 0, + "lag_seconds": 11.741536400168053 + }, + { + "samples_received": 18153472, + "arrival_time": 2.269184, + "worker_start": 14.002528400168053, + "worker_end": 14.02671370015782, + "rx_cpu_seconds": 0.024165199953131378, + "packets": 1, + "lag_seconds": 11.757529700157821 + }, + { + "samples_received": 18219008, + "arrival_time": 2.277376, + "worker_start": 14.02671370015782, + "worker_end": 14.050883500145979, + "rx_cpu_seconds": 0.024148999946191907, + "packets": 1, + "lag_seconds": 11.773507500145978 + }, + { + "samples_received": 18284544, + "arrival_time": 2.285568, + "worker_start": 14.050883500145979, + "worker_end": 14.058185000096678, + "rx_cpu_seconds": 0.007301499950699508, + "packets": 0, + "lag_seconds": 11.772617000096679 + }, + { + "samples_received": 18350080, + "arrival_time": 2.29376, + "worker_start": 14.058185000096678, + "worker_end": 14.082363900154128, + "rx_cpu_seconds": 0.024151400080882013, + "packets": 1, + "lag_seconds": 11.78860390015413 + }, + { + "samples_received": 18415616, + "arrival_time": 2.301952, + "worker_start": 14.082363900154128, + "worker_end": 14.106074700139693, + "rx_cpu_seconds": 0.023691399954259396, + "packets": 1, + "lag_seconds": 11.804122700139693 + }, + { + "samples_received": 18481152, + "arrival_time": 2.310144, + "worker_start": 14.106074700139693, + "worker_end": 14.112972400158874, + "rx_cpu_seconds": 0.006897700019180775, + "packets": 0, + "lag_seconds": 11.802828400158873 + }, + { + "samples_received": 18546688, + "arrival_time": 2.318336, + "worker_start": 14.112972400158874, + "worker_end": 14.136593700161434, + "rx_cpu_seconds": 0.023600999964401126, + "packets": 1, + "lag_seconds": 11.818257700161434 + }, + { + "samples_received": 18612224, + "arrival_time": 2.326528, + "worker_start": 14.136593700161434, + "worker_end": 14.162574300200909, + "rx_cpu_seconds": 0.025767000042833388, + "packets": 1, + "lag_seconds": 11.836046300200909 + }, + { + "samples_received": 18677760, + "arrival_time": 2.33472, + "worker_start": 14.162574300200909, + "worker_end": 14.18667800015141, + "rx_cpu_seconds": 0.024103699950501323, + "packets": 0, + "lag_seconds": 11.85195800015141 + }, + { + "samples_received": 18743296, + "arrival_time": 2.342912, + "worker_start": 14.18667800015141, + "worker_end": 14.27673750022263, + "rx_cpu_seconds": 0.0900595000712201, + "packets": 0, + "lag_seconds": 11.93382550022263 + }, + { + "samples_received": 18808832, + "arrival_time": 2.351104, + "worker_start": 14.27673750022263, + "worker_end": 14.368601900300241, + "rx_cpu_seconds": 0.09186440007761121, + "packets": 0, + "lag_seconds": 12.017497900300242 + }, + { + "samples_received": 18874368, + "arrival_time": 2.359296, + "worker_start": 14.368601900300241, + "worker_end": 14.462775300381004, + "rx_cpu_seconds": 0.0941734000807628, + "packets": 0, + "lag_seconds": 12.103479300381004 + }, + { + "samples_received": 18939904, + "arrival_time": 2.367488, + "worker_start": 14.462775300381004, + "worker_end": 14.547289200484052, + "rx_cpu_seconds": 0.08451390010304749, + "packets": 0, + "lag_seconds": 12.179801200484052 + }, + { + "samples_received": 19005440, + "arrival_time": 2.37568, + "worker_start": 14.547289200484052, + "worker_end": 14.642110300490863, + "rx_cpu_seconds": 0.09482110000681132, + "packets": 0, + "lag_seconds": 12.266430300490864 + }, + { + "samples_received": 19070976, + "arrival_time": 2.383872, + "worker_start": 14.642110300490863, + "worker_end": 14.732918900445334, + "rx_cpu_seconds": 0.09080859995447099, + "packets": 0, + "lag_seconds": 12.349046900445334 + }, + { + "samples_received": 19136512, + "arrival_time": 2.392064, + "worker_start": 14.732918900445334, + "worker_end": 14.815977600527226, + "rx_cpu_seconds": 0.08305870008189231, + "packets": 0, + "lag_seconds": 12.423913600527227 + }, + { + "samples_received": 19202048, + "arrival_time": 2.400256, + "worker_start": 14.815977600527226, + "worker_end": 14.905035900541812, + "rx_cpu_seconds": 0.08905830001458526, + "packets": 0, + "lag_seconds": 12.504779900541811 + }, + { + "samples_received": 19267584, + "arrival_time": 2.408448, + "worker_start": 14.905035900541812, + "worker_end": 14.964996800532795, + "rx_cpu_seconds": 0.05996089999098331, + "packets": 0, + "lag_seconds": 12.556548800532795 + }, + { + "samples_received": 19333120, + "arrival_time": 2.41664, + "worker_start": 14.964996800532795, + "worker_end": 15.00229070056998, + "rx_cpu_seconds": 0.03729390003718436, + "packets": 0, + "lag_seconds": 12.585650700569978 + }, + { + "samples_received": 19398656, + "arrival_time": 2.424832, + "worker_start": 15.00229070056998, + "worker_end": 15.059143300641558, + "rx_cpu_seconds": 0.05685260007157922, + "packets": 0, + "lag_seconds": 12.634311300641558 + }, + { + "samples_received": 19464192, + "arrival_time": 2.433024, + "worker_start": 15.059143300641558, + "worker_end": 15.12957890064758, + "rx_cpu_seconds": 0.07043560000602156, + "packets": 0, + "lag_seconds": 12.69655490064758 + }, + { + "samples_received": 19529728, + "arrival_time": 2.441216, + "worker_start": 15.12957890064758, + "worker_end": 15.182461300639666, + "rx_cpu_seconds": 0.05285960005130619, + "packets": 1, + "lag_seconds": 12.741245300639665 + }, + { + "samples_received": 19595264, + "arrival_time": 2.449408, + "worker_start": 15.182461300639666, + "worker_end": 15.18926180061721, + "rx_cpu_seconds": 0.00680049997754395, + "packets": 0, + "lag_seconds": 12.73985380061721 + }, + { + "samples_received": 19660800, + "arrival_time": 2.4576, + "worker_start": 15.18926180061721, + "worker_end": 15.212291600655995, + "rx_cpu_seconds": 0.023006599978543818, + "packets": 1, + "lag_seconds": 12.754691600655995 + }, + { + "samples_received": 19726336, + "arrival_time": 2.465792, + "worker_start": 15.212291600655995, + "worker_end": 15.236575300580121, + "rx_cpu_seconds": 0.02426249999552965, + "packets": 1, + "lag_seconds": 12.77078330058012 + }, + { + "samples_received": 19791872, + "arrival_time": 2.473984, + "worker_start": 15.236575300580121, + "worker_end": 15.243630100631385, + "rx_cpu_seconds": 0.007054800051264465, + "packets": 0, + "lag_seconds": 12.769646100631386 + }, + { + "samples_received": 19857408, + "arrival_time": 2.482176, + "worker_start": 15.243630100631385, + "worker_end": 15.269364300657294, + "rx_cpu_seconds": 0.02571319998241961, + "packets": 1, + "lag_seconds": 12.787188300657295 + }, + { + "samples_received": 19922944, + "arrival_time": 2.490368, + "worker_start": 15.269364300657294, + "worker_end": 15.293858700672395, + "rx_cpu_seconds": 0.024470700067467988, + "packets": 1, + "lag_seconds": 12.803490700672395 + }, + { + "samples_received": 19988480, + "arrival_time": 2.49856, + "worker_start": 15.293858700672395, + "worker_end": 15.301238700755171, + "rx_cpu_seconds": 0.00738000008277595, + "packets": 0, + "lag_seconds": 12.802678700755171 + }, + { + "samples_received": 20054016, + "arrival_time": 2.506752, + "worker_start": 15.301238700755171, + "worker_end": 15.32573920081672, + "rx_cpu_seconds": 0.02447619999293238, + "packets": 1, + "lag_seconds": 12.81898720081672 + }, + { + "samples_received": 20119552, + "arrival_time": 2.514944, + "worker_start": 15.32573920081672, + "worker_end": 15.350787000738315, + "rx_cpu_seconds": 0.02502719999756664, + "packets": 1, + "lag_seconds": 12.835843000738315 + }, + { + "samples_received": 20185088, + "arrival_time": 2.523136, + "worker_start": 15.350787000738315, + "worker_end": 15.37690930069261, + "rx_cpu_seconds": 0.02591950003989041, + "packets": 1, + "lag_seconds": 12.853773300692609 + }, + { + "samples_received": 20250624, + "arrival_time": 2.531328, + "worker_start": 15.37690930069261, + "worker_end": 15.38393650065013, + "rx_cpu_seconds": 0.00702719995751977, + "packets": 0, + "lag_seconds": 12.85260850065013 + }, + { + "samples_received": 20316160, + "arrival_time": 2.53952, + "worker_start": 15.38393650065013, + "worker_end": 15.457267800586528, + "rx_cpu_seconds": 0.07333129993639886, + "packets": 0, + "lag_seconds": 12.917747800586529 + }, + { + "samples_received": 20381696, + "arrival_time": 2.547712, + "worker_start": 15.457267800586528, + "worker_end": 15.565818500596329, + "rx_cpu_seconds": 0.1085507000098005, + "packets": 0, + "lag_seconds": 13.018106500596328 + }, + { + "samples_received": 20447232, + "arrival_time": 2.555904, + "worker_start": 15.565818500596329, + "worker_end": 15.661180200528584, + "rx_cpu_seconds": 0.09536169993225485, + "packets": 0, + "lag_seconds": 13.105276200528584 + }, + { + "samples_received": 20512768, + "arrival_time": 2.564096, + "worker_start": 15.661180200528584, + "worker_end": 15.768414000522576, + "rx_cpu_seconds": 0.10723379999399185, + "packets": 0, + "lag_seconds": 13.204318000522576 + }, + { + "samples_received": 20578304, + "arrival_time": 2.572288, + "worker_start": 15.768414000522576, + "worker_end": 15.864325700568266, + "rx_cpu_seconds": 0.09591170004568994, + "packets": 0, + "lag_seconds": 13.292037700568265 + }, + { + "samples_received": 20643840, + "arrival_time": 2.58048, + "worker_start": 15.864325700568266, + "worker_end": 15.960555400590643, + "rx_cpu_seconds": 0.09622970002237707, + "packets": 0, + "lag_seconds": 13.380075400590643 + }, + { + "samples_received": 20709376, + "arrival_time": 2.588672, + "worker_start": 15.960555400590643, + "worker_end": 16.053440600641302, + "rx_cpu_seconds": 0.09288520005065948, + "packets": 0, + "lag_seconds": 13.464768600641303 + }, + { + "samples_received": 20774912, + "arrival_time": 2.596864, + "worker_start": 16.053440600641302, + "worker_end": 16.148348800612844, + "rx_cpu_seconds": 0.09490819997154176, + "packets": 0, + "lag_seconds": 13.551484800612844 + }, + { + "samples_received": 20840448, + "arrival_time": 2.605056, + "worker_start": 16.148348800612844, + "worker_end": 16.22660310054966, + "rx_cpu_seconds": 0.0782542999368161, + "packets": 0, + "lag_seconds": 13.62154710054966 + }, + { + "samples_received": 20905984, + "arrival_time": 2.613248, + "worker_start": 16.22660310054966, + "worker_end": 16.26954360062559, + "rx_cpu_seconds": 0.04294050007592887, + "packets": 0, + "lag_seconds": 13.656295600625588 + }, + { + "samples_received": 20971520, + "arrival_time": 2.62144, + "worker_start": 16.26954360062559, + "worker_end": 16.335012300646163, + "rx_cpu_seconds": 0.06546870002057403, + "packets": 0, + "lag_seconds": 13.713572300646163 + }, + { + "samples_received": 21037056, + "arrival_time": 2.629632, + "worker_start": 16.335012300646163, + "worker_end": 16.341799800641134, + "rx_cpu_seconds": 0.006787499994970858, + "packets": 0, + "lag_seconds": 13.712167800641133 + }, + { + "samples_received": 21102592, + "arrival_time": 2.637824, + "worker_start": 16.341799800641134, + "worker_end": 16.34811330063571, + "rx_cpu_seconds": 0.006313499994575977, + "packets": 0, + "lag_seconds": 13.71028930063571 + }, + { + "samples_received": 21168128, + "arrival_time": 2.646016, + "worker_start": 16.34811330063571, + "worker_end": 16.3915589005996, + "rx_cpu_seconds": 0.04342340002767742, + "packets": 1, + "lag_seconds": 13.745542900599599 + }, + { + "samples_received": 21233664, + "arrival_time": 2.654208, + "worker_start": 16.3915589005996, + "worker_end": 16.41630930058495, + "rx_cpu_seconds": 0.02472800004761666, + "packets": 1, + "lag_seconds": 13.762101300584948 + }, + { + "samples_received": 21299200, + "arrival_time": 2.6624, + "worker_start": 16.41630930058495, + "worker_end": 16.42350080051296, + "rx_cpu_seconds": 0.00719149992801249, + "packets": 0, + "lag_seconds": 13.761100800512962 + }, + { + "samples_received": 21364736, + "arrival_time": 2.670592, + "worker_start": 16.42350080051296, + "worker_end": 16.447706200539365, + "rx_cpu_seconds": 0.024183699977584183, + "packets": 1, + "lag_seconds": 13.777114200539366 + }, + { + "samples_received": 21430272, + "arrival_time": 2.678784, + "worker_start": 16.447706200539365, + "worker_end": 16.472289500532902, + "rx_cpu_seconds": 0.024559800047427416, + "packets": 1, + "lag_seconds": 13.793505500532902 + }, + { + "samples_received": 21495808, + "arrival_time": 2.686976, + "worker_start": 16.472289500532902, + "worker_end": 16.479187100434906, + "rx_cpu_seconds": 0.0068975999020040035, + "packets": 0, + "lag_seconds": 13.792211100434907 + }, + { + "samples_received": 21561344, + "arrival_time": 2.695168, + "worker_start": 16.479187100434906, + "worker_end": 16.503577300471484, + "rx_cpu_seconds": 0.02436939999461174, + "packets": 1, + "lag_seconds": 13.808409300471485 + }, + { + "samples_received": 21626880, + "arrival_time": 2.70336, + "worker_start": 16.503577300471484, + "worker_end": 16.529720300466984, + "rx_cpu_seconds": 0.026122600072994828, + "packets": 1, + "lag_seconds": 13.826360300466984 + }, + { + "samples_received": 21692416, + "arrival_time": 2.711552, + "worker_start": 16.529720300466984, + "worker_end": 16.55459820049186, + "rx_cpu_seconds": 0.024856099975295365, + "packets": 1, + "lag_seconds": 13.843046200491859 + }, + { + "samples_received": 21757952, + "arrival_time": 2.719744, + "worker_start": 16.55459820049186, + "worker_end": 16.562065200538605, + "rx_cpu_seconds": 0.007467000046744943, + "packets": 0, + "lag_seconds": 13.842321200538604 + }, + { + "samples_received": 21823488, + "arrival_time": 2.727936, + "worker_start": 16.562065200538605, + "worker_end": 16.58641660051257, + "rx_cpu_seconds": 0.024132999940775335, + "packets": 1, + "lag_seconds": 13.858480600512571 + }, + { + "samples_received": 21889024, + "arrival_time": 2.736128, + "worker_start": 16.58641660051257, + "worker_end": 16.610584800488546, + "rx_cpu_seconds": 0.024168199975974858, + "packets": 0, + "lag_seconds": 13.874456800488545 + }, + { + "samples_received": 21954560, + "arrival_time": 2.74432, + "worker_start": 16.610584800488546, + "worker_end": 16.707264100558355, + "rx_cpu_seconds": 0.09667930006980896, + "packets": 0, + "lag_seconds": 13.962944100558355 + }, + { + "samples_received": 22020096, + "arrival_time": 2.752512, + "worker_start": 16.707264100558355, + "worker_end": 16.796510300490304, + "rx_cpu_seconds": 0.08924619993194938, + "packets": 0, + "lag_seconds": 14.043998300490305 + }, + { + "samples_received": 22085632, + "arrival_time": 2.760704, + "worker_start": 16.796510300490304, + "worker_end": 16.909064500483915, + "rx_cpu_seconds": 0.11255419999361038, + "packets": 0, + "lag_seconds": 14.148360500483914 + }, + { + "samples_received": 22151168, + "arrival_time": 2.768896, + "worker_start": 16.909064500483915, + "worker_end": 17.00666510046762, + "rx_cpu_seconds": 0.09760059998370707, + "packets": 0, + "lag_seconds": 14.237769100467622 + }, + { + "samples_received": 22216704, + "arrival_time": 2.777088, + "worker_start": 17.00666510046762, + "worker_end": 17.094013800502985, + "rx_cpu_seconds": 0.08734870003536344, + "packets": 0, + "lag_seconds": 14.316925800502986 + }, + { + "samples_received": 22282240, + "arrival_time": 2.78528, + "worker_start": 17.094013800502985, + "worker_end": 17.192236400566294, + "rx_cpu_seconds": 0.09822260006330907, + "packets": 0, + "lag_seconds": 14.406956400566294 + }, + { + "samples_received": 22347776, + "arrival_time": 2.793472, + "worker_start": 17.192236400566294, + "worker_end": 17.286253100501604, + "rx_cpu_seconds": 0.09401669993530959, + "packets": 0, + "lag_seconds": 14.492781100501604 + }, + { + "samples_received": 22413312, + "arrival_time": 2.801664, + "worker_start": 17.286253100501604, + "worker_end": 17.370209100547477, + "rx_cpu_seconds": 0.08395600004587322, + "packets": 0, + "lag_seconds": 14.568545100547476 + }, + { + "samples_received": 22478848, + "arrival_time": 2.809856, + "worker_start": 17.370209100547477, + "worker_end": 17.428875400459624, + "rx_cpu_seconds": 0.058666299912147224, + "packets": 0, + "lag_seconds": 14.619019400459624 + }, + { + "samples_received": 22544384, + "arrival_time": 2.818048, + "worker_start": 17.428875400459624, + "worker_end": 17.53516290046577, + "rx_cpu_seconds": 0.10628750000614673, + "packets": 0, + "lag_seconds": 14.71711490046577 + }, + { + "samples_received": 22609920, + "arrival_time": 2.82624, + "worker_start": 17.53516290046577, + "worker_end": 17.61656300049112, + "rx_cpu_seconds": 0.08140010002534837, + "packets": 0, + "lag_seconds": 14.790323000491119 + }, + { + "samples_received": 22675456, + "arrival_time": 2.834432, + "worker_start": 17.61656300049112, + "worker_end": 17.69680040051066, + "rx_cpu_seconds": 0.08023740001954138, + "packets": 0, + "lag_seconds": 14.862368400510661 + }, + { + "samples_received": 22740992, + "arrival_time": 2.842624, + "worker_start": 17.69680040051066, + "worker_end": 17.747735300458267, + "rx_cpu_seconds": 0.05091089999768883, + "packets": 1, + "lag_seconds": 14.905111300458266 + }, + { + "samples_received": 22806528, + "arrival_time": 2.850816, + "worker_start": 17.747735300458267, + "worker_end": 17.755106000470228, + "rx_cpu_seconds": 0.007370700011961162, + "packets": 0, + "lag_seconds": 14.904290000470228 + }, + { + "samples_received": 22872064, + "arrival_time": 2.859008, + "worker_start": 17.755106000470228, + "worker_end": 17.78033770051156, + "rx_cpu_seconds": 0.02520779997576028, + "packets": 1, + "lag_seconds": 14.92132970051156 + }, + { + "samples_received": 22937600, + "arrival_time": 2.8672, + "worker_start": 17.78033770051156, + "worker_end": 17.805265700568675, + "rx_cpu_seconds": 0.024907700018957257, + "packets": 1, + "lag_seconds": 14.938065700568675 + }, + { + "samples_received": 23003136, + "arrival_time": 2.875392, + "worker_start": 17.805265700568675, + "worker_end": 17.811884700561173, + "rx_cpu_seconds": 0.006618999992497265, + "packets": 0, + "lag_seconds": 14.936492700561173 + }, + { + "samples_received": 23068672, + "arrival_time": 2.883584, + "worker_start": 17.811884700561173, + "worker_end": 17.83613590047066, + "rx_cpu_seconds": 0.024228199967183173, + "packets": 1, + "lag_seconds": 14.95255190047066 + }, + { + "samples_received": 23134208, + "arrival_time": 2.891776, + "worker_start": 17.83613590047066, + "worker_end": 17.860813600484512, + "rx_cpu_seconds": 0.024659499991685152, + "packets": 1, + "lag_seconds": 14.969037600484512 + }, + { + "samples_received": 23199744, + "arrival_time": 2.899968, + "worker_start": 17.860813600484512, + "worker_end": 17.88680960040842, + "rx_cpu_seconds": 0.025973299983888865, + "packets": 1, + "lag_seconds": 14.98684160040842 + }, + { + "samples_received": 23265280, + "arrival_time": 2.90816, + "worker_start": 17.88680960040842, + "worker_end": 17.893798200421266, + "rx_cpu_seconds": 0.006988600012846291, + "packets": 0, + "lag_seconds": 14.985638200421265 + }, + { + "samples_received": 23330816, + "arrival_time": 2.916352, + "worker_start": 17.893798200421266, + "worker_end": 17.917637200451686, + "rx_cpu_seconds": 0.02381809998769313, + "packets": 1, + "lag_seconds": 15.001285200451687 + }, + { + "samples_received": 23396352, + "arrival_time": 2.924544, + "worker_start": 17.917637200451686, + "worker_end": 17.943737500471293, + "rx_cpu_seconds": 0.025881699984893203, + "packets": 1, + "lag_seconds": 15.019193500471292 + }, + { + "samples_received": 23461888, + "arrival_time": 2.932736, + "worker_start": 17.943737500471293, + "worker_end": 17.95085370040801, + "rx_cpu_seconds": 0.007116199936717749, + "packets": 0, + "lag_seconds": 15.01811770040801 + }, + { + "samples_received": 23527424, + "arrival_time": 2.940928, + "worker_start": 17.95085370040801, + "worker_end": 18.049960600452728, + "rx_cpu_seconds": 0.0991069000447169, + "packets": 0, + "lag_seconds": 15.109032600452728 + }, + { + "samples_received": 23592960, + "arrival_time": 2.94912, + "worker_start": 18.049960600452728, + "worker_end": 18.14350470051472, + "rx_cpu_seconds": 0.09354410006199032, + "packets": 0, + "lag_seconds": 15.194384700514718 + }, + { + "samples_received": 23658496, + "arrival_time": 2.957312, + "worker_start": 18.14350470051472, + "worker_end": 18.234227300512835, + "rx_cpu_seconds": 0.0907225999981165, + "packets": 0, + "lag_seconds": 15.276915300512835 + }, + { + "samples_received": 23724032, + "arrival_time": 2.965504, + "worker_start": 18.234227300512835, + "worker_end": 18.3273210005213, + "rx_cpu_seconds": 0.09309370000846684, + "packets": 0, + "lag_seconds": 15.361817000521302 + }, + { + "samples_received": 23789568, + "arrival_time": 2.973696, + "worker_start": 18.3273210005213, + "worker_end": 18.419177100535713, + "rx_cpu_seconds": 0.09185610001441091, + "packets": 0, + "lag_seconds": 15.445481100535712 + }, + { + "samples_received": 23855104, + "arrival_time": 2.981888, + "worker_start": 18.419177100535713, + "worker_end": 18.52003810054925, + "rx_cpu_seconds": 0.1008610000135377, + "packets": 0, + "lag_seconds": 15.53815010054925 + }, + { + "samples_received": 23920640, + "arrival_time": 2.99008, + "worker_start": 18.52003810054925, + "worker_end": 18.60947150050965, + "rx_cpu_seconds": 0.08943339996039867, + "packets": 0, + "lag_seconds": 15.61939150050965 + }, + { + "samples_received": 23986176, + "arrival_time": 2.998272, + "worker_start": 18.60947150050965, + "worker_end": 18.710676800467304, + "rx_cpu_seconds": 0.10120529995765537, + "packets": 0, + "lag_seconds": 15.712404800467304 + }, + { + "samples_received": 24051712, + "arrival_time": 3.006464, + "worker_start": 18.710676800467304, + "worker_end": 18.81306400046055, + "rx_cpu_seconds": 0.1023871999932453, + "packets": 0, + "lag_seconds": 15.80660000046055 + }, + { + "samples_received": 24117248, + "arrival_time": 3.014656, + "worker_start": 18.81306400046055, + "worker_end": 18.87996280042757, + "rx_cpu_seconds": 0.06689879996702075, + "packets": 0, + "lag_seconds": 15.86530680042757 + }, + { + "samples_received": 24182784, + "arrival_time": 3.022848, + "worker_start": 18.87996280042757, + "worker_end": 18.95160670032096, + "rx_cpu_seconds": 0.07164389989338815, + "packets": 0, + "lag_seconds": 15.928758700320959 + }, + { + "samples_received": 24248320, + "arrival_time": 3.03104, + "worker_start": 18.95160670032096, + "worker_end": 18.966165100348412, + "rx_cpu_seconds": 0.0145584000274539, + "packets": 0, + "lag_seconds": 15.935125100348412 + }, + { + "samples_received": 24313856, + "arrival_time": 3.039232, + "worker_start": 18.966165100348412, + "worker_end": 18.99912570033525, + "rx_cpu_seconds": 0.032960599986836314, + "packets": 0, + "lag_seconds": 15.959893700335249 + }, + { + "samples_received": 24379392, + "arrival_time": 3.047424, + "worker_start": 18.99912570033525, + "worker_end": 19.03606660036207, + "rx_cpu_seconds": 0.03691959998104721, + "packets": 1, + "lag_seconds": 15.98864260036207 + }, + { + "samples_received": 24444928, + "arrival_time": 3.055616, + "worker_start": 19.03606660036207, + "worker_end": 19.061682900421552, + "rx_cpu_seconds": 0.025597300031222403, + "packets": 1, + "lag_seconds": 16.00606690042155 + }, + { + "samples_received": 24510464, + "arrival_time": 3.063808, + "worker_start": 19.061682900421552, + "worker_end": 19.069484400454208, + "rx_cpu_seconds": 0.007801500032655895, + "packets": 0, + "lag_seconds": 16.005676400454206 + }, + { + "samples_received": 24576000, + "arrival_time": 3.072, + "worker_start": 19.069484400454208, + "worker_end": 19.094686400385804, + "rx_cpu_seconds": 0.025168500025756657, + "packets": 1, + "lag_seconds": 16.022686400385805 + }, + { + "samples_received": 24641536, + "arrival_time": 3.080192, + "worker_start": 19.094686400385804, + "worker_end": 19.122573300388872, + "rx_cpu_seconds": 0.027866500080563128, + "packets": 1, + "lag_seconds": 16.042381300388872 + }, + { + "samples_received": 24707072, + "arrival_time": 3.088384, + "worker_start": 19.122573300388872, + "worker_end": 19.148341600441604, + "rx_cpu_seconds": 0.025746200000867248, + "packets": 1, + "lag_seconds": 16.059957600441603 + }, + { + "samples_received": 24772608, + "arrival_time": 3.096576, + "worker_start": 19.148341600441604, + "worker_end": 19.155191200443774, + "rx_cpu_seconds": 0.006849600002169609, + "packets": 0, + "lag_seconds": 16.058615200443775 + }, + { + "samples_received": 24838144, + "arrival_time": 3.104768, + "worker_start": 19.155191200443774, + "worker_end": 19.180050400442674, + "rx_cpu_seconds": 0.02483729994855821, + "packets": 1, + "lag_seconds": 16.075282400442674 + }, + { + "samples_received": 24903680, + "arrival_time": 3.11296, + "worker_start": 19.180050400442674, + "worker_end": 19.20545990044088, + "rx_cpu_seconds": 0.025387700065039098, + "packets": 1, + "lag_seconds": 16.092499900440878 + }, + { + "samples_received": 24969216, + "arrival_time": 3.121152, + "worker_start": 19.20545990044088, + "worker_end": 19.212451000356346, + "rx_cpu_seconds": 0.006991099915467203, + "packets": 0, + "lag_seconds": 16.091299000356347 + }, + { + "samples_received": 25034752, + "arrival_time": 3.129344, + "worker_start": 19.212451000356346, + "worker_end": 19.238667800448134, + "rx_cpu_seconds": 0.0260026000905782, + "packets": 1, + "lag_seconds": 16.109323800448134 + }, + { + "samples_received": 25100288, + "arrival_time": 3.137536, + "worker_start": 19.238667800448134, + "worker_end": 19.308378700523868, + "rx_cpu_seconds": 0.06971090007573366, + "packets": 0, + "lag_seconds": 16.170842700523867 + }, + { + "samples_received": 25165824, + "arrival_time": 3.145728, + "worker_start": 19.308378700523868, + "worker_end": 19.404509000487856, + "rx_cpu_seconds": 0.09613029996398836, + "packets": 0, + "lag_seconds": 16.258781000487858 + }, + { + "samples_received": 25231360, + "arrival_time": 3.15392, + "worker_start": 19.404509000487856, + "worker_end": 19.500212200459323, + "rx_cpu_seconds": 0.09570319997146726, + "packets": 0, + "lag_seconds": 16.346292200459324 + }, + { + "samples_received": 25296896, + "arrival_time": 3.162112, + "worker_start": 19.500212200459323, + "worker_end": 19.60481520044454, + "rx_cpu_seconds": 0.10460299998521805, + "packets": 0, + "lag_seconds": 16.44270320044454 + }, + { + "samples_received": 25362432, + "arrival_time": 3.170304, + "worker_start": 19.60481520044454, + "worker_end": 19.69701260049664, + "rx_cpu_seconds": 0.09219740005210042, + "packets": 0, + "lag_seconds": 16.52670860049664 + }, + { + "samples_received": 25427968, + "arrival_time": 3.178496, + "worker_start": 19.69701260049664, + "worker_end": 19.793567300432592, + "rx_cpu_seconds": 0.09655469993595034, + "packets": 0, + "lag_seconds": 16.615071300432593 + }, + { + "samples_received": 25493504, + "arrival_time": 3.186688, + "worker_start": 19.793567300432592, + "worker_end": 19.886625900523036, + "rx_cpu_seconds": 0.09305860009044409, + "packets": 0, + "lag_seconds": 16.699937900523036 + }, + { + "samples_received": 25559040, + "arrival_time": 3.19488, + "worker_start": 19.886625900523036, + "worker_end": 19.982010900516293, + "rx_cpu_seconds": 0.09538499999325722, + "packets": 0, + "lag_seconds": 16.787130900516292 + }, + { + "samples_received": 25624576, + "arrival_time": 3.203072, + "worker_start": 19.982010900516293, + "worker_end": 20.063413600445024, + "rx_cpu_seconds": 0.08140269992873073, + "packets": 0, + "lag_seconds": 16.860341600445025 + }, + { + "samples_received": 25690112, + "arrival_time": 3.211264, + "worker_start": 20.063413600445024, + "worker_end": 20.111490000396266, + "rx_cpu_seconds": 0.04807639995124191, + "packets": 0, + "lag_seconds": 16.900226000396266 + }, + { + "samples_received": 25755648, + "arrival_time": 3.219456, + "worker_start": 20.111490000396266, + "worker_end": 20.119163100382544, + "rx_cpu_seconds": 0.007673099986277521, + "packets": 0, + "lag_seconds": 16.899707100382543 + }, + { + "samples_received": 25821184, + "arrival_time": 3.227648, + "worker_start": 20.119163100382544, + "worker_end": 20.125528300421543, + "rx_cpu_seconds": 0.006365200038999319, + "packets": 0, + "lag_seconds": 16.897880300421544 + }, + { + "samples_received": 25886720, + "arrival_time": 3.23584, + "worker_start": 20.125528300421543, + "worker_end": 20.131978000405475, + "rx_cpu_seconds": 0.006449699983932078, + "packets": 0, + "lag_seconds": 16.896138000405475 + }, + { + "samples_received": 25952256, + "arrival_time": 3.244032, + "worker_start": 20.131978000405475, + "worker_end": 20.17493820039858, + "rx_cpu_seconds": 0.0429353000363335, + "packets": 1, + "lag_seconds": 16.930906200398578 + }, + { + "samples_received": 26017792, + "arrival_time": 3.252224, + "worker_start": 20.17493820039858, + "worker_end": 20.182794900385893, + "rx_cpu_seconds": 0.007856699987314641, + "packets": 0, + "lag_seconds": 16.930570900385895 + }, + { + "samples_received": 26083328, + "arrival_time": 3.260416, + "worker_start": 20.182794900385893, + "worker_end": 20.20743440045812, + "rx_cpu_seconds": 0.0246167000150308, + "packets": 1, + "lag_seconds": 16.94701840045812 + }, + { + "samples_received": 26148864, + "arrival_time": 3.268608, + "worker_start": 20.20743440045812, + "worker_end": 20.232308900457106, + "rx_cpu_seconds": 0.024851700058206916, + "packets": 1, + "lag_seconds": 16.963700900457106 + }, + { + "samples_received": 26214400, + "arrival_time": 3.2768, + "worker_start": 20.232308900457106, + "worker_end": 20.257012600436106, + "rx_cpu_seconds": 0.02468240004964173, + "packets": 1, + "lag_seconds": 16.980212600436104 + }, + { + "samples_received": 26279936, + "arrival_time": 3.284992, + "worker_start": 20.257012600436106, + "worker_end": 20.26429100044374, + "rx_cpu_seconds": 0.007278400007635355, + "packets": 0, + "lag_seconds": 16.979299000443742 + }, + { + "samples_received": 26345472, + "arrival_time": 3.293184, + "worker_start": 20.26429100044374, + "worker_end": 20.289045800462596, + "rx_cpu_seconds": 0.02473529998678714, + "packets": 1, + "lag_seconds": 16.995861800462595 + }, + { + "samples_received": 26411008, + "arrival_time": 3.301376, + "worker_start": 20.289045800462596, + "worker_end": 20.313879900386787, + "rx_cpu_seconds": 0.024811599985696375, + "packets": 1, + "lag_seconds": 17.012503900386786 + }, + { + "samples_received": 26476544, + "arrival_time": 3.309568, + "worker_start": 20.313879900386787, + "worker_end": 20.32185730036185, + "rx_cpu_seconds": 0.007977399975061417, + "packets": 0, + "lag_seconds": 17.01228930036185 + }, + { + "samples_received": 26542080, + "arrival_time": 3.31776, + "worker_start": 20.32185730036185, + "worker_end": 20.346640900250755, + "rx_cpu_seconds": 0.024762299959547818, + "packets": 1, + "lag_seconds": 17.028880900250755 + }, + { + "samples_received": 26607616, + "arrival_time": 3.325952, + "worker_start": 20.346640900250755, + "worker_end": 20.371031400289617, + "rx_cpu_seconds": 0.024143400019966066, + "packets": 1, + "lag_seconds": 17.045079400289616 + }, + { + "samples_received": 26673152, + "arrival_time": 3.334144, + "worker_start": 20.371031400289617, + "worker_end": 20.390665200313784, + "rx_cpu_seconds": 0.019633800024166703, + "packets": 0, + "lag_seconds": 17.05652120031378 + }, + { + "samples_received": 26738688, + "arrival_time": 3.342336, + "worker_start": 20.390665200313784, + "worker_end": 20.482792600414946, + "rx_cpu_seconds": 0.0921274001011625, + "packets": 0, + "lag_seconds": 17.140456600414947 + }, + { + "samples_received": 26804224, + "arrival_time": 3.350528, + "worker_start": 20.482792600414946, + "worker_end": 20.58106670040474, + "rx_cpu_seconds": 0.0982740999897942, + "packets": 0, + "lag_seconds": 17.23053870040474 + }, + { + "samples_received": 26869760, + "arrival_time": 3.35872, + "worker_start": 20.58106670040474, + "worker_end": 20.67728760036011, + "rx_cpu_seconds": 0.09622089995536953, + "packets": 0, + "lag_seconds": 17.31856760036011 + }, + { + "samples_received": 26935296, + "arrival_time": 3.366912, + "worker_start": 20.67728760036011, + "worker_end": 20.769543500391997, + "rx_cpu_seconds": 0.092255900031887, + "packets": 0, + "lag_seconds": 17.402631500391998 + }, + { + "samples_received": 27000832, + "arrival_time": 3.375104, + "worker_start": 20.769543500391997, + "worker_end": 20.86526960042142, + "rx_cpu_seconds": 0.09572610002942383, + "packets": 0, + "lag_seconds": 17.49016560042142 + }, + { + "samples_received": 27066368, + "arrival_time": 3.383296, + "worker_start": 20.86526960042142, + "worker_end": 20.95813620033045, + "rx_cpu_seconds": 0.0928665999090299, + "packets": 0, + "lag_seconds": 17.57484020033045 + }, + { + "samples_received": 27131904, + "arrival_time": 3.391488, + "worker_start": 20.95813620033045, + "worker_end": 21.06151180039928, + "rx_cpu_seconds": 0.10337560006882995, + "packets": 0, + "lag_seconds": 17.67002380039928 + }, + { + "samples_received": 27197440, + "arrival_time": 3.39968, + "worker_start": 21.06151180039928, + "worker_end": 21.181476600359424, + "rx_cpu_seconds": 0.11996479996014386, + "packets": 0, + "lag_seconds": 17.781796600359424 + }, + { + "samples_received": 27262976, + "arrival_time": 3.407872, + "worker_start": 21.181476600359424, + "worker_end": 21.26802540035755, + "rx_cpu_seconds": 0.08654879999812692, + "packets": 0, + "lag_seconds": 17.86015340035755 + }, + { + "samples_received": 27328512, + "arrival_time": 3.416064, + "worker_start": 21.26802540035755, + "worker_end": 21.28885060037323, + "rx_cpu_seconds": 0.020825200015679002, + "packets": 0, + "lag_seconds": 17.87278660037323 + }, + { + "samples_received": 27394048, + "arrival_time": 3.424256, + "worker_start": 21.28885060037323, + "worker_end": 21.33937850036495, + "rx_cpu_seconds": 0.050527899991720915, + "packets": 0, + "lag_seconds": 17.91512250036495 + }, + { + "samples_received": 27459584, + "arrival_time": 3.432448, + "worker_start": 21.33937850036495, + "worker_end": 21.372694400379665, + "rx_cpu_seconds": 0.03331590001471341, + "packets": 0, + "lag_seconds": 17.940246400379664 + }, + { + "samples_received": 27525120, + "arrival_time": 3.44064, + "worker_start": 21.372694400379665, + "worker_end": 21.40376100038015, + "rx_cpu_seconds": 0.031066600000485778, + "packets": 0, + "lag_seconds": 17.96312100038015 + }, + { + "samples_received": 27590656, + "arrival_time": 3.448832, + "worker_start": 21.40376100038015, + "worker_end": 21.43041600031615, + "rx_cpu_seconds": 0.026631299988366663, + "packets": 1, + "lag_seconds": 17.98158400031615 + }, + { + "samples_received": 27656192, + "arrival_time": 3.457024, + "worker_start": 21.43041600031615, + "worker_end": 21.454325300299793, + "rx_cpu_seconds": 0.02388619992416352, + "packets": 1, + "lag_seconds": 17.997301300299792 + }, + { + "samples_received": 27721728, + "arrival_time": 3.465216, + "worker_start": 21.454325300299793, + "worker_end": 21.478469300324328, + "rx_cpu_seconds": 0.024122599977999926, + "packets": 1, + "lag_seconds": 18.01325330032433 + }, + { + "samples_received": 27787264, + "arrival_time": 3.473408, + "worker_start": 21.478469300324328, + "worker_end": 21.485057200312845, + "rx_cpu_seconds": 0.006587899988517165, + "packets": 0, + "lag_seconds": 18.011649200312846 + }, + { + "samples_received": 27852800, + "arrival_time": 3.4816, + "worker_start": 21.485057200312845, + "worker_end": 21.512039200294062, + "rx_cpu_seconds": 0.02696260006632656, + "packets": 1, + "lag_seconds": 18.03043920029406 + }, + { + "samples_received": 27918336, + "arrival_time": 3.489792, + "worker_start": 21.512039200294062, + "worker_end": 21.537026200334772, + "rx_cpu_seconds": 0.02496499998960644, + "packets": 1, + "lag_seconds": 18.04723420033477 + }, + { + "samples_received": 27983872, + "arrival_time": 3.497984, + "worker_start": 21.537026200334772, + "worker_end": 21.54397280026064, + "rx_cpu_seconds": 0.006946599925868213, + "packets": 0, + "lag_seconds": 18.04598880026064 + }, + { + "samples_received": 28049408, + "arrival_time": 3.506176, + "worker_start": 21.54397280026064, + "worker_end": 21.567693500205174, + "rx_cpu_seconds": 0.023698000004515052, + "packets": 1, + "lag_seconds": 18.061517500205174 + }, + { + "samples_received": 28114944, + "arrival_time": 3.514368, + "worker_start": 21.567693500205174, + "worker_end": 21.591912400217957, + "rx_cpu_seconds": 0.02419899997767061, + "packets": 1, + "lag_seconds": 18.077544400217956 + }, + { + "samples_received": 28180480, + "arrival_time": 3.52256, + "worker_start": 21.591912400217957, + "worker_end": 21.617195400300666, + "rx_cpu_seconds": 0.025060500018298626, + "packets": 1, + "lag_seconds": 18.094635400300668 + }, + { + "samples_received": 28246016, + "arrival_time": 3.530752, + "worker_start": 21.617195400300666, + "worker_end": 21.624220600242957, + "rx_cpu_seconds": 0.007025199942290783, + "packets": 0, + "lag_seconds": 18.093468600242957 + }, + { + "samples_received": 28311552, + "arrival_time": 3.538944, + "worker_start": 21.624220600242957, + "worker_end": 21.693488700323037, + "rx_cpu_seconds": 0.06926810008008033, + "packets": 0, + "lag_seconds": 18.154544700323036 + }, + { + "samples_received": 28377088, + "arrival_time": 3.547136, + "worker_start": 21.693488700323037, + "worker_end": 21.791402000243075, + "rx_cpu_seconds": 0.09791329992003739, + "packets": 0, + "lag_seconds": 18.244266000243073 + }, + { + "samples_received": 28442624, + "arrival_time": 3.555328, + "worker_start": 21.791402000243075, + "worker_end": 21.90318770032213, + "rx_cpu_seconds": 0.11178570007905364, + "packets": 0, + "lag_seconds": 18.34785970032213 + }, + { + "samples_received": 28508160, + "arrival_time": 3.56352, + "worker_start": 21.90318770032213, + "worker_end": 21.999654400286495, + "rx_cpu_seconds": 0.09646669996436685, + "packets": 0, + "lag_seconds": 18.436134400286495 + }, + { + "samples_received": 28573696, + "arrival_time": 3.571712, + "worker_start": 21.999654400286495, + "worker_end": 22.089200000286333, + "rx_cpu_seconds": 0.08954559999983758, + "packets": 0, + "lag_seconds": 18.51748800028633 + }, + { + "samples_received": 28639232, + "arrival_time": 3.579904, + "worker_start": 22.089200000286333, + "worker_end": 22.17859000026551, + "rx_cpu_seconds": 0.08938999997917563, + "packets": 0, + "lag_seconds": 18.59868600026551 + }, + { + "samples_received": 28704768, + "arrival_time": 3.588096, + "worker_start": 22.17859000026551, + "worker_end": 22.270805800224885, + "rx_cpu_seconds": 0.09221579995937645, + "packets": 0, + "lag_seconds": 18.682709800224885 + }, + { + "samples_received": 28770304, + "arrival_time": 3.596288, + "worker_start": 22.270805800224885, + "worker_end": 22.36107160023716, + "rx_cpu_seconds": 0.09026580001227558, + "packets": 0, + "lag_seconds": 18.76478360023716 + }, + { + "samples_received": 28835840, + "arrival_time": 3.60448, + "worker_start": 22.36107160023716, + "worker_end": 22.459941100220426, + "rx_cpu_seconds": 0.098869499983266, + "packets": 0, + "lag_seconds": 18.855461100220428 + }, + { + "samples_received": 28901376, + "arrival_time": 3.612672, + "worker_start": 22.459941100220426, + "worker_end": 22.530205000199608, + "rx_cpu_seconds": 0.07026389997918159, + "packets": 0, + "lag_seconds": 18.917533000199608 + }, + { + "samples_received": 28966912, + "arrival_time": 3.620864, + "worker_start": 22.530205000199608, + "worker_end": 22.570938000113934, + "rx_cpu_seconds": 0.040732999914325774, + "packets": 0, + "lag_seconds": 18.950074000113933 + }, + { + "samples_received": 29032448, + "arrival_time": 3.629056, + "worker_start": 22.570938000113934, + "worker_end": 22.60300070013222, + "rx_cpu_seconds": 0.032062700018286705, + "packets": 0, + "lag_seconds": 18.973944700132222 + }, + { + "samples_received": 29097984, + "arrival_time": 3.637248, + "worker_start": 22.60300070013222, + "worker_end": 22.673470600050173, + "rx_cpu_seconds": 0.07046989991795272, + "packets": 0, + "lag_seconds": 19.036222600050174 + }, + { + "samples_received": 29163520, + "arrival_time": 3.64544, + "worker_start": 22.673470600050173, + "worker_end": 22.728286599980898, + "rx_cpu_seconds": 0.05479560000821948, + "packets": 1, + "lag_seconds": 19.082846599980897 + }, + { + "samples_received": 29229056, + "arrival_time": 3.653632, + "worker_start": 22.728286599980898, + "worker_end": 22.752774100059874, + "rx_cpu_seconds": 0.024466200033202767, + "packets": 1, + "lag_seconds": 19.099142100059872 + }, + { + "samples_received": 29294592, + "arrival_time": 3.661824, + "worker_start": 22.752774100059874, + "worker_end": 22.75959870010451, + "rx_cpu_seconds": 0.0068246000446379185, + "packets": 0, + "lag_seconds": 19.097774700104512 + }, + { + "samples_received": 29360128, + "arrival_time": 3.670016, + "worker_start": 22.75959870010451, + "worker_end": 22.78413540009246, + "rx_cpu_seconds": 0.024516799952834845, + "packets": 1, + "lag_seconds": 19.11411940009246 + }, + { + "samples_received": 29425664, + "arrival_time": 3.678208, + "worker_start": 22.78413540009246, + "worker_end": 22.808027200059264, + "rx_cpu_seconds": 0.023872300051152706, + "packets": 1, + "lag_seconds": 19.129819200059263 + }, + { + "samples_received": 29491200, + "arrival_time": 3.6864, + "worker_start": 22.808027200059264, + "worker_end": 22.815529300140447, + "rx_cpu_seconds": 0.007502100081183016, + "packets": 0, + "lag_seconds": 19.12912930014045 + }, + { + "samples_received": 29556736, + "arrival_time": 3.694592, + "worker_start": 22.815529300140447, + "worker_end": 22.838975400205932, + "rx_cpu_seconds": 0.023426600033417344, + "packets": 1, + "lag_seconds": 19.144383400205932 + }, + { + "samples_received": 29622272, + "arrival_time": 3.702784, + "worker_start": 22.838975400205932, + "worker_end": 22.863301900223128, + "rx_cpu_seconds": 0.02430409996304661, + "packets": 1, + "lag_seconds": 19.160517900223127 + }, + { + "samples_received": 29687808, + "arrival_time": 3.710976, + "worker_start": 22.863301900223128, + "worker_end": 22.887701500214867, + "rx_cpu_seconds": 0.024379199952818453, + "packets": 1, + "lag_seconds": 19.176725500214868 + }, + { + "samples_received": 29753344, + "arrival_time": 3.719168, + "worker_start": 22.887701500214867, + "worker_end": 22.894722100238546, + "rx_cpu_seconds": 0.007020600023679435, + "packets": 0, + "lag_seconds": 19.175554100238546 + }, + { + "samples_received": 29818880, + "arrival_time": 3.72736, + "worker_start": 22.894722100238546, + "worker_end": 22.918563200284957, + "rx_cpu_seconds": 0.02362900006119162, + "packets": 1, + "lag_seconds": 19.191203200284956 + }, + { + "samples_received": 29884416, + "arrival_time": 3.735552, + "worker_start": 22.918563200284957, + "worker_end": 22.961583100266985, + "rx_cpu_seconds": 0.04301989998202771, + "packets": 0, + "lag_seconds": 19.226031100266987 + }, + { + "samples_received": 29949952, + "arrival_time": 3.743744, + "worker_start": 22.961583100266985, + "worker_end": 23.062488000265553, + "rx_cpu_seconds": 0.100904899998568, + "packets": 0, + "lag_seconds": 19.318744000265553 + }, + { + "samples_received": 30015488, + "arrival_time": 3.751936, + "worker_start": 23.062488000265553, + "worker_end": 23.163366600180275, + "rx_cpu_seconds": 0.10087859991472214, + "packets": 0, + "lag_seconds": 19.411430600180275 + }, + { + "samples_received": 30081024, + "arrival_time": 3.760128, + "worker_start": 23.163366600180275, + "worker_end": 23.257540800150714, + "rx_cpu_seconds": 0.09417419997043908, + "packets": 0, + "lag_seconds": 19.497412800150713 + }, + { + "samples_received": 30146560, + "arrival_time": 3.76832, + "worker_start": 23.257540800150714, + "worker_end": 23.349985900109864, + "rx_cpu_seconds": 0.09244509995914996, + "packets": 0, + "lag_seconds": 19.581665900109865 + }, + { + "samples_received": 30212096, + "arrival_time": 3.776512, + "worker_start": 23.349985900109864, + "worker_end": 23.439749000019624, + "rx_cpu_seconds": 0.08976309990976006, + "packets": 0, + "lag_seconds": 19.663237000019624 + }, + { + "samples_received": 30277632, + "arrival_time": 3.784704, + "worker_start": 23.439749000019624, + "worker_end": 23.536823000068075, + "rx_cpu_seconds": 0.09707400004845113, + "packets": 0, + "lag_seconds": 19.752119000068074 + }, + { + "samples_received": 30343168, + "arrival_time": 3.792896, + "worker_start": 23.536823000068075, + "worker_end": 23.625933800133176, + "rx_cpu_seconds": 0.08911080006510019, + "packets": 0, + "lag_seconds": 19.833037800133177 + }, + { + "samples_received": 30408704, + "arrival_time": 3.801088, + "worker_start": 23.625933800133176, + "worker_end": 23.711406800088703, + "rx_cpu_seconds": 0.08547299995552748, + "packets": 0, + "lag_seconds": 19.910318800088703 + }, + { + "samples_received": 30474240, + "arrival_time": 3.80928, + "worker_start": 23.711406800088703, + "worker_end": 23.793228600065454, + "rx_cpu_seconds": 0.08182179997675121, + "packets": 0, + "lag_seconds": 19.983948600065453 + }, + { + "samples_received": 30539776, + "arrival_time": 3.817472, + "worker_start": 23.793228600065454, + "worker_end": 23.844677600085966, + "rx_cpu_seconds": 0.05144900002051145, + "packets": 0, + "lag_seconds": 20.027205600085967 + }, + { + "samples_received": 30605312, + "arrival_time": 3.825664, + "worker_start": 23.844677600085966, + "worker_end": 23.91938370001339, + "rx_cpu_seconds": 0.07470609992742538, + "packets": 0, + "lag_seconds": 20.09371970001339 + }, + { + "samples_received": 30670848, + "arrival_time": 3.833856, + "worker_start": 23.91938370001339, + "worker_end": 23.97149869998288, + "rx_cpu_seconds": 0.05211499996948987, + "packets": 0, + "lag_seconds": 20.13764269998288 + }, + { + "samples_received": 30736384, + "arrival_time": 3.842048, + "worker_start": 23.97149869998288, + "worker_end": 24.017243699876822, + "rx_cpu_seconds": 0.04572259995620698, + "packets": 1, + "lag_seconds": 20.175195699876824 + }, + { + "samples_received": 30801920, + "arrival_time": 3.85024, + "worker_start": 24.017243699876822, + "worker_end": 24.023987199886, + "rx_cpu_seconds": 0.006743500009179115, + "packets": 0, + "lag_seconds": 20.173747199886 + }, + { + "samples_received": 30867456, + "arrival_time": 3.858432, + "worker_start": 24.023987199886, + "worker_end": 24.04936649988708, + "rx_cpu_seconds": 0.02535919996444136, + "packets": 1, + "lag_seconds": 20.190934499887078 + }, + { + "samples_received": 30932992, + "arrival_time": 3.866624, + "worker_start": 24.04936649988708, + "worker_end": 24.074263999944783, + "rx_cpu_seconds": 0.024876500014215708, + "packets": 1, + "lag_seconds": 20.20763999994478 + }, + { + "samples_received": 30998528, + "arrival_time": 3.874816, + "worker_start": 24.074263999944783, + "worker_end": 24.08229979989887, + "rx_cpu_seconds": 0.008035799954086542, + "packets": 0, + "lag_seconds": 20.20748379989887 + }, + { + "samples_received": 31064064, + "arrival_time": 3.883008, + "worker_start": 24.08229979989887, + "worker_end": 24.105724399917058, + "rx_cpu_seconds": 0.023402800085023046, + "packets": 1, + "lag_seconds": 20.222716399917058 + }, + { + "samples_received": 31129600, + "arrival_time": 3.8912, + "worker_start": 24.105724399917058, + "worker_end": 24.129614199868634, + "rx_cpu_seconds": 0.0238698999164626, + "packets": 1, + "lag_seconds": 20.238414199868632 + }, + { + "samples_received": 31195136, + "arrival_time": 3.899392, + "worker_start": 24.129614199868634, + "worker_end": 24.155924999861277, + "rx_cpu_seconds": 0.02629119995981455, + "packets": 1, + "lag_seconds": 20.256532999861278 + }, + { + "samples_received": 31260672, + "arrival_time": 3.907584, + "worker_start": 24.155924999861277, + "worker_end": 24.163030699950873, + "rx_cpu_seconds": 0.007105700089596212, + "packets": 0, + "lag_seconds": 20.255446699950873 + }, + { + "samples_received": 31326208, + "arrival_time": 3.915776, + "worker_start": 24.163030699950873, + "worker_end": 24.18736009999015, + "rx_cpu_seconds": 0.02429259999189526, + "packets": 1, + "lag_seconds": 20.27158409999015 + }, + { + "samples_received": 31391744, + "arrival_time": 3.923968, + "worker_start": 24.18736009999015, + "worker_end": 24.211717799895673, + "rx_cpu_seconds": 0.02414989995304495, + "packets": 1, + "lag_seconds": 20.287749799895675 + }, + { + "samples_received": 31457280, + "arrival_time": 3.93216, + "worker_start": 24.211717799895673, + "worker_end": 24.21897409996786, + "rx_cpu_seconds": 0.007256300072185695, + "packets": 0, + "lag_seconds": 20.28681409996786 + }, + { + "samples_received": 31522816, + "arrival_time": 3.940352, + "worker_start": 24.21897409996786, + "worker_end": 24.30207979994197, + "rx_cpu_seconds": 0.08310569997411221, + "packets": 0, + "lag_seconds": 20.36172779994197 + }, + { + "samples_received": 31588352, + "arrival_time": 3.948544, + "worker_start": 24.30207979994197, + "worker_end": 24.395546699881784, + "rx_cpu_seconds": 0.09346689993981272, + "packets": 0, + "lag_seconds": 20.447002699881786 + }, + { + "samples_received": 31653888, + "arrival_time": 3.956736, + "worker_start": 24.395546699881784, + "worker_end": 24.48258879991085, + "rx_cpu_seconds": 0.0870421000290662, + "packets": 0, + "lag_seconds": 20.52585279991085 + }, + { + "samples_received": 31719424, + "arrival_time": 3.964928, + "worker_start": 24.48258879991085, + "worker_end": 24.571398899898163, + "rx_cpu_seconds": 0.08881009998731315, + "packets": 0, + "lag_seconds": 20.606470899898163 + }, + { + "samples_received": 31784960, + "arrival_time": 3.97312, + "worker_start": 24.571398899898163, + "worker_end": 24.658971799894466, + "rx_cpu_seconds": 0.08757289999630302, + "packets": 0, + "lag_seconds": 20.685851799894465 + }, + { + "samples_received": 31850496, + "arrival_time": 3.981312, + "worker_start": 24.658971799894466, + "worker_end": 24.74950249994476, + "rx_cpu_seconds": 0.0905307000502944, + "packets": 0, + "lag_seconds": 20.76819049994476 + }, + { + "samples_received": 31916032, + "arrival_time": 3.989504, + "worker_start": 24.74950249994476, + "worker_end": 24.83453029988636, + "rx_cpu_seconds": 0.08502779994159937, + "packets": 0, + "lag_seconds": 20.84502629988636 + }, + { + "samples_received": 31981568, + "arrival_time": 3.997696, + "worker_start": 24.83453029988636, + "worker_end": 24.93479559990414, + "rx_cpu_seconds": 0.10026530001778156, + "packets": 0, + "lag_seconds": 20.93709959990414 + }, + { + "samples_received": 32047104, + "arrival_time": 4.005888, + "worker_start": 24.93479559990414, + "worker_end": 25.01899309992627, + "rx_cpu_seconds": 0.08419750002212822, + "packets": 0, + "lag_seconds": 21.01310509992627 + }, + { + "samples_received": 32112640, + "arrival_time": 4.01408, + "worker_start": 25.01899309992627, + "worker_end": 25.04120889993687, + "rx_cpu_seconds": 0.022215800010599196, + "packets": 0, + "lag_seconds": 21.02712889993687 + }, + { + "samples_received": 32178176, + "arrival_time": 4.022272, + "worker_start": 25.04120889993687, + "worker_end": 25.05999819993344, + "rx_cpu_seconds": 0.018789299996569753, + "packets": 0, + "lag_seconds": 21.037726199933438 + }, + { + "samples_received": 32243712, + "arrival_time": 4.030464, + "worker_start": 25.05999819993344, + "worker_end": 25.114635399899676, + "rx_cpu_seconds": 0.05463719996623695, + "packets": 0, + "lag_seconds": 21.084171399899674 + }, + { + "samples_received": 32309248, + "arrival_time": 4.038656, + "worker_start": 25.114635399899676, + "worker_end": 25.1735286999105, + "rx_cpu_seconds": 0.05889330001082271, + "packets": 0, + "lag_seconds": 21.1348726999105 + }, + { + "samples_received": 32374784, + "arrival_time": 4.046848, + "worker_start": 25.1735286999105, + "worker_end": 25.213660399902842, + "rx_cpu_seconds": 0.040108899935148656, + "packets": 1, + "lag_seconds": 21.16681239990284 + }, + { + "samples_received": 32440320, + "arrival_time": 4.05504, + "worker_start": 25.213660399902842, + "worker_end": 25.239348299925446, + "rx_cpu_seconds": 0.025665700086392462, + "packets": 1, + "lag_seconds": 21.184308299925448 + }, + { + "samples_received": 32505856, + "arrival_time": 4.063232, + "worker_start": 25.239348299925446, + "worker_end": 25.24643379986123, + "rx_cpu_seconds": 0.007085499935783446, + "packets": 0, + "lag_seconds": 21.18320179986123 + }, + { + "samples_received": 32571392, + "arrival_time": 4.071424, + "worker_start": 25.24643379986123, + "worker_end": 25.27093609982007, + "rx_cpu_seconds": 0.024483000044710934, + "packets": 1, + "lag_seconds": 21.19951209982007 + }, + { + "samples_received": 32636928, + "arrival_time": 4.079616, + "worker_start": 25.27093609982007, + "worker_end": 25.29539929983043, + "rx_cpu_seconds": 0.024442299967631698, + "packets": 1, + "lag_seconds": 21.215783299830427 + }, + { + "samples_received": 32702464, + "arrival_time": 4.087808, + "worker_start": 25.29539929983043, + "worker_end": 25.319625899901844, + "rx_cpu_seconds": 0.024207100039348006, + "packets": 1, + "lag_seconds": 21.231817899901845 + }, + { + "samples_received": 32768000, + "arrival_time": 4.096, + "worker_start": 25.319625899901844, + "worker_end": 25.327346000013172, + "rx_cpu_seconds": 0.007720100111328065, + "packets": 0, + "lag_seconds": 21.231346000013172 + }, + { + "samples_received": 32833536, + "arrival_time": 4.104192, + "worker_start": 25.327346000013172, + "worker_end": 25.35294440005277, + "rx_cpu_seconds": 0.025577399996109307, + "packets": 1, + "lag_seconds": 21.24875240005277 + }, + { + "samples_received": 32899072, + "arrival_time": 4.112384, + "worker_start": 25.35294440005277, + "worker_end": 25.377277200117938, + "rx_cpu_seconds": 0.024310900014825165, + "packets": 1, + "lag_seconds": 21.26489320011794 + }, + { + "samples_received": 32964608, + "arrival_time": 4.120576, + "worker_start": 25.377277200117938, + "worker_end": 25.384100900155723, + "rx_cpu_seconds": 0.0068237000377848744, + "packets": 0, + "lag_seconds": 21.263524900155723 + }, + { + "samples_received": 33030144, + "arrival_time": 4.128768, + "worker_start": 25.384100900155723, + "worker_end": 25.407755400178253, + "rx_cpu_seconds": 0.023435399984009564, + "packets": 1, + "lag_seconds": 21.278987400178252 + }, + { + "samples_received": 33095680, + "arrival_time": 4.13696, + "worker_start": 25.407755400178253, + "worker_end": 25.439924400191053, + "rx_cpu_seconds": 0.0321690000128001, + "packets": 0, + "lag_seconds": 21.30296440019105 + }, + { + "samples_received": 33161216, + "arrival_time": 4.145152, + "worker_start": 25.439924400191053, + "worker_end": 25.53895610012882, + "rx_cpu_seconds": 0.09903169993776828, + "packets": 0, + "lag_seconds": 21.393804100128822 + }, + { + "samples_received": 33226752, + "arrival_time": 4.153344, + "worker_start": 25.53895610012882, + "worker_end": 25.640009900097034, + "rx_cpu_seconds": 0.10105379996821284, + "packets": 0, + "lag_seconds": 21.486665900097034 + }, + { + "samples_received": 33292288, + "arrival_time": 4.161536, + "worker_start": 25.640009900097034, + "worker_end": 25.73594630009797, + "rx_cpu_seconds": 0.09593640000093728, + "packets": 0, + "lag_seconds": 21.574410300097973 + }, + { + "samples_received": 33357824, + "arrival_time": 4.169728, + "worker_start": 25.73594630009797, + "worker_end": 25.822328200105808, + "rx_cpu_seconds": 0.08638190000783652, + "packets": 0, + "lag_seconds": 21.65260020010581 + }, + { + "samples_received": 33423360, + "arrival_time": 4.17792, + "worker_start": 25.822328200105808, + "worker_end": 25.909608100082956, + "rx_cpu_seconds": 0.08727989997714758, + "packets": 0, + "lag_seconds": 21.731688100082955 + }, + { + "samples_received": 33488896, + "arrival_time": 4.186112, + "worker_start": 25.909608100082956, + "worker_end": 26.003574500100918, + "rx_cpu_seconds": 0.09396640001796186, + "packets": 0, + "lag_seconds": 21.817462500100916 + }, + { + "samples_received": 33554432, + "arrival_time": 4.194304, + "worker_start": 26.003574500100918, + "worker_end": 26.092050400104604, + "rx_cpu_seconds": 0.08847590000368655, + "packets": 0, + "lag_seconds": 21.897746400104605 + }, + { + "samples_received": 33619968, + "arrival_time": 4.202496, + "worker_start": 26.092050400104604, + "worker_end": 26.179818500073857, + "rx_cpu_seconds": 0.08776809996925294, + "packets": 0, + "lag_seconds": 21.977322500073857 + }, + { + "samples_received": 33685504, + "arrival_time": 4.210688, + "worker_start": 26.179818500073857, + "worker_end": 26.264434600023783, + "rx_cpu_seconds": 0.08461609994992614, + "packets": 0, + "lag_seconds": 22.053746600023782 + }, + { + "samples_received": 33751040, + "arrival_time": 4.21888, + "worker_start": 26.264434600023783, + "worker_end": 26.354404199992537, + "rx_cpu_seconds": 0.08996959996875376, + "packets": 0, + "lag_seconds": 22.13552419999254 + }, + { + "samples_received": 33816576, + "arrival_time": 4.227072, + "worker_start": 26.354404199992537, + "worker_end": 26.41912490002182, + "rx_cpu_seconds": 0.06472070002928376, + "packets": 0, + "lag_seconds": 22.19205290002182 + }, + { + "samples_received": 33882112, + "arrival_time": 4.235264, + "worker_start": 26.41912490002182, + "worker_end": 26.45405430009891, + "rx_cpu_seconds": 0.03492940007708967, + "packets": 0, + "lag_seconds": 22.21879030009891 + }, + { + "samples_received": 33947648, + "arrival_time": 4.243456, + "worker_start": 26.45405430009891, + "worker_end": 26.494635400137163, + "rx_cpu_seconds": 0.04056049999780953, + "packets": 1, + "lag_seconds": 22.25117940013716 + }, + { + "samples_received": 34013184, + "arrival_time": 4.251648, + "worker_start": 26.494635400137163, + "worker_end": 26.50220860017766, + "rx_cpu_seconds": 0.007573200040496886, + "packets": 0, + "lag_seconds": 22.25056060017766 + }, + { + "samples_received": 34078720, + "arrival_time": 4.25984, + "worker_start": 26.50220860017766, + "worker_end": 26.52658610023395, + "rx_cpu_seconds": 0.024358000024221838, + "packets": 1, + "lag_seconds": 22.26674610023395 + }, + { + "samples_received": 34144256, + "arrival_time": 4.268032, + "worker_start": 26.52658610023395, + "worker_end": 26.551212100319795, + "rx_cpu_seconds": 0.02460370003245771, + "packets": 1, + "lag_seconds": 22.283180100319797 + }, + { + "samples_received": 34209792, + "arrival_time": 4.276224, + "worker_start": 26.551212100319795, + "worker_end": 26.578505400343097, + "rx_cpu_seconds": 0.027260900009423494, + "packets": 1, + "lag_seconds": 22.302281400343098 + }, + { + "samples_received": 34275328, + "arrival_time": 4.284416, + "worker_start": 26.578505400343097, + "worker_end": 26.585277900340266, + "rx_cpu_seconds": 0.006772499997168779, + "packets": 0, + "lag_seconds": 22.300861900340266 + }, + { + "samples_received": 34340864, + "arrival_time": 4.292608, + "worker_start": 26.585277900340266, + "worker_end": 26.609561700265154, + "rx_cpu_seconds": 0.024262199993245304, + "packets": 1, + "lag_seconds": 22.316953700265152 + }, + { + "samples_received": 34406400, + "arrival_time": 4.3008, + "worker_start": 26.609561700265154, + "worker_end": 26.63482580020395, + "rx_cpu_seconds": 0.025245399912819266, + "packets": 1, + "lag_seconds": 22.33402580020395 + }, + { + "samples_received": 34471936, + "arrival_time": 4.308992, + "worker_start": 26.63482580020395, + "worker_end": 26.641708700110435, + "rx_cpu_seconds": 0.006882899906486273, + "packets": 0, + "lag_seconds": 22.332716700110435 + }, + { + "samples_received": 34537472, + "arrival_time": 4.317184, + "worker_start": 26.641708700110435, + "worker_end": 26.66609910003212, + "rx_cpu_seconds": 0.024371900013647974, + "packets": 1, + "lag_seconds": 22.34891510003212 + }, + { + "samples_received": 34603008, + "arrival_time": 4.325376, + "worker_start": 26.66609910003212, + "worker_end": 26.6906435000787, + "rx_cpu_seconds": 0.02433080004993826, + "packets": 1, + "lag_seconds": 22.3652675000787 + }, + { + "samples_received": 34668544, + "arrival_time": 4.333568, + "worker_start": 26.6906435000787, + "worker_end": 26.71349790006247, + "rx_cpu_seconds": 0.022854399983771145, + "packets": 0, + "lag_seconds": 22.37992990006247 + }, + { + "samples_received": 34734080, + "arrival_time": 4.34176, + "worker_start": 26.71349790006247, + "worker_end": 26.80982209998951, + "rx_cpu_seconds": 0.09632419992703944, + "packets": 0, + "lag_seconds": 22.46806209998951 + }, + { + "samples_received": 34799616, + "arrival_time": 4.349952, + "worker_start": 26.80982209998951, + "worker_end": 26.90599190002144, + "rx_cpu_seconds": 0.09616980003193021, + "packets": 0, + "lag_seconds": 22.55603990002144 + }, + { + "samples_received": 34865152, + "arrival_time": 4.358144, + "worker_start": 26.90599190002144, + "worker_end": 27.001182200045555, + "rx_cpu_seconds": 0.09519030002411455, + "packets": 0, + "lag_seconds": 22.643038200045556 + }, + { + "samples_received": 34930688, + "arrival_time": 4.366336, + "worker_start": 27.001182200045555, + "worker_end": 27.09807930002757, + "rx_cpu_seconds": 0.09689709998201579, + "packets": 0, + "lag_seconds": 22.73174330002757 + }, + { + "samples_received": 34996224, + "arrival_time": 4.374528, + "worker_start": 27.09807930002757, + "worker_end": 27.183984800016738, + "rx_cpu_seconds": 0.08590549998916686, + "packets": 0, + "lag_seconds": 22.80945680001674 + }, + { + "samples_received": 35061760, + "arrival_time": 4.38272, + "worker_start": 27.183984800016738, + "worker_end": 27.277990399983942, + "rx_cpu_seconds": 0.09400559996720403, + "packets": 0, + "lag_seconds": 22.895270399983943 + }, + { + "samples_received": 35127296, + "arrival_time": 4.390912, + "worker_start": 27.277990399983942, + "worker_end": 27.376820100013397, + "rx_cpu_seconds": 0.09882970002945513, + "packets": 0, + "lag_seconds": 22.985908100013397 + }, + { + "samples_received": 35192832, + "arrival_time": 4.399104, + "worker_start": 27.376820100013397, + "worker_end": 27.473962600001364, + "rx_cpu_seconds": 0.09714249998796731, + "packets": 0, + "lag_seconds": 23.074858600001363 + }, + { + "samples_received": 35258368, + "arrival_time": 4.407296, + "worker_start": 27.473962600001364, + "worker_end": 27.564155000036813, + "rx_cpu_seconds": 0.09019240003544837, + "packets": 0, + "lag_seconds": 23.156859000036814 + }, + { + "samples_received": 35323904, + "arrival_time": 4.415488, + "worker_start": 27.564155000036813, + "worker_end": 27.63711130002816, + "rx_cpu_seconds": 0.0729562999913469, + "packets": 0, + "lag_seconds": 23.22162330002816 + }, + { + "samples_received": 35389440, + "arrival_time": 4.42368, + "worker_start": 27.63711130002816, + "worker_end": 27.70444859995809, + "rx_cpu_seconds": 0.06733729992993176, + "packets": 0, + "lag_seconds": 23.28076859995809 + }, + { + "samples_received": 35454976, + "arrival_time": 4.431872, + "worker_start": 27.70444859995809, + "worker_end": 27.805956700009524, + "rx_cpu_seconds": 0.10150810005143285, + "packets": 0, + "lag_seconds": 23.374084700009526 + }, + { + "samples_received": 35520512, + "arrival_time": 4.440064, + "worker_start": 27.805956700009524, + "worker_end": 27.893413599937453, + "rx_cpu_seconds": 0.08745689992792904, + "packets": 0, + "lag_seconds": 23.453349599937454 + }, + { + "samples_received": 35586048, + "arrival_time": 4.448256, + "worker_start": 27.893413599937453, + "worker_end": 27.92538309994456, + "rx_cpu_seconds": 0.03194750007241964, + "packets": 1, + "lag_seconds": 23.47712709994456 + }, + { + "samples_received": 35651584, + "arrival_time": 4.456448, + "worker_start": 27.92538309994456, + "worker_end": 27.949260599918894, + "rx_cpu_seconds": 0.023854600032791495, + "packets": 1, + "lag_seconds": 23.492812599918892 + }, + { + "samples_received": 35717120, + "arrival_time": 4.46464, + "worker_start": 27.949260599918894, + "worker_end": 27.974673499826572, + "rx_cpu_seconds": 0.02539189998060465, + "packets": 1, + "lag_seconds": 23.510033499826573 + }, + { + "samples_received": 35782656, + "arrival_time": 4.472832, + "worker_start": 27.974673499826572, + "worker_end": 27.981870099909834, + "rx_cpu_seconds": 0.007196600083261728, + "packets": 0, + "lag_seconds": 23.509038099909834 + }, + { + "samples_received": 35848192, + "arrival_time": 4.481024, + "worker_start": 27.981870099909834, + "worker_end": 28.005699599984332, + "rx_cpu_seconds": 0.023811100050807, + "packets": 1, + "lag_seconds": 23.524675599984334 + }, + { + "samples_received": 35913728, + "arrival_time": 4.489216, + "worker_start": 28.005699599984332, + "worker_end": 28.029071100063852, + "rx_cpu_seconds": 0.02334580000024289, + "packets": 1, + "lag_seconds": 23.539855100063853 + }, + { + "samples_received": 35979264, + "arrival_time": 4.497408, + "worker_start": 28.029071100063852, + "worker_end": 28.035957299995466, + "rx_cpu_seconds": 0.006886199931614101, + "packets": 0, + "lag_seconds": 23.538549299995466 + }, + { + "samples_received": 36044800, + "arrival_time": 4.5056, + "worker_start": 28.035957299995466, + "worker_end": 28.060235600111305, + "rx_cpu_seconds": 0.024256500066258013, + "packets": 1, + "lag_seconds": 23.554635600111304 + }, + { + "samples_received": 36110336, + "arrival_time": 4.513792, + "worker_start": 28.060235600111305, + "worker_end": 28.085145000143207, + "rx_cpu_seconds": 0.024889199994504452, + "packets": 1, + "lag_seconds": 23.57135300014321 + }, + { + "samples_received": 36175872, + "arrival_time": 4.521984, + "worker_start": 28.085145000143207, + "worker_end": 28.109049800092585, + "rx_cpu_seconds": 0.023719999939203262, + "packets": 1, + "lag_seconds": 23.587065800092585 + }, + { + "samples_received": 36241408, + "arrival_time": 4.530176, + "worker_start": 28.109049800092585, + "worker_end": 28.116160900106884, + "rx_cpu_seconds": 0.007111100014299154, + "packets": 0, + "lag_seconds": 23.585984900106883 + }, + { + "samples_received": 36306944, + "arrival_time": 4.538368, + "worker_start": 28.116160900106884, + "worker_end": 28.193045500091507, + "rx_cpu_seconds": 0.07688459998462349, + "packets": 0, + "lag_seconds": 23.65467750009151 + }, + { + "samples_received": 36372480, + "arrival_time": 4.54656, + "worker_start": 28.193045500091507, + "worker_end": 28.277844800039425, + "rx_cpu_seconds": 0.08479929994791746, + "packets": 0, + "lag_seconds": 23.731284800039425 + }, + { + "samples_received": 36438016, + "arrival_time": 4.554752, + "worker_start": 28.277844800039425, + "worker_end": 28.37340729998727, + "rx_cpu_seconds": 0.09556249994784594, + "packets": 0, + "lag_seconds": 23.81865529998727 + }, + { + "samples_received": 36503552, + "arrival_time": 4.562944, + "worker_start": 28.37340729998727, + "worker_end": 28.46608339995914, + "rx_cpu_seconds": 0.0926760999718681, + "packets": 0, + "lag_seconds": 23.903139399959137 + }, + { + "samples_received": 36569088, + "arrival_time": 4.571136, + "worker_start": 28.46608339995914, + "worker_end": 28.562602199970975, + "rx_cpu_seconds": 0.09651880001183599, + "packets": 0, + "lag_seconds": 23.991466199970976 + }, + { + "samples_received": 36634624, + "arrival_time": 4.579328, + "worker_start": 28.562602199970975, + "worker_end": 28.67505389988259, + "rx_cpu_seconds": 0.11245169991161674, + "packets": 0, + "lag_seconds": 24.09572589988259 + }, + { + "samples_received": 36700160, + "arrival_time": 4.58752, + "worker_start": 28.67505389988259, + "worker_end": 28.7648828999449, + "rx_cpu_seconds": 0.0898290000623092, + "packets": 0, + "lag_seconds": 24.177362899944903 + }, + { + "samples_received": 36765696, + "arrival_time": 4.595712, + "worker_start": 28.7648828999449, + "worker_end": 28.86066269991756, + "rx_cpu_seconds": 0.09577979997266084, + "packets": 0, + "lag_seconds": 24.264950699917563 + }, + { + "samples_received": 36831232, + "arrival_time": 4.603904, + "worker_start": 28.86066269991756, + "worker_end": 28.961332899991653, + "rx_cpu_seconds": 0.10067020007409155, + "packets": 0, + "lag_seconds": 24.357428899991653 + }, + { + "samples_received": 36896768, + "arrival_time": 4.612096, + "worker_start": 28.961332899991653, + "worker_end": 29.03682909999811, + "rx_cpu_seconds": 0.07549620000645518, + "packets": 0, + "lag_seconds": 24.424733099998107 + }, + { + "samples_received": 36962304, + "arrival_time": 4.620288, + "worker_start": 29.03682909999811, + "worker_end": 29.04368399992422, + "rx_cpu_seconds": 0.006854899926111102, + "packets": 0, + "lag_seconds": 24.423395999924217 + }, + { + "samples_received": 37027840, + "arrival_time": 4.62848, + "worker_start": 29.04368399992422, + "worker_end": 29.05197509995964, + "rx_cpu_seconds": 0.00829110003542155, + "packets": 0, + "lag_seconds": 24.42349509995964 + }, + { + "samples_received": 37093376, + "arrival_time": 4.636672, + "worker_start": 29.05197509995964, + "worker_end": 29.058636000038355, + "rx_cpu_seconds": 0.006660900078713894, + "packets": 0, + "lag_seconds": 24.421964000038354 + }, + { + "samples_received": 37158912, + "arrival_time": 4.644864, + "worker_start": 29.058636000038355, + "worker_end": 29.101281200077615, + "rx_cpu_seconds": 0.04262150009162724, + "packets": 1, + "lag_seconds": 24.456417200077617 + }, + { + "samples_received": 37224448, + "arrival_time": 4.653056, + "worker_start": 29.101281200077615, + "worker_end": 29.125914499986216, + "rx_cpu_seconds": 0.024613599991425872, + "packets": 1, + "lag_seconds": 24.472858499986216 + }, + { + "samples_received": 37289984, + "arrival_time": 4.661248, + "worker_start": 29.125914499986216, + "worker_end": 29.133039099986895, + "rx_cpu_seconds": 0.007124600000679493, + "packets": 0, + "lag_seconds": 24.471791099986895 + }, + { + "samples_received": 37355520, + "arrival_time": 4.66944, + "worker_start": 29.133039099986895, + "worker_end": 29.15835319995717, + "rx_cpu_seconds": 0.025293399929068983, + "packets": 1, + "lag_seconds": 24.488913199957167 + }, + { + "samples_received": 37421056, + "arrival_time": 4.677632, + "worker_start": 29.15835319995717, + "worker_end": 29.183742399917215, + "rx_cpu_seconds": 0.025371499941684306, + "packets": 1, + "lag_seconds": 24.506110399917215 + }, + { + "samples_received": 37486592, + "arrival_time": 4.685824, + "worker_start": 29.183742399917215, + "worker_end": 29.19212639996153, + "rx_cpu_seconds": 0.008384000044316053, + "packets": 0, + "lag_seconds": 24.50630239996153 + }, + { + "samples_received": 37552128, + "arrival_time": 4.694016, + "worker_start": 29.19212639996153, + "worker_end": 29.216025299982398, + "rx_cpu_seconds": 0.02387879998423159, + "packets": 1, + "lag_seconds": 24.522009299982397 + }, + { + "samples_received": 37617664, + "arrival_time": 4.702208, + "worker_start": 29.216025299982398, + "worker_end": 29.240133699968688, + "rx_cpu_seconds": 0.024046099977567792, + "packets": 1, + "lag_seconds": 24.53792569996869 + }, + { + "samples_received": 37683200, + "arrival_time": 4.7104, + "worker_start": 29.240133699968688, + "worker_end": 29.266275299953527, + "rx_cpu_seconds": 0.026118200039491057, + "packets": 1, + "lag_seconds": 24.555875299953527 + }, + { + "samples_received": 37748736, + "arrival_time": 4.718592, + "worker_start": 29.266275299953527, + "worker_end": 29.273143499864496, + "rx_cpu_seconds": 0.006868199910968542, + "packets": 0, + "lag_seconds": 24.554551499864495 + }, + { + "samples_received": 37814272, + "arrival_time": 4.726784, + "worker_start": 29.273143499864496, + "worker_end": 29.29822729982738, + "rx_cpu_seconds": 0.02486300002783537, + "packets": 1, + "lag_seconds": 24.57144329982738 + }, + { + "samples_received": 37879808, + "arrival_time": 4.734976, + "worker_start": 29.29822729982738, + "worker_end": 29.305167499820932, + "rx_cpu_seconds": 0.0069401999935507774, + "packets": 0, + "lag_seconds": 24.570191499820933 + }, + { + "samples_received": 37945344, + "arrival_time": 4.743168, + "worker_start": 29.305167499820932, + "worker_end": 29.40736909979791, + "rx_cpu_seconds": 0.1022015999769792, + "packets": 0, + "lag_seconds": 24.66420109979791 + }, + { + "samples_received": 38010880, + "arrival_time": 4.75136, + "worker_start": 29.40736909979791, + "worker_end": 29.50661009969958, + "rx_cpu_seconds": 0.09924099990166724, + "packets": 0, + "lag_seconds": 24.75525009969958 + }, + { + "samples_received": 38076416, + "arrival_time": 4.759552, + "worker_start": 29.50661009969958, + "worker_end": 29.608708699707172, + "rx_cpu_seconds": 0.10209860000759363, + "packets": 0, + "lag_seconds": 24.849156699707173 + }, + { + "samples_received": 38141952, + "arrival_time": 4.767744, + "worker_start": 29.608708699707172, + "worker_end": 29.708546199727103, + "rx_cpu_seconds": 0.0998375000199303, + "packets": 0, + "lag_seconds": 24.940802199727102 + }, + { + "samples_received": 38207488, + "arrival_time": 4.775936, + "worker_start": 29.708546199727103, + "worker_end": 29.807625199792206, + "rx_cpu_seconds": 0.09907900006510317, + "packets": 0, + "lag_seconds": 25.031689199792204 + }, + { + "samples_received": 38273024, + "arrival_time": 4.784128, + "worker_start": 29.807625199792206, + "worker_end": 29.901072299814082, + "rx_cpu_seconds": 0.0934471000218764, + "packets": 0, + "lag_seconds": 25.116944299814083 + }, + { + "samples_received": 38338560, + "arrival_time": 4.79232, + "worker_start": 29.901072299814082, + "worker_end": 30.003279499833702, + "rx_cpu_seconds": 0.10220720001962036, + "packets": 0, + "lag_seconds": 25.210959499833702 + }, + { + "samples_received": 38404096, + "arrival_time": 4.800512, + "worker_start": 30.003279499833702, + "worker_end": 30.10204029980418, + "rx_cpu_seconds": 0.09876079997047782, + "packets": 0, + "lag_seconds": 25.30152829980418 + }, + { + "samples_received": 38469632, + "arrival_time": 4.808704, + "worker_start": 30.10204029980418, + "worker_end": 30.16205899976962, + "rx_cpu_seconds": 0.06001869996543974, + "packets": 0, + "lag_seconds": 25.35335499976962 + }, + { + "samples_received": 38535168, + "arrival_time": 4.816896, + "worker_start": 30.16205899976962, + "worker_end": 30.16879729985562, + "rx_cpu_seconds": 0.006738300085999072, + "packets": 0, + "lag_seconds": 25.35190129985562 + }, + { + "samples_received": 38600704, + "arrival_time": 4.825088, + "worker_start": 30.16879729985562, + "worker_end": 30.207410799812756, + "rx_cpu_seconds": 0.03861349995713681, + "packets": 0, + "lag_seconds": 25.382322799812755 + }, + { + "samples_received": 38666240, + "arrival_time": 4.83328, + "worker_start": 30.207410799812756, + "worker_end": 30.214289999807484, + "rx_cpu_seconds": 0.006879199994727969, + "packets": 0, + "lag_seconds": 25.381009999807482 + }, + { + "samples_received": 38731776, + "arrival_time": 4.841472, + "worker_start": 30.214289999807484, + "worker_end": 30.260724299711406, + "rx_cpu_seconds": 0.04641119996085763, + "packets": 1, + "lag_seconds": 25.419252299711406 + }, + { + "samples_received": 38797312, + "arrival_time": 4.849664, + "worker_start": 30.260724299711406, + "worker_end": 30.267669799745313, + "rx_cpu_seconds": 0.006945500033907592, + "packets": 0, + "lag_seconds": 25.418005799745313 + }, + { + "samples_received": 38862848, + "arrival_time": 4.857856, + "worker_start": 30.267669799745313, + "worker_end": 30.29246209981688, + "rx_cpu_seconds": 0.0247724000364542, + "packets": 1, + "lag_seconds": 25.434606099816882 + }, + { + "samples_received": 38928384, + "arrival_time": 4.866048, + "worker_start": 30.29246209981688, + "worker_end": 30.32088829985191, + "rx_cpu_seconds": 0.02840519999153912, + "packets": 1, + "lag_seconds": 25.45484029985191 + }, + { + "samples_received": 38993920, + "arrival_time": 4.87424, + "worker_start": 30.32088829985191, + "worker_end": 30.327747299925655, + "rx_cpu_seconds": 0.006859000073745847, + "packets": 0, + "lag_seconds": 25.453507299925654 + }, + { + "samples_received": 39059456, + "arrival_time": 4.882432, + "worker_start": 30.327747299925655, + "worker_end": 30.35451559990947, + "rx_cpu_seconds": 0.026748099946416914, + "packets": 1, + "lag_seconds": 25.472083599909467 + }, + { + "samples_received": 39124992, + "arrival_time": 4.890624, + "worker_start": 30.35451559990947, + "worker_end": 30.378993599916107, + "rx_cpu_seconds": 0.024433500017039478, + "packets": 1, + "lag_seconds": 25.48836959991611 + }, + { + "samples_received": 39190528, + "arrival_time": 4.898816, + "worker_start": 30.378993599916107, + "worker_end": 30.404028099852844, + "rx_cpu_seconds": 0.02501539990771562, + "packets": 1, + "lag_seconds": 25.505212099852844 + }, + { + "samples_received": 39256064, + "arrival_time": 4.907008, + "worker_start": 30.404028099852844, + "worker_end": 30.411411699846617, + "rx_cpu_seconds": 0.007383599993772805, + "packets": 0, + "lag_seconds": 25.504403699846616 + }, + { + "samples_received": 39321600, + "arrival_time": 4.9152, + "worker_start": 30.411411699846617, + "worker_end": 30.436718099874675, + "rx_cpu_seconds": 0.025285299983806908, + "packets": 1, + "lag_seconds": 25.521518099874676 + }, + { + "samples_received": 39387136, + "arrival_time": 4.923392, + "worker_start": 30.436718099874675, + "worker_end": 30.463250299806937, + "rx_cpu_seconds": 0.026333099929615855, + "packets": 1, + "lag_seconds": 25.539858299806937 + }, + { + "samples_received": 39452672, + "arrival_time": 4.931584, + "worker_start": 30.463250299806937, + "worker_end": 30.47057369980798, + "rx_cpu_seconds": 0.007323400001041591, + "packets": 0, + "lag_seconds": 25.538989699807978 + }, + { + "samples_received": 39518208, + "arrival_time": 4.939776, + "worker_start": 30.47057369980798, + "worker_end": 30.587015399717025, + "rx_cpu_seconds": 0.11644169990904629, + "packets": 0, + "lag_seconds": 25.647239399717023 + }, + { + "samples_received": 39583744, + "arrival_time": 4.947968, + "worker_start": 30.587015399717025, + "worker_end": 30.6909654997366, + "rx_cpu_seconds": 0.10395010001957417, + "packets": 0, + "lag_seconds": 25.7429974997366 + }, + { + "samples_received": 39649280, + "arrival_time": 4.95616, + "worker_start": 30.6909654997366, + "worker_end": 30.784025099718242, + "rx_cpu_seconds": 0.09305959998164326, + "packets": 0, + "lag_seconds": 25.82786509971824 + }, + { + "samples_received": 39714816, + "arrival_time": 4.964352, + "worker_start": 30.784025099718242, + "worker_end": 30.880203199696957, + "rx_cpu_seconds": 0.09617809997871518, + "packets": 0, + "lag_seconds": 25.91585119969696 + }, + { + "samples_received": 39780352, + "arrival_time": 4.972544, + "worker_start": 30.880203199696957, + "worker_end": 30.98068079970148, + "rx_cpu_seconds": 0.10047760000452399, + "packets": 0, + "lag_seconds": 26.008136799701482 + }, + { + "samples_received": 39845888, + "arrival_time": 4.980736, + "worker_start": 30.98068079970148, + "worker_end": 31.080017599634125, + "rx_cpu_seconds": 0.09933679993264377, + "packets": 0, + "lag_seconds": 26.099281599634125 + }, + { + "samples_received": 39911424, + "arrival_time": 4.988928, + "worker_start": 31.080017599634125, + "worker_end": 31.18949559960351, + "rx_cpu_seconds": 0.10947799996938556, + "packets": 0, + "lag_seconds": 26.20056759960351 + }, + { + "samples_received": 39976960, + "arrival_time": 4.99712, + "worker_start": 31.18949559960351, + "worker_end": 31.28926349967555, + "rx_cpu_seconds": 0.09976790007203817, + "packets": 0, + "lag_seconds": 26.29214349967555 + }, + { + "samples_received": 40042496, + "arrival_time": 5.005312, + "worker_start": 31.28926349967555, + "worker_end": 31.39276009973441, + "rx_cpu_seconds": 0.10349660005886108, + "packets": 0, + "lag_seconds": 26.38744809973441 + }, + { + "samples_received": 40108032, + "arrival_time": 5.013504, + "worker_start": 31.39276009973441, + "worker_end": 31.48413839971949, + "rx_cpu_seconds": 0.09137829998508096, + "packets": 0, + "lag_seconds": 26.47063439971949 + }, + { + "samples_received": 40173568, + "arrival_time": 5.021696, + "worker_start": 31.48413839971949, + "worker_end": 31.503794599797807, + "rx_cpu_seconds": 0.019656200078316033, + "packets": 0, + "lag_seconds": 26.48209859979781 + }, + { + "samples_received": 40239104, + "arrival_time": 5.029888, + "worker_start": 31.503794599797807, + "worker_end": 31.510401399813823, + "rx_cpu_seconds": 0.006606800016015768, + "packets": 0, + "lag_seconds": 26.480513399813823 + }, + { + "samples_received": 40304640, + "arrival_time": 5.03808, + "worker_start": 31.510401399813823, + "worker_end": 31.550888599835567, + "rx_cpu_seconds": 0.040487200021743774, + "packets": 0, + "lag_seconds": 26.512808599835566 + }, + { + "samples_received": 40370176, + "arrival_time": 5.046272, + "worker_start": 31.550888599835567, + "worker_end": 31.636886299828298, + "rx_cpu_seconds": 0.08597000001464039, + "packets": 1, + "lag_seconds": 26.590614299828296 + }, + { + "samples_received": 40435712, + "arrival_time": 5.054464, + "worker_start": 31.636886299828298, + "worker_end": 31.66157429992058, + "rx_cpu_seconds": 0.024668100057169795, + "packets": 1, + "lag_seconds": 26.60711029992058 + }, + { + "samples_received": 40501248, + "arrival_time": 5.062656, + "worker_start": 31.66157429992058, + "worker_end": 31.668833799900717, + "rx_cpu_seconds": 0.007259499980136752, + "packets": 0, + "lag_seconds": 26.606177799900717 + }, + { + "samples_received": 40566784, + "arrival_time": 5.070848, + "worker_start": 31.668833799900717, + "worker_end": 31.694588799852177, + "rx_cpu_seconds": 0.025733099901117384, + "packets": 1, + "lag_seconds": 26.62374079985218 + }, + { + "samples_received": 40632320, + "arrival_time": 5.07904, + "worker_start": 31.694588799852177, + "worker_end": 31.718967599918365, + "rx_cpu_seconds": 0.024361400050111115, + "packets": 1, + "lag_seconds": 26.639927599918366 + }, + { + "samples_received": 40697856, + "arrival_time": 5.087232, + "worker_start": 31.718967599918365, + "worker_end": 31.72645819991198, + "rx_cpu_seconds": 0.0074905999936163425, + "packets": 0, + "lag_seconds": 26.63922619991198 + }, + { + "samples_received": 40763392, + "arrival_time": 5.095424, + "worker_start": 31.72645819991198, + "worker_end": 31.749906799880087, + "rx_cpu_seconds": 0.02342669991776347, + "packets": 1, + "lag_seconds": 26.654482799880086 + }, + { + "samples_received": 40828928, + "arrival_time": 5.103616, + "worker_start": 31.749906799880087, + "worker_end": 31.776935599868416, + "rx_cpu_seconds": 0.027009199955500662, + "packets": 1, + "lag_seconds": 26.673319599868417 + }, + { + "samples_received": 40894464, + "arrival_time": 5.111808, + "worker_start": 31.776935599868416, + "worker_end": 31.8026625998395, + "rx_cpu_seconds": 0.025703099905513227, + "packets": 1, + "lag_seconds": 26.6908545998395 + }, + { + "samples_received": 40960000, + "arrival_time": 5.12, + "worker_start": 31.8026625998395, + "worker_end": 31.80968559976504, + "rx_cpu_seconds": 0.0070229999255388975, + "packets": 0, + "lag_seconds": 26.68968559976504 + }, + { + "samples_received": 41025536, + "arrival_time": 5.128192, + "worker_start": 31.80968559976504, + "worker_end": 31.83461709973239, + "rx_cpu_seconds": 0.02474419993814081, + "packets": 1, + "lag_seconds": 26.706425099732392 + }, + { + "samples_received": 41091072, + "arrival_time": 5.136384, + "worker_start": 31.83461709973239, + "worker_end": 31.857334599721476, + "rx_cpu_seconds": 0.0227174999890849, + "packets": 0, + "lag_seconds": 26.720950599721476 + }, + { + "samples_received": 41156608, + "arrival_time": 5.144576, + "worker_start": 31.857334599721476, + "worker_end": 31.954186199706278, + "rx_cpu_seconds": 0.0968515999848023, + "packets": 0, + "lag_seconds": 26.809610199706277 + }, + { + "samples_received": 41222144, + "arrival_time": 5.152768, + "worker_start": 31.954186199706278, + "worker_end": 32.05472169968602, + "rx_cpu_seconds": 0.10053549997974187, + "packets": 0, + "lag_seconds": 26.90195369968602 + }, + { + "samples_received": 41287680, + "arrival_time": 5.16096, + "worker_start": 32.05472169968602, + "worker_end": 32.14420779969846, + "rx_cpu_seconds": 0.08948610001243651, + "packets": 0, + "lag_seconds": 26.983247799698457 + }, + { + "samples_received": 41353216, + "arrival_time": 5.169152, + "worker_start": 32.14420779969846, + "worker_end": 32.249913699699796, + "rx_cpu_seconds": 0.10570590000133961, + "packets": 0, + "lag_seconds": 27.080761699699796 + }, + { + "samples_received": 41418752, + "arrival_time": 5.177344, + "worker_start": 32.249913699699796, + "worker_end": 32.34703159973328, + "rx_cpu_seconds": 0.09711790003348142, + "packets": 0, + "lag_seconds": 27.16968759973328 + }, + { + "samples_received": 41484288, + "arrival_time": 5.185536, + "worker_start": 32.34703159973328, + "worker_end": 32.43835319975228, + "rx_cpu_seconds": 0.09132160001900047, + "packets": 0, + "lag_seconds": 27.25281719975228 + }, + { + "samples_received": 41549824, + "arrival_time": 5.193728, + "worker_start": 32.43835319975228, + "worker_end": 32.54151599983056, + "rx_cpu_seconds": 0.10316280007828027, + "packets": 0, + "lag_seconds": 27.347787999830558 + }, + { + "samples_received": 41615360, + "arrival_time": 5.20192, + "worker_start": 32.54151599983056, + "worker_end": 32.62819479988725, + "rx_cpu_seconds": 0.08667880005668849, + "packets": 0, + "lag_seconds": 27.426274799887246 + }, + { + "samples_received": 41680896, + "arrival_time": 5.210112, + "worker_start": 32.62819479988725, + "worker_end": 32.672129999970316, + "rx_cpu_seconds": 0.0439352000830695, + "packets": 0, + "lag_seconds": 27.462017999970318 + }, + { + "samples_received": 41746432, + "arrival_time": 5.218304, + "worker_start": 32.672129999970316, + "worker_end": 32.68096619996545, + "rx_cpu_seconds": 0.0088361999951303, + "packets": 0, + "lag_seconds": 27.462662199965447 + }, + { + "samples_received": 41811968, + "arrival_time": 5.226496, + "worker_start": 32.68096619996545, + "worker_end": 32.6997148998857, + "rx_cpu_seconds": 0.018748699920251966, + "packets": 0, + "lag_seconds": 27.473218899885698 + }, + { + "samples_received": 41877504, + "arrival_time": 5.234688, + "worker_start": 32.6997148998857, + "worker_end": 32.75235079986346, + "rx_cpu_seconds": 0.05263589997775853, + "packets": 0, + "lag_seconds": 27.51766279986346 + }, + { + "samples_received": 41943040, + "arrival_time": 5.24288, + "worker_start": 32.75235079986346, + "worker_end": 32.797011399882145, + "rx_cpu_seconds": 0.04463939997367561, + "packets": 1, + "lag_seconds": 27.554131399882145 + }, + { + "samples_received": 42008576, + "arrival_time": 5.251072, + "worker_start": 32.797011399882145, + "worker_end": 32.80456479988829, + "rx_cpu_seconds": 0.007553400006145239, + "packets": 0, + "lag_seconds": 27.55349279988829 + }, + { + "samples_received": 42074112, + "arrival_time": 5.259264, + "worker_start": 32.80456479988829, + "worker_end": 32.82916949981195, + "rx_cpu_seconds": 0.02458440000191331, + "packets": 1, + "lag_seconds": 27.569905499811945 + }, + { + "samples_received": 42139648, + "arrival_time": 5.267456, + "worker_start": 32.82916949981195, + "worker_end": 32.85530179972597, + "rx_cpu_seconds": 0.026112699997611344, + "packets": 1, + "lag_seconds": 27.587845799725972 + }, + { + "samples_received": 42205184, + "arrival_time": 5.275648, + "worker_start": 32.85530179972597, + "worker_end": 32.86200599978515, + "rx_cpu_seconds": 0.006704200059175491, + "packets": 0, + "lag_seconds": 27.586357999785147 + }, + { + "samples_received": 42270720, + "arrival_time": 5.28384, + "worker_start": 32.86200599978515, + "worker_end": 32.88915259985556, + "rx_cpu_seconds": 0.02712540002539754, + "packets": 1, + "lag_seconds": 27.60531259985556 + }, + { + "samples_received": 42336256, + "arrival_time": 5.292032, + "worker_start": 32.88915259985556, + "worker_end": 32.913650299895785, + "rx_cpu_seconds": 0.02447750000283122, + "packets": 1, + "lag_seconds": 27.621618299895786 + }, + { + "samples_received": 42401792, + "arrival_time": 5.300224, + "worker_start": 32.913650299895785, + "worker_end": 32.938062299981944, + "rx_cpu_seconds": 0.024392100051045418, + "packets": 1, + "lag_seconds": 27.637838299981944 + }, + { + "samples_received": 42467328, + "arrival_time": 5.308416, + "worker_start": 32.938062299981944, + "worker_end": 32.945881700034484, + "rx_cpu_seconds": 0.007819400052540004, + "packets": 0, + "lag_seconds": 27.637465700034483 + }, + { + "samples_received": 42532864, + "arrival_time": 5.316608, + "worker_start": 32.945881700034484, + "worker_end": 32.96954290010803, + "rx_cpu_seconds": 0.023641000036150217, + "packets": 1, + "lag_seconds": 27.652934900108033 + }, + { + "samples_received": 42598400, + "arrival_time": 5.3248, + "worker_start": 32.96954290010803, + "worker_end": 32.994742700022876, + "rx_cpu_seconds": 0.02493959991261363, + "packets": 1, + "lag_seconds": 27.669942700022876 + }, + { + "samples_received": 42663936, + "arrival_time": 5.332992, + "worker_start": 32.994742700022876, + "worker_end": 33.00162040000618, + "rx_cpu_seconds": 0.006877699983306229, + "packets": 0, + "lag_seconds": 27.66862840000618 + }, + { + "samples_received": 42729472, + "arrival_time": 5.341184, + "worker_start": 33.00162040000618, + "worker_end": 33.09969890001998, + "rx_cpu_seconds": 0.09807850001379848, + "packets": 0, + "lag_seconds": 27.758514900019982 + }, + { + "samples_received": 42795008, + "arrival_time": 5.349376, + "worker_start": 33.09969890001998, + "worker_end": 33.193012800075344, + "rx_cpu_seconds": 0.09331390005536377, + "packets": 0, + "lag_seconds": 27.843636800075345 + }, + { + "samples_received": 42860544, + "arrival_time": 5.357568, + "worker_start": 33.193012800075344, + "worker_end": 33.2846460000223, + "rx_cpu_seconds": 0.09163319994695485, + "packets": 0, + "lag_seconds": 27.9270780000223 + }, + { + "samples_received": 42926080, + "arrival_time": 5.36576, + "worker_start": 33.2846460000223, + "worker_end": 33.38052200002898, + "rx_cpu_seconds": 0.09587600000668317, + "packets": 0, + "lag_seconds": 28.01476200002898 + }, + { + "samples_received": 42991616, + "arrival_time": 5.373952, + "worker_start": 33.38052200002898, + "worker_end": 33.478233300040706, + "rx_cpu_seconds": 0.09771130001172423, + "packets": 0, + "lag_seconds": 28.104281300040707 + }, + { + "samples_received": 43057152, + "arrival_time": 5.382144, + "worker_start": 33.478233300040706, + "worker_end": 33.56697689998732, + "rx_cpu_seconds": 0.08874359994661063, + "packets": 0, + "lag_seconds": 28.184832899987317 + }, + { + "samples_received": 43122688, + "arrival_time": 5.390336, + "worker_start": 33.56697689998732, + "worker_end": 33.667197400013215, + "rx_cpu_seconds": 0.10022050002589822, + "packets": 0, + "lag_seconds": 28.276861400013217 + }, + { + "samples_received": 43188224, + "arrival_time": 5.398528, + "worker_start": 33.667197400013215, + "worker_end": 33.77164729999681, + "rx_cpu_seconds": 0.10444989998359233, + "packets": 0, + "lag_seconds": 28.37311929999681 + }, + { + "samples_received": 43253760, + "arrival_time": 5.40672, + "worker_start": 33.77164729999681, + "worker_end": 33.862747499959774, + "rx_cpu_seconds": 0.09110019996296614, + "packets": 0, + "lag_seconds": 28.456027499959774 + }, + { + "samples_received": 43319296, + "arrival_time": 5.414912, + "worker_start": 33.862747499959774, + "worker_end": 33.954261599931165, + "rx_cpu_seconds": 0.09151409997139126, + "packets": 0, + "lag_seconds": 28.539349599931164 + }, + { + "samples_received": 43384832, + "arrival_time": 5.423104, + "worker_start": 33.954261599931165, + "worker_end": 34.04854939983529, + "rx_cpu_seconds": 0.09428779990412295, + "packets": 0, + "lag_seconds": 28.625445399835286 + }, + { + "samples_received": 43450368, + "arrival_time": 5.431296, + "worker_start": 34.04854939983529, + "worker_end": 34.097848899903006, + "rx_cpu_seconds": 0.04929950006771833, + "packets": 0, + "lag_seconds": 28.666552899903007 + }, + { + "samples_received": 43515904, + "arrival_time": 5.439488, + "worker_start": 34.097848899903006, + "worker_end": 34.12584519992419, + "rx_cpu_seconds": 0.02799630002118647, + "packets": 0, + "lag_seconds": 28.686357199924192 + }, + { + "samples_received": 43581440, + "arrival_time": 5.44768, + "worker_start": 34.12584519992419, + "worker_end": 34.16343779990752, + "rx_cpu_seconds": 0.037570100044831634, + "packets": 1, + "lag_seconds": 28.71575779990752 + }, + { + "samples_received": 43646976, + "arrival_time": 5.455872, + "worker_start": 34.16343779990752, + "worker_end": 34.18927969982219, + "rx_cpu_seconds": 0.025823700008913875, + "packets": 1, + "lag_seconds": 28.733407699822187 + }, + { + "samples_received": 43712512, + "arrival_time": 5.464064, + "worker_start": 34.18927969982219, + "worker_end": 34.19674379984685, + "rx_cpu_seconds": 0.007464100024662912, + "packets": 0, + "lag_seconds": 28.73267979984685 + }, + { + "samples_received": 43778048, + "arrival_time": 5.472256, + "worker_start": 34.19674379984685, + "worker_end": 34.22186199983884, + "rx_cpu_seconds": 0.025098999962210655, + "packets": 1, + "lag_seconds": 28.749605999838842 + }, + { + "samples_received": 43843584, + "arrival_time": 5.480448, + "worker_start": 34.22186199983884, + "worker_end": 34.24922709982679, + "rx_cpu_seconds": 0.027342700050212443, + "packets": 1, + "lag_seconds": 28.76877909982679 + }, + { + "samples_received": 43909120, + "arrival_time": 5.48864, + "worker_start": 34.24922709982679, + "worker_end": 34.27601669997279, + "rx_cpu_seconds": 0.026768100098706782, + "packets": 1, + "lag_seconds": 28.787376699972793 + }, + { + "samples_received": 43974656, + "arrival_time": 5.496832, + "worker_start": 34.27601669997279, + "worker_end": 34.28335859988187, + "rx_cpu_seconds": 0.007341899909079075, + "packets": 0, + "lag_seconds": 28.78652659988187 + }, + { + "samples_received": 44040192, + "arrival_time": 5.505024, + "worker_start": 34.28335859988187, + "worker_end": 34.30799629982398, + "rx_cpu_seconds": 0.024614299996756017, + "packets": 1, + "lag_seconds": 28.802972299823978 + }, + { + "samples_received": 44105728, + "arrival_time": 5.513216, + "worker_start": 34.30799629982398, + "worker_end": 34.3326934998699, + "rx_cpu_seconds": 0.024678500019945204, + "packets": 1, + "lag_seconds": 28.819477499869897 + }, + { + "samples_received": 44171264, + "arrival_time": 5.521408, + "worker_start": 34.3326934998699, + "worker_end": 34.34074869985529, + "rx_cpu_seconds": 0.008055199985392392, + "packets": 0, + "lag_seconds": 28.81934069985529 + }, + { + "samples_received": 44236800, + "arrival_time": 5.5296, + "worker_start": 34.34074869985529, + "worker_end": 34.3657058997855, + "rx_cpu_seconds": 0.02455019997432828, + "packets": 1, + "lag_seconds": 28.8361058997855 + }, + { + "samples_received": 44302336, + "arrival_time": 5.537792, + "worker_start": 34.3657058997855, + "worker_end": 34.42434259970509, + "rx_cpu_seconds": 0.058636699919588864, + "packets": 0, + "lag_seconds": 28.886550599705092 + }, + { + "samples_received": 44367872, + "arrival_time": 5.545984, + "worker_start": 34.42434259970509, + "worker_end": 34.51700809971266, + "rx_cpu_seconds": 0.09266550000756979, + "packets": 0, + "lag_seconds": 28.97102409971266 + }, + { + "samples_received": 44433408, + "arrival_time": 5.554176, + "worker_start": 34.51700809971266, + "worker_end": 34.61377909978223, + "rx_cpu_seconds": 0.09677100006956607, + "packets": 0, + "lag_seconds": 29.05960309978223 + }, + { + "samples_received": 44498944, + "arrival_time": 5.562368, + "worker_start": 34.61377909978223, + "worker_end": 34.706689699793465, + "rx_cpu_seconds": 0.09291060001123697, + "packets": 0, + "lag_seconds": 29.144321699793466 + }, + { + "samples_received": 44564480, + "arrival_time": 5.57056, + "worker_start": 34.706689699793465, + "worker_end": 34.800251699758924, + "rx_cpu_seconds": 0.09356199996545911, + "packets": 0, + "lag_seconds": 29.229691699758924 + }, + { + "samples_received": 44630016, + "arrival_time": 5.578752, + "worker_start": 34.800251699758924, + "worker_end": 34.90669129975908, + "rx_cpu_seconds": 0.10643960000015795, + "packets": 0, + "lag_seconds": 29.32793929975908 + }, + { + "samples_received": 44695552, + "arrival_time": 5.586944, + "worker_start": 34.90669129975908, + "worker_end": 35.006202499739125, + "rx_cpu_seconds": 0.09951119998004287, + "packets": 0, + "lag_seconds": 29.419258499739126 + }, + { + "samples_received": 44761088, + "arrival_time": 5.595136, + "worker_start": 35.006202499739125, + "worker_end": 35.098438899738944, + "rx_cpu_seconds": 0.0922363999998197, + "packets": 0, + "lag_seconds": 29.503302899738944 + }, + { + "samples_received": 44826624, + "arrival_time": 5.603328, + "worker_start": 35.098438899738944, + "worker_end": 35.18745339976926, + "rx_cpu_seconds": 0.08901450003031641, + "packets": 0, + "lag_seconds": 29.58412539976926 + }, + { + "samples_received": 44892160, + "arrival_time": 5.61152, + "worker_start": 35.18745339976926, + "worker_end": 35.252864699818424, + "rx_cpu_seconds": 0.0654113000491634, + "packets": 0, + "lag_seconds": 29.641344699818426 + }, + { + "samples_received": 44957696, + "arrival_time": 5.619712, + "worker_start": 35.252864699818424, + "worker_end": 35.32445219986443, + "rx_cpu_seconds": 0.07158750004600734, + "packets": 0, + "lag_seconds": 29.704740199864432 + }, + { + "samples_received": 45023232, + "arrival_time": 5.627904, + "worker_start": 35.32445219986443, + "worker_end": 35.40974089981359, + "rx_cpu_seconds": 0.08528869994916022, + "packets": 0, + "lag_seconds": 29.78183689981359 + }, + { + "samples_received": 45088768, + "arrival_time": 5.636096, + "worker_start": 35.40974089981359, + "worker_end": 35.44589849981316, + "rx_cpu_seconds": 0.036157599999569356, + "packets": 0, + "lag_seconds": 29.80980249981316 + }, + { + "samples_received": 45154304, + "arrival_time": 5.644288, + "worker_start": 35.44589849981316, + "worker_end": 35.48914659978659, + "rx_cpu_seconds": 0.04322749993298203, + "packets": 1, + "lag_seconds": 29.844858599786587 + }, + { + "samples_received": 45219840, + "arrival_time": 5.65248, + "worker_start": 35.48914659978659, + "worker_end": 35.49590929982555, + "rx_cpu_seconds": 0.006762700038962066, + "packets": 0, + "lag_seconds": 29.843429299825548 + }, + { + "samples_received": 45285376, + "arrival_time": 5.660672, + "worker_start": 35.49590929982555, + "worker_end": 35.519996499766826, + "rx_cpu_seconds": 0.024066200014203787, + "packets": 1, + "lag_seconds": 29.859324499766828 + }, + { + "samples_received": 45350912, + "arrival_time": 5.668864, + "worker_start": 35.519996499766826, + "worker_end": 35.544210899745345, + "rx_cpu_seconds": 0.024183099973015487, + "packets": 1, + "lag_seconds": 29.875346899745345 + }, + { + "samples_received": 45416448, + "arrival_time": 5.677056, + "worker_start": 35.544210899745345, + "worker_end": 35.56908319972758, + "rx_cpu_seconds": 0.02485249994788319, + "packets": 1, + "lag_seconds": 29.89202719972758 + }, + { + "samples_received": 45481984, + "arrival_time": 5.685248, + "worker_start": 35.56908319972758, + "worker_end": 35.57600849972409, + "rx_cpu_seconds": 0.006925299996510148, + "packets": 0, + "lag_seconds": 29.890760499724088 + }, + { + "samples_received": 45547520, + "arrival_time": 5.69344, + "worker_start": 35.57600849972409, + "worker_end": 35.60018479976174, + "rx_cpu_seconds": 0.024150700075551867, + "packets": 1, + "lag_seconds": 29.906744799761743 + }, + { + "samples_received": 45613056, + "arrival_time": 5.701632, + "worker_start": 35.60018479976174, + "worker_end": 35.62458489975729, + "rx_cpu_seconds": 0.024377700057812035, + "packets": 1, + "lag_seconds": 29.922952899757288 + }, + { + "samples_received": 45678592, + "arrival_time": 5.709824, + "worker_start": 35.62458489975729, + "worker_end": 35.63165279967547, + "rx_cpu_seconds": 0.007067899918183684, + "packets": 0, + "lag_seconds": 29.92182879967547 + }, + { + "samples_received": 45744128, + "arrival_time": 5.718016, + "worker_start": 35.63165279967547, + "worker_end": 35.65570329968654, + "rx_cpu_seconds": 0.024030900094658136, + "packets": 1, + "lag_seconds": 29.937687299686544 + }, + { + "samples_received": 45809664, + "arrival_time": 5.726208, + "worker_start": 35.65570329968654, + "worker_end": 35.681690899662904, + "rx_cpu_seconds": 0.0257887999759987, + "packets": 1, + "lag_seconds": 29.955482899662904 + }, + { + "samples_received": 45875200, + "arrival_time": 5.7344, + "worker_start": 35.681690899662904, + "worker_end": 35.70192729961895, + "rx_cpu_seconds": 0.020236399956047535, + "packets": 0, + "lag_seconds": 29.96752729961895 + }, + { + "samples_received": 45940736, + "arrival_time": 5.742592, + "worker_start": 35.70192729961895, + "worker_end": 35.800752699615664, + "rx_cpu_seconds": 0.0988253999967128, + "packets": 0, + "lag_seconds": 30.058160699615662 + }, + { + "samples_received": 46006272, + "arrival_time": 5.750784, + "worker_start": 35.800752699615664, + "worker_end": 35.89283259958797, + "rx_cpu_seconds": 0.0920798999723047, + "packets": 0, + "lag_seconds": 30.14204859958797 + }, + { + "samples_received": 46071808, + "arrival_time": 5.758976, + "worker_start": 35.89283259958797, + "worker_end": 35.988072799526385, + "rx_cpu_seconds": 0.09524019993841648, + "packets": 0, + "lag_seconds": 30.229096799526385 + }, + { + "samples_received": 46137344, + "arrival_time": 5.767168, + "worker_start": 35.988072799526385, + "worker_end": 36.087012599462874, + "rx_cpu_seconds": 0.09893979993648827, + "packets": 0, + "lag_seconds": 30.319844599462876 + }, + { + "samples_received": 46202880, + "arrival_time": 5.77536, + "worker_start": 36.087012599462874, + "worker_end": 36.17779679946438, + "rx_cpu_seconds": 0.090784200001508, + "packets": 0, + "lag_seconds": 30.402436799464382 + }, + { + "samples_received": 46268416, + "arrival_time": 5.783552, + "worker_start": 36.17779679946438, + "worker_end": 36.27327449946501, + "rx_cpu_seconds": 0.09547770000062883, + "packets": 0, + "lag_seconds": 30.48972249946501 + }, + { + "samples_received": 46333952, + "arrival_time": 5.791744, + "worker_start": 36.27327449946501, + "worker_end": 36.366497599411055, + "rx_cpu_seconds": 0.09322309994604439, + "packets": 0, + "lag_seconds": 30.574753599411054 + }, + { + "samples_received": 46399488, + "arrival_time": 5.799936, + "worker_start": 36.366497599411055, + "worker_end": 36.46508789936383, + "rx_cpu_seconds": 0.09859029995277524, + "packets": 0, + "lag_seconds": 30.66515189936383 + }, + { + "samples_received": 46465024, + "arrival_time": 5.808128, + "worker_start": 36.46508789936383, + "worker_end": 36.54634689936251, + "rx_cpu_seconds": 0.08125899999868125, + "packets": 0, + "lag_seconds": 30.73821889936251 + }, + { + "samples_received": 46530560, + "arrival_time": 5.81632, + "worker_start": 36.54634689936251, + "worker_end": 36.564193999402455, + "rx_cpu_seconds": 0.017847100039944053, + "packets": 0, + "lag_seconds": 30.747873999402454 + }, + { + "samples_received": 46596096, + "arrival_time": 5.824512, + "worker_start": 36.564193999402455, + "worker_end": 36.640096099472835, + "rx_cpu_seconds": 0.07590210007037967, + "packets": 0, + "lag_seconds": 30.815584099472836 + }, + { + "samples_received": 46661632, + "arrival_time": 5.832704, + "worker_start": 36.640096099472835, + "worker_end": 36.7108668994701, + "rx_cpu_seconds": 0.07077079999726266, + "packets": 0, + "lag_seconds": 30.878162899470098 + }, + { + "samples_received": 46727168, + "arrival_time": 5.840896, + "worker_start": 36.7108668994701, + "worker_end": 36.7532353994979, + "rx_cpu_seconds": 0.042345400084741414, + "packets": 1, + "lag_seconds": 30.912339399497903 + }, + { + "samples_received": 46792704, + "arrival_time": 5.849088, + "worker_start": 36.7532353994979, + "worker_end": 36.761706599391296, + "rx_cpu_seconds": 0.008471199893392622, + "packets": 0, + "lag_seconds": 30.912618599391294 + }, + { + "samples_received": 46858240, + "arrival_time": 5.85728, + "worker_start": 36.761706599391296, + "worker_end": 36.78618049948313, + "rx_cpu_seconds": 0.024452800047583878, + "packets": 1, + "lag_seconds": 30.92890049948313 + }, + { + "samples_received": 46923776, + "arrival_time": 5.865472, + "worker_start": 36.78618049948313, + "worker_end": 36.80996159953833, + "rx_cpu_seconds": 0.023761100019328296, + "packets": 1, + "lag_seconds": 30.944489599538333 + }, + { + "samples_received": 46989312, + "arrival_time": 5.873664, + "worker_start": 36.80996159953833, + "worker_end": 36.81773299945821, + "rx_cpu_seconds": 0.007771399919874966, + "packets": 0, + "lag_seconds": 30.94406899945821 + }, + { + "samples_received": 47054848, + "arrival_time": 5.881856, + "worker_start": 36.81773299945821, + "worker_end": 36.841672999442785, + "rx_cpu_seconds": 0.023916800040751696, + "packets": 1, + "lag_seconds": 30.959816999442786 + }, + { + "samples_received": 47120384, + "arrival_time": 5.890048, + "worker_start": 36.841672999442785, + "worker_end": 36.866519699346505, + "rx_cpu_seconds": 0.02480499993544072, + "packets": 1, + "lag_seconds": 30.976471699346504 + }, + { + "samples_received": 47185920, + "arrival_time": 5.89824, + "worker_start": 36.866519699346505, + "worker_end": 36.873344099273204, + "rx_cpu_seconds": 0.006824399926699698, + "packets": 0, + "lag_seconds": 30.975104099273203 + }, + { + "samples_received": 47251456, + "arrival_time": 5.906432, + "worker_start": 36.873344099273204, + "worker_end": 36.89819409931847, + "rx_cpu_seconds": 0.024826899985782802, + "packets": 1, + "lag_seconds": 30.991762099318468 + }, + { + "samples_received": 47316992, + "arrival_time": 5.914624, + "worker_start": 36.89819409931847, + "worker_end": 36.92514819932007, + "rx_cpu_seconds": 0.026933399960398674, + "packets": 1, + "lag_seconds": 31.01052419932007 + }, + { + "samples_received": 47382528, + "arrival_time": 5.922816, + "worker_start": 36.92514819932007, + "worker_end": 36.950008799213215, + "rx_cpu_seconds": 0.024676599889062345, + "packets": 1, + "lag_seconds": 31.027192799213214 + }, + { + "samples_received": 47448064, + "arrival_time": 5.931008, + "worker_start": 36.950008799213215, + "worker_end": 36.95719669923023, + "rx_cpu_seconds": 0.007187900017015636, + "packets": 0, + "lag_seconds": 31.026188699230232 + }, + { + "samples_received": 47513600, + "arrival_time": 5.9392, + "worker_start": 36.95719669923023, + "worker_end": 37.04207209929195, + "rx_cpu_seconds": 0.08487540006171912, + "packets": 0, + "lag_seconds": 31.10287209929195 + }, + { + "samples_received": 47579136, + "arrival_time": 5.947392, + "worker_start": 37.04207209929195, + "worker_end": 37.130674699212655, + "rx_cpu_seconds": 0.08860259992070496, + "packets": 0, + "lag_seconds": 31.183282699212654 + }, + { + "samples_received": 47644672, + "arrival_time": 5.955584, + "worker_start": 37.130674699212655, + "worker_end": 37.21983639919967, + "rx_cpu_seconds": 0.08916169998701662, + "packets": 0, + "lag_seconds": 31.26425239919967 + }, + { + "samples_received": 47710208, + "arrival_time": 5.963776, + "worker_start": 37.21983639919967, + "worker_end": 37.316125199206404, + "rx_cpu_seconds": 0.09628880000673234, + "packets": 0, + "lag_seconds": 31.352349199206405 + }, + { + "samples_received": 47775744, + "arrival_time": 5.971968, + "worker_start": 37.316125199206404, + "worker_end": 37.414724899230755, + "rx_cpu_seconds": 0.09859970002435148, + "packets": 0, + "lag_seconds": 31.442756899230755 + }, + { + "samples_received": 47841280, + "arrival_time": 5.98016, + "worker_start": 37.414724899230755, + "worker_end": 37.51342479920317, + "rx_cpu_seconds": 0.09869989997241646, + "packets": 0, + "lag_seconds": 31.533264799203174 + }, + { + "samples_received": 47906816, + "arrival_time": 5.988352, + "worker_start": 37.51342479920317, + "worker_end": 37.615173999227814, + "rx_cpu_seconds": 0.10174920002464205, + "packets": 0, + "lag_seconds": 31.626821999227815 + }, + { + "samples_received": 47972352, + "arrival_time": 5.996544, + "worker_start": 37.615173999227814, + "worker_end": 37.710225499242775, + "rx_cpu_seconds": 0.09505150001496077, + "packets": 0, + "lag_seconds": 31.713681499242774 + }, + { + "samples_received": 48037888, + "arrival_time": 6.004736, + "worker_start": 37.710225499242775, + "worker_end": 37.808262299288295, + "rx_cpu_seconds": 0.09803680004552007, + "packets": 0, + "lag_seconds": 31.803526299288293 + }, + { + "samples_received": 48103424, + "arrival_time": 6.012928, + "worker_start": 37.808262299288295, + "worker_end": 37.89975019929302, + "rx_cpu_seconds": 0.09148790000472218, + "packets": 0, + "lag_seconds": 31.886822199293018 + }, + { + "samples_received": 48168960, + "arrival_time": 6.02112, + "worker_start": 37.89975019929302, + "worker_end": 37.996216699372276, + "rx_cpu_seconds": 0.09646650007925928, + "packets": 0, + "lag_seconds": 31.975096699372276 + }, + { + "samples_received": 48234496, + "arrival_time": 6.029312, + "worker_start": 37.996216699372276, + "worker_end": 38.09244759940379, + "rx_cpu_seconds": 0.09623090003151447, + "packets": 0, + "lag_seconds": 32.06313559940379 + }, + { + "samples_received": 48300032, + "arrival_time": 6.037504, + "worker_start": 38.09244759940379, + "worker_end": 38.18456899934285, + "rx_cpu_seconds": 0.09212139993906021, + "packets": 0, + "lag_seconds": 32.14706499934285 + }, + { + "samples_received": 48355328, + "arrival_time": 6.044416, + "worker_start": 38.18456899934285, + "worker_end": 38.28998359933798, + "rx_cpu_seconds": 0.10541459999512881, + "packets": 0, + "lag_seconds": 32.24556759933798 + }, + { + "samples_received": 48355328, + "arrival_time": 6.044416, + "worker_start": 38.28998359933798, + "worker_end": 38.67681979935919, + "rx_cpu_seconds": 0.38683620002120733, + "packets": 0, + "lag_seconds": 32.63240379935919 + } + ], + "rf_tx": 0 +} diff --git a/docs/LABS_INDEX.md b/docs/LABS_INDEX.md index 9830da1..a36341c 100644 --- a/docs/LABS_INDEX.md +++ b/docs/LABS_INDEX.md @@ -275,6 +275,39 @@ - **Далее:** Lab051 — профиль и ускорение строгой обработки ложных кандидатов. - **RF:** RF TX = 0. Lab050 commit/push не выполнялись. STOP. +## Lab051 + +- **Цель:** алгоритмически ускорить независимый блочный RX на 500 ксимв/с, + 16 отсчётов/символ, Fs=8 Мвыб/с; проверить 5 свежих JPEG C в секунду. +- **База:** Lab050 закреплена разрешённым коммитом + `60691a09f193f36983c7174c5252ed0897c559e9`. +- **Профиль:** главная стоимость Lab050 — fallback timing, 41,833 с на ложных + кандидатах. Полный диапазон 1601 смещения сохранён и вычисляется через FFT + и накопленные энергии, с исходным выбором на неразделимых пиках. +- **Изменения:** общий front-end, точное повторное использование децимации, + кэш результатов уточнённого окна, короткий probe до PHY PASS, предвычисленные + метрики прежнего Viterbi. Порог, PHY/FEC/CRC и protocol не менялись. +- **Короткий контроль:** 24/24 пакета, 3/3 точных JPEG; медиана трёх повторов + 1,144176 с вместо исторических 55,157553 с. Processing/RF=3,534193. +- **Основной поток:** 30 JPEG за 6 с, 240/240 пакетов, SHA MATCH 30/30. + Обработка 6,044416 с IQ заняла 38,630132 с, processing/RF=6,391045. + При MAX_VIDEO_AGE=200 мс все 30 JPEG просрочены; FRESH DISPLAY FPS=0. + Цель реального времени не достигнута, включая минимальную свежесть >0. +- **Память:** пик удерживаемого IQ 3,031 МиБ, RSS процесса в опыте измерен. + Тест 33,55 с не показывает роста IQ/кэша с длительностью. Это не готовая live- + очередь: непрерывный источник потребовал бы около 2,09 ГБ внешнего backlog. +- **Регрессия:** сохранённая Lab047-запись 20 ксимв/с штатным Lab048: + 36/36, CRC PASS, JPEG SHA MATCH; 19 ошибок до FEC и 0 после. +- **Код:** [приёмник](../experiments/lab051_streaming_receiver.py), + [профилировщик](../experiments/lab051_receiver_profile.py), + [полный поток](../experiments/lab051_receiver_performance.py), + [38 тестов](../tests/test_lab051_streaming_receiver.py). +- **Отчёт:** [состояние](lab051_current_state.md), + [измеренный поток](../data/processed/lab051/stream.json). Журнал: запись 040. +- **Далее:** отдельное программное исследование стоимости уникальных фоновых + кандидатов в полном потоке 5 кадров/с с тем же PHY/FEC/CRC. +- **RF / Git:** RF TX=0; Lab051 git add/commit и push не выполнялись. STOP. + ## Правило хранения данных Большие записи IQ, потоки `cs8`, бинарные объекты и другие аппаратные исходные diff --git a/docs/lab051_current_state.md b/docs/lab051_current_state.md new file mode 100644 index 0000000..f826083 --- /dev/null +++ b/docs/lab051_current_state.md @@ -0,0 +1,281 @@ +# Lab051 — вычислительная архитектура потокового BPSK-приёмника + +Дата: 8 сентября 2026 года. SOFTWARE ONLY. RF TX = 0. + +## Результат и граница вывода + +**Программный эксперимент завершён; цели реального времени и свежести не достигнуты.** +В полном шестисекундном потоке получены 240/240 физических пакетов и 30/30 JPEG +с точным содержимым. Обработка 6,044416 с синтетического IQ заняла **38,630132 с**, +отношение **6,391045**. При MAX_VIDEO_AGE=200 мс **FRESH DISPLAY FPS=0**; +не выполнен даже минимальный критерий >0. + +Короткий шумный сценарий Lab050 ускорен примерно в **48,21 раза** относительно +исторического замера: 55,157553 с → медиана **1,144176 с** трёх проходов. +Его processing/RF = **3,534193**, поэтому и этот вариант не работает в реальном времени. +Среднее успешного кандидата — **17,7675 мс**; полная стоимость короткого опыта — +**47,674 мс/пакет**, а длинного потока — **160,959 мс/пакет**. +Последние величины включают обработку ложных кандидатов и фона. + +Модуляция BPSK, PRBS7, PHY-заголовок, фрагментация, интерливер, FEC R=1/2 K=7, +171/133 octal, soft-метрика и CRC не менялись. GPU и multiprocessing не использовались. +Новых зависимостей нет. Аппаратура не перечислялась и не запускалась. + +## Git и аудит до реализации + +Исходный main: `cdf5396e807b83f82a264632dc46f71428fcd616`. +Проверены HEAD/status/diff stat/diff check, затем показан точный staged scope. +По прямому разрешению пункта 0 задания создан коммит: + +`60691a09f193f36983c7174c5252ed0897c559e9` + +`Lab050: model fresh-frame SDR video stream` + +В него вошли ровно девять файлов: PROJECT_LOG.md, docs/LABS_INDEX.md, +experiments/lab046c_offline_recovery.py, protocol/video_frame_scheduler.py, +docs/lab050_current_state.md, experiments/lab050_streaming_receiver.py, +experiments/lab050_video_stream.py, tests/test_lab050_video_stream.py, +data/processed/lab050/receiver_benchmarks.json. 1769 добавлений, 12 удалений. +Большой result.json, профили JPEG и посторонние локальные файлы не добавлялись. + +Lab051 начата от этого HEAD. Изучены Lab046B/C, Lab047, Lab048, Lab050, +Lab043/044/045 и свёрточный декодер. Ядро protocol в Lab051 не менялось. +Планировщик LATEST_ONLY и ObjectAssembler переиспользованы. Новая видеочередь не создана. + +## Профиль до оптимизации + +Рабочая точка: 500000 символов/с, Fs=8000000 отсчётов/с, 16 отсчётов/символ. +Профиль C: 128×96 RGB, JPEG quality 25. Короткий контроль: три изображения, +24 пакета, seed=50050, coded-bit Eb/N0=7 дБ, CFO=+10 Гц, фаза 0,73 рад, +чередование полярности, исходное CS8-квантование. Генератор точно прежний, из Lab050. + +Путь кандидата: IQ → грубая нормированная корреляция → уточнение старта → +согласованный RRC-фильтр → timing → оценка частотного рассогласования CFO → +компенсация CFO и фазы → мягкие решения → PHY header → deinterleave → +soft Viterbi → protocol parser → CRC. Только полный PHY/FEC/CRC PASS выдаёт пакет. +TX-границы, ожидаемое число кадров и содержимое не входят в RX API. + +Историческая база Lab050: 55,157553 / 0,323745 = 170,373647. +Свежий инструментированный baseline Lab051: **49,614327 с**, processing/RF=153,251430. +Настольная нагрузка и инструментация влияют на время; эти замеры не подменяют друг друга. +Все 2374 кандидата: 24 valid, 2350 false. Средние времена — **72,967 / 20,099 мс**. + +**Главная причина замедления — fallback timing.** Номинальное положение равно 416, +а диапазон остался −800…+800 отсчётов. Начало выходит за ноль, и прежний быстрый +путь возвращается к Python-перебору 1601 смещения. У ложных кандидатов timing +занял 41,833 с из 47,232 с строгой обработки. Их matched filter — 0,934 с, +уточнение — 2,797 с. Прежняя реализация уже останавливала кандидата при PHY FAIL: +тело, Viterbi и CRC на таких входах не запускались. + +Для преамбулы и заголовка достаточно 23456 входных отсчётов и 23616 отсчётов +после RRC. Полный физический пакет с payload 256 байт требует 92256 входных +отсчётов. Длина тела определяется только проверенным PHY-заголовком. + +## Изменения вычислений + +1. Децимация сохраняет внутреннюю часть конечного импульсного отклика FIR. + При сдвиге буфера заново считаются левый нулевой край и новые правые отсчёты. + Коэффициенты resample_poly/kaiser(8) прежние; сравнение с исходной функцией + побитно точное. Среднее по всему прежнему окну сохраняется. Корреляция считается + только для принадлежащих блоку стартов плюс правый сосед максимума. +2. Корреляция известного prefix для уточнения считается один раз для общего участка. + Кандидаты используют срезы, с прежней поправкой локального DC. + Постоянный probe и неразделимые FFT-пики сохраняют исходный выбор первого + максимума; при необходимости вызывается старое уточнение. +3. Компенсация известного +50 кГц и RRC выполняются для общего участка. + Локальное вычитание среднего и оба нулевых края изолированного окна + восстановлены отдельно. Без этих поправок общая фильтрация меняла бы алгоритм. + Тело за пределами общего участка фильтруется локально только после PHY PASS. +4. Извлечение символов кэшируется по уточнённому положению и длине внутри одного блока. + Усечённое окно не подменяется ранее сохранённым полным окном. + Кэш уничтожается вместе с блоком; история сессии не сохраняется. +5. Timing сохраняет весь прежний диапазон 1601 смещения. Корреляция с разреженной + известной преамбулой и разности накопленных энергий заменяют Python-перебор. + Тело за последним нужным отсчётом не участвует в этом расчёте. При пиках, + неразделимых с точностью float32, возвращается исходный расчёт и его tie-правило. +6. CFO по прежним преамбульным символам не изменён. Векторы переноса кэшируются; + вектор остаточной частоты строится на символах локального окна. Gain/фаза для + probe и полного кадра не объединены: у них различается локальное среднее IQ. +7. Viterbi после устранения главного повтора остался существенной долей принятого + пакета. Предвычислены четыре различные пары евклидовых branch metrics; + две ветви сравниваются непосредственно, с прежним выбором branch 0 при равенстве. + Решётка, старт/финиш 0, шесть хвостовых битов и декодированные биты сохранены. + +Дополнительный порог преамбулы/новый критерий отсева не введён. Фиксированный +порог первого каскада **0.030964473262429237** сохранён. В коротком опыте совпали +число кандидатов и все причины отказа с исходным RX. Параллелизм и CUDA не добавлялись. + +## Профиль стадий + +Ячейка: **число вызовов / суммарные миллисекунды** по соответствующей группе. +Это не длительность одного вызова. Общая работа front-end учитывается в том +кандидате, который впервые запросил её. Фаза показана без вложенного CFO; +время body pipeline не складывается повторно со временем Viterbi/CRC. + +| Стадия | Baseline valid (24) | Optimized valid (24) | Baseline false (2350) | Optimized false (2350) | +|---|---:|---:|---:|---:| +| Точное уточнение | 24 / 28.974 | 24 / 93.878 | 2350 / 2797.404 | 2350 / 119.743 | +| Согласованная RRC-фильтрация | 48 / 190.656 | 48 / 102.875 | 2336 / 933.965 | 174 / 26.502 | +| Timing: весь диапазон | 48 / 914.632 | 48 / 43.535 | 2336 / 41833.166 | 174 / 138.588 | +| CFO и комплексное усиление | 48 / 10.838 | 48 / 8.442 | 2336 / 485.772 | 174 / 26.385 | +| Фаза/полярность и диагностика | 48 / 8.994 | 48 / 8.324 | 2336 / 424.756 | 174 / 28.438 | +| PHY header | 48 / 1.711 | 48 / 1.452 | 2298 / 67.136 | 2298 / 32.044 | +| Viterbi | 24 / 484.381 | 24 / 132.119 | 0 / 0 | 0 / 0 | +| Protocol parser / CRC | 24 / 0.270 | 24 / 0.211 | 0 / 0 | 0 / 0 | + +Грубая локализация — общая стадия: 36 вызовов, baseline 498,040 мс, +optimized **89,183 мс**. На один false candidate среднее **0,187317 мс**, +медиана **0,060500 мс**; это включает cache hits. Холодное новое окно дороже. + +## Массивы и память + +Число всех аллокаций внутри NumPy/SciPy C не измерено. Line tracer наблюдает +массивы в локальных переменных проектного Python: число ниже — **нижняя граница**, +включающая views. Владельцы данных выделены отдельно. Временные выражения и +внутренние C-массивы не перечислены. Отдельный tracemalloc-проход измеряет пик +отслеживаемой памяти. Эти медленные проходы не включены в CPU benchmark. + +| Кандидат / алгоритм | Наблюдаемые ndarray | Из них владельцы | Суммарные байты наблюдаемых владельцев | Пик tracemalloc, байт | +|---|---:|---:|---:|---:| +| false / baseline | 2888 | 61 | 6612268 | 2104129 | +| false / optimized | 76 | 61 | 5906101 | 5524392 | +| valid / baseline | 14361 | 8704 | 16681890 | 5885299 | +| valid / optimized | 6594 | 6560 | 12345244 | 7771675 | + +Пик холодного кандидата вырос из-за общих промежуточных данных: ускорение не +объявляется уменьшением каждого временного массива. В рабочем потоке: + +- Пик удерживаемых IQ: **3177728 байт = 3,031 МиБ**. +- Проверяемый предел IQ: 3398912 байт; кэш децимации хранится отдельно. +- Инженерная оценка рабочих массивов: **136,161 МиБ**. Использован запас прежних + 22 размеров IQ-окна плюс 20 размеров на новые массивы и кэши. Это оценка для + данного опыта, не доказанный универсальный предел всех аллокаций и не RSS. +- Windows process RSS после потока: **154,105 МиБ**; peak RSS процесса — + **178,004 МиБ**. В него входят Python, библиотеки, генератор, предыдущие замеры и аллокатор. +- Текущий объект ограничен 65536 байтами / 269 фрагментами; C фактически ≤1893 байт. + +Длинный тест: **4096 блоков, 33,554432 с модельного времени**. Фон нулевой; +шум отдельно проверен в основном опыте. После прогрева удерживаются 2653440 байт +IQ и 397216 байт децимированных данных; значения не растут. +RSS контрольных точек: **156,199–156,250 МиБ**, без роста вместе с длительностью. +После finish эти буферы освобождены. История JSON относится к отчёту, не к RX. + +## Непрерывный поток 5 изображений/с + +30 воспроизводимых сдвигов исходного data/raw/lab011_scene.jpg, профиль C, +1740–1893 байта. Это искусственная последовательность, не видео камеры. +Видеопланировщик LATEST_ONLY использует время capture и завершает активное JPEG. +Передатчик знает нижнюю задержку радио/буфера; он не получает будущую стоимость +CPU или результаты приёма. Приёмник получает лишь IQ-блоки по 65536 отсчётов. + +Шум, фаза, CFO и полярность заданы, но готовность JPEG берётся из измеренного encode. +Поэтому точное размещение пакетов и число фоновых кандидатов длинного опыта могут +немного меняться между запусками. Короткий baseline использует точно прежний +детерминированный сценарий Lab050. + +Время CPU-работника для каждого блока: +`start=max(previous_end, block_arrival); end=start+measured_push_time`. +Сборка/JPEG decode добавляют своё измеренное время. Генерация TX/IQ, SHA-сравнение +с передатчиком и запись JSON исключены. Длительность RX не заменена нулём. +Все данные реально прошли независимый PHY/FEC/CRC и JPEG decode. + +| Метрика | Итог | +|---|---:| +| INPUT FPS / FRAMES | 5 / 30 | +| TX IMAGES / PHYSICAL PACKETS | 30 / 240 | +| DROPPED BEFORE TX | 0 | +| MAX WAITING VIDEO FRAMES | 1 | +| RX PHYSICAL PACKETS / IMAGES | 240 / 30 | +| JPEG SHA MATCH | 30 / 30 | +| DROPPED STALE AT DISPLAY | 30 | +| DISPLAYED / FRESH DISPLAYED | 0 / 0 | +| RAW RECEIVED FPS в первых 6 с CPU-шкалы | 0.833333 | +| RAW DISPLAY FPS / FRESH DISPLAY FPS | 0 / 0 | +| Возраст декодированных JPEG: min / median / max | 276.515 / 15691.203 / 31150.009 мс | +| MAX_VIDEO_AGE | 200 мс | +| Строгих кандидатов | 147082 | +| Полное время обработки / IQ | 38.630132 / 6.044416 с | +| PROCESSING / RF TIME | 6.391045 | + +Возраст относится к **декодированным, затем отброшенным JPEG**. Показанных изображений нет. +RAW DISPLAY и FRESH DISPLAY совпадают, потому что политика не выводит просроченные +изображения; RAW RECEIVED приведён отдельно. + +Физическое время одного JPEG C: 8×5766/500000 = **92,256 мс**. Очередь ожидающих +JPEG в этом режиме не задерживает готовые изображения. Время RX за опыт: +38,619085 с; сборка 5,451 мс; JPEG decode 5,596 мс суммарно на 30 JPEG. +RF и CPU перекрываются по событийной шкале: эти суммы нельзя просто сложить +и назвать измеренной задержкой камеры→экрана. Camera capture latency и display +latency **UNKNOWN**; экран в отчётной модели мгновенный. + +Capture lookup используется только **после** независимой сборки JPEG для метрики +возраста/решения модели вывода. В существующем fragment format нет времени съёмки. +Готовый независимый аппаратный контроль возраста этим не доказан; формат в Lab051 +не расширялся. ID монотонны в одной конечной сессии; wrap/restart не реализованы. + +Внешняя IQ-очередь также не реализована. Офлайн-источник подаёт следующий блок +по запросу и физически не хранит многосекундный backlog. Если бы вход шёл непрерывно, +максимальное отставание **32,632404 с** потребовало бы около **2088473848 байт** +дополнительного complex64 IQ. Поэтому bounded RX state нельзя выдавать за готовую +ограниченную live-систему: при таких затратах потребуются потери/переполнение. +REAL-TIME CAPABLE = NO. + +В длительном опыте встречено значительно больше фоновых кандидатов, чем в коротком: +147082 против 2374. Кэш дал 135057 повторных использований, но осталось 12239 новых +окон синхронизации. Следующее ограничение — стоимость этих фоновых событий. +Одного ускорения Viterbi недостаточно; подгонять отсев по TX запрещено. + +## Регрессии и независимая проверка + +38 целевых тестов: весь диапазон timing, ненулевые и нулевые ties, локальные +DC/края общего RRC, точная децимация при движении окна, Viterbi noisy/tie/invalid, +совпадение старого/нового блочного приёма, усечение, буферы и finally. +Verifier нашёл два случая округления FFT (timing и refine); оба исправлены, +воспроизведены повторно и закреплены тестами. Adversary отдельно проверил +malformed PHY (0 body/Viterbi), дубликаты и старые ID, лимиты объекта, +усечение и восстановление глобальных подмен. + +Сохранённая Lab047-запись 20 ксимв/с повторно обработана штатным Lab048: +**36/36, FEC/CRC PASS, JPEG SHA MATCH**, 19 ошибок до FEC, 0 после. +Исходный путь и SHA JPEG сохранены в regression20k/result.json. +Старый режим работает прежним декодером; адаптер Lab051 принимает только 500 ксимв/с +и не подменяет аппаратную проверку этого режима. + +Итог: quick_gate PASS — 688 тестов, 17 функциональных проверок, 13 штатных пропусков. +Полный pytest — 688 passed за 72,92 с, 0 failed; одно предупреждение доступа к +`.pytest_cache`. git diff --check PASS. Подробности — в записи 040 журнала. +Управление ELRS/CRSF, локальная защита и ядро protocol не менялись. + +## Файлы и воспроизведение + +- [Потоковый RX](../experiments/lab051_streaming_receiver.py) +- [Профилировщик](../experiments/lab051_receiver_profile.py) +- [Сценарии и событийная шкала](../experiments/lab051_receiver_performance.py) +- [Тесты](../tests/test_lab051_streaming_receiver.py) +- [Baseline](../data/processed/lab051/baseline_profile.json) +- [Три коротких замера и профиль](../data/processed/lab051/benchmark.json) +- [Основной поток и все 739 блоков](../data/processed/lab051/stream.json) +- [Длинный тест памяти](../data/processed/lab051/memory.json) +- [Наблюдение массивов](../data/processed/lab051/replay.json) +- [20 ксимв/с](../data/processed/lab051/regression20k/result.json) + +```powershell +python experiments/lab051_receiver_profile.py +python experiments/lab051_receiver_performance.py --stage all +python -m pytest tests/test_lab051_streaming_receiver.py -q -p no:cacheprovider +python tools/quick_gate.py +python -m pytest tests/ -q +git diff --check +``` + +Старая запись: + +```powershell +python experiments/lab048_receiver_performance.py --run-saved-capture --capture 'C:\Users\user\Documents\SDR_Rover_Lab047_raw\20260903_115747\rx_stream.cs8' --original-result 'C:\Users\user\Documents\SDR_Rover_Lab047_raw\20260903_115747\independent_result.json' --tx-image data/processed/lab047/tx_image.jpg --output-directory data/processed/lab051/regression20k +``` + +Локальные replay .npy — ограниченные окна, не полная IQ-запись; в Git не добавлены. +Новый полный CS8/IQ файл не создавался. Lab051 git add/commit и push не выполнялись. +Следующий рекомендуемый этап — отдельное программное исследование стоимости +уникальных фоновых кандидатов в полном режиме 5 кадров/с с тем же PHY/FEC/CRC. +RF, QPSK, новый FEC/кодек, 180 МГц и аппаратные 500 ксимв/с не выполнялись. STOP. diff --git a/experiments/lab051_receiver_performance.py b/experiments/lab051_receiver_performance.py new file mode 100644 index 0000000..1fa7c07 --- /dev/null +++ b/experiments/lab051_receiver_performance.py @@ -0,0 +1,320 @@ +"""Lab051: измеренный блочный RX и возраст JPEG в шестисекундном потоке. + +Источник синтетический, из реального фото. RF не выполняется. Виртуальное +время работника использует фактическое время каждого push/сборки/JPEG decode. +Это офлайн-воспроизведение; отставание явно означает требуемый внешний IQ backlog. +""" + +from __future__ import annotations + +import argparse +from collections import Counter +from dataclasses import asdict +import hashlib +from io import BytesIO +import json +import math +from pathlib import Path +import statistics +import sys +import time + +if __package__ in (None, ""): + sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +import numpy as np +from PIL import Image + +from experiments import lab050_video_stream as video +from experiments import lab051_streaming_receiver as fast +from experiments.lab051_receiver_profile import OUTPUT, ROOT, StageProfiler, array_observation, process_memory +from protocol.video_frame_scheduler import FramePolicy, schedule_video_frames + + +def write_result(name: str, result: dict) -> None: + OUTPUT.mkdir(parents=True, exist_ok=True) + (OUTPUT / name).write_text(json.dumps(result, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + + +class ImageSink: + """Только текущий объект; никаких ожидаемых ID, размеров JPEG или TX bytes.""" + + def __init__(self): + self.object_id = -1 + self.last_completed_id = -1 + self.assembler = None + self.first_rf_sample = None + self.first_rx_time = None + self.retained_payload_peak = 0 + self.assembly_seconds = self.jpeg_decode_seconds = 0.0 + self.rejected = Counter() + + def offer(self, packet, received_time: float) -> dict | None: + started = time.perf_counter() + fragment = video.transport.recover_fragment_from_payload(packet.payload) + if fragment is None or fragment.original_size > 65536 or fragment.fragment_count > 269: + self.rejected["invalid_fragment"] += 1 + self.assembly_seconds += time.perf_counter() - started + return None + if fragment.image_id < self.object_id or fragment.image_id <= self.last_completed_id: + self.rejected["older_object"] += 1 + self.assembly_seconds += time.perf_counter() - started + return None + if fragment.image_id > self.object_id: + self.object_id = fragment.image_id + self.assembler = video.transport.ObjectAssembler() + self.first_rf_sample = packet.start_sample + self.first_rx_time = received_time + self.assembler.offer(fragment) + self.retained_payload_peak = max(self.retained_payload_peak, fragment.original_size) + jpeg = self.assembler.recovered_object() + self.assembly_seconds += time.perf_counter() - started + if jpeg is None: + return None + decode_started = time.perf_counter() + try: + with Image.open(BytesIO(jpeg)) as image: + image.load() + dimensions = image.size + except (OSError, ValueError): + self.rejected["jpeg_decode"] += 1 + return None + finally: + self.jpeg_decode_seconds += time.perf_counter() - decode_started + self.last_completed_id = self.object_id + self.assembler = None + return {"image_id": self.object_id, "jpeg": jpeg, "dimensions": dimensions, + "first_rf_sample": self.first_rf_sample, "last_rf_sample": packet.end_sample, + "first_rx_time": self.first_rx_time} + + +def run_stream(sequence: list[video.EncodedImage]) -> dict: + """Вход RX — только последовательные IQ-блоки; TX-диагностика после JPEG.""" + mode = video.phy.PhyMode(500000) + receiver = fast.StreamingReceiver() + sink = ImageSink() + random_generator = np.random.default_rng(50050) + frames = video.make_frame_groups(sequence, 5) + packet_time = video.FRAME_INTERVALS / mode.symbol_rate + bitrate = (256 + video.HEADER_SIZE) * 8 / packet_time + # TX использует известную нижнюю задержку радио/буфера, без предсказания + # будущего CPU и без знания RX verdict. Перегрузка RX измеряется ниже. + buffer_delay = (receiver.lookahead + 2*receiver.core_samples) / mode.sample_rate_hz + schedule = schedule_video_frames(frames, (), FramePolicy.LATEST_ONLY, bitrate, + max_video_age_seconds=.2, completion_latency_seconds=buffer_delay) + starts = {} + for sent in schedule.transmitted: + starts.setdefault(sent.item.composite_frame_id, sent.start_seconds) + horizon = len(sequence) / 5 + encoded_lookup = {image.image_id: image for image in sequence} + capture_lookup = {frame.composite_frame_id: frame.generation_time_seconds for frame in frames} + pending = np.empty(0, np.complex64) + total_samples = tx_packets = 0 + worker_time = rx_processing = max_lag = 0.0 + completed = [] + block_metrics = [] + rss_samples = [] + + def consume_block(block, *, final=False): + nonlocal total_samples, worker_time, rx_processing, max_lag + total_samples += block.size + arrival = total_samples / mode.sample_rate_hz + worker_start = max(worker_time, arrival) + started = time.perf_counter() + packets = receiver.finish() if final else receiver.push_iq_block(block) + cpu = time.perf_counter() - started + rx_processing += cpu + worker_time = worker_start + cpu + for packet in packets: + started = time.perf_counter() + item = sink.offer(packet, worker_time) + cost = time.perf_counter() - started + worker_time += cost + if item is not None: + # Приём/сборка/JPEG уже завершены. TX используется только теперь. + jpeg = item.pop("jpeg") + image_id = item["image_id"] + capture = capture_lookup.get(image_id) + age = None if capture is None else worker_time - capture + completed.append({**item, "decode_complete_timestamp": worker_time, + "capture_timestamp": capture, "image_age_seconds": age, + "fresh": age is not None and 0 <= age <= .2, + "sha256": hashlib.sha256(jpeg).hexdigest(), + "sha_match": image_id in encoded_lookup and jpeg == encoded_lookup[image_id].jpeg}) + lag = max(0., worker_time - arrival) + max_lag = max(max_lag, lag) + block_metrics.append({"samples_received": total_samples, "arrival_time": arrival, + "worker_start": worker_start, "worker_end": worker_time, + "rx_cpu_seconds": cpu, "packets": len(packets), "lag_seconds": lag}) + if len(block_metrics) % 64 == 0: + rss_samples.append({"samples": total_samples, **process_memory()}) + + def push(values): + nonlocal pending + offset = 0 + if pending.size: + needed = receiver.block_samples - pending.size + joined = np.concatenate((pending, values[:needed])) + offset = min(needed, values.size) + if joined.size < receiver.block_samples: + pending = joined + return + consume_block(joined) + pending = np.empty(0, np.complex64) + while offset + receiver.block_samples <= values.size: + consume_block(values[offset:offset + receiver.block_samples]) + offset += receiver.block_samples + pending = values[offset:].copy() + + def background(count): + while count: + amount = min(count, receiver.block_samples) + values = .2 * (random_generator.normal(size=amount) + 1j*random_generator.normal(size=amount)) + push(values.astype(np.complex64)) + count -= amount + + for image in sequence: + if image.image_id not in starts: + continue + target = math.ceil(starts[image.image_id] * mode.sample_rate_hz) + background(max(0, target - total_samples - pending.size)) + for frame in video.transport.build_object_frames(image.jpeg, image.image_id): + raw = video.phy.build_parameterized_tx_cs8(frame.plan, mode) + components = np.frombuffer(raw, np.int8).astype(np.float32) + values = components[0::2] + 1j*components[1::2] + indexes = np.arange(values.size) + values = values * np.exp(1j*(.73 + 2*np.pi*10*indexes/mode.sample_rate_hz)) * (-1 if tx_packets % 2 else 1) + energy = float(np.sum(abs(values)**2)) / frame.plan.frame_symbol_count + sigma = math.sqrt(energy / (2*10**(.7))) + values += sigma*(random_generator.normal(size=values.size) + 1j*random_generator.normal(size=values.size)) + push(values.astype(np.complex64)) + tx_packets += 1 + background(max(0, math.ceil(horizon * mode.sample_rate_hz) + receiver.lookahead + receiver.core_samples + - total_samples - pending.size)) + if pending.size: + consume_block(pending) + consume_block(np.empty(0,np.complex64), final=True) + fresh = [row for row in completed if row["fresh"]] + displayed_in_window = [row for row in fresh if row["decode_complete_timestamp"] <= horizon] + decoded_in_window = [row for row in completed if row["decode_complete_timestamp"] <= horizon] + ages = [row["image_age_seconds"] for row in completed if row["image_age_seconds"] is not None] + fresh_ages = [row["image_age_seconds"] for row in fresh] + processing = rx_processing + sink.assembly_seconds + sink.jpeg_decode_seconds + return { + "scope": "continuous synthetic IQ; measured per-block CPU event replay; camera/display latency UNKNOWN", + "symbol_rate":500000,"samples_per_symbol":16,"input_fps":5,"input_frames":len(sequence), + "observation_seconds":horizon,"iq_seconds":total_samples/mode.sample_rate_hz, + "tx_images":len(starts),"tx_physical_packets":tx_packets, + "dropped_before_tx":len(schedule.dropped_frames),"maximum_waiting_frames":schedule.maximum_waiting_frames, + "rx_physical_packets":receiver.packet_count,"received_images":len(completed), + "object_jpeg_integrity":len(completed)==len(starts) and all(row["sha_match"] for row in completed), + "dropped_stale_at_display":len(completed)-len(fresh),"displayed":len(fresh),"fresh_displayed":len(fresh), + "raw_received_fps":len(decoded_in_window)/horizon, + "raw_display_fps":len(displayed_in_window)/horizon,"fresh_display_fps":len(displayed_in_window)/horizon, + "drain_fresh_displayed":len(fresh)-len(displayed_in_window), + "image_age_min_seconds":min(ages) if ages else None, + "image_age_median_seconds":statistics.median(ages) if ages else None, + "image_age_max_seconds":max(ages) if ages else None, + "fresh_image_age_seconds":fresh_ages,"max_video_age_seconds":.2, + "processing_seconds":processing,"rx_processing_seconds":rx_processing, + "assembly_seconds":sink.assembly_seconds,"jpeg_decode_seconds":sink.jpeg_decode_seconds, + "processing_per_rf_second":processing/(total_samples/mode.sample_rate_hz), + "physical_packet_processing_seconds":processing/tx_packets if tx_packets else None, + "maximum_cpu_lag_seconds":max_lag, + "implied_external_iq_backlog_bytes":math.ceil(max_lag*mode.sample_rate_hz)*8, + "live_external_queue_implemented":False, + "retained_iq_peak_bytes":receiver.peak_buffer_samples*8, + "working_arrays_upper_estimate_bytes":receiver.memory_estimate_bytes + 20*receiver.buffer_limit_samples*8, + "object_payload_peak_bytes":sink.retained_payload_peak,"process_memory":process_memory(), + "rss_samples":rss_samples,"candidate_count":receiver.candidate_count, + "rejected_reasons":dict(receiver.rejected_reasons),"front_statistics":dict(receiver.front_statistics), + "decimated_samples_reused":receiver.decimator.reused_samples, + "actual_decimator_input_samples":receiver.decimator.filtered_input_samples, + "images":completed,"blocks":block_metrics,"rf_tx":0, + } + + +def run_memory_test(block_count: int = 4096) -> dict: + """33,55 с без истории IQ/пакетов; нулевой фон отделён от noisy IQ опыта.""" + receiver = fast.StreamingReceiver() + values = np.zeros(receiver.block_samples,np.complex64) + checkpoints=[] + for index in range(block_count): + assert receiver.push_iq_block(values) == [] + assert receiver.buffer.size <= receiver.buffer_limit_samples + if (index+1) % 512 == 0: + checkpoints.append({"block":index+1,"iq_bytes":receiver.buffer.nbytes, + "decimated_bytes":receiver.decimator.values.nbytes,**process_memory()}) + assert receiver.finish()==[] + return {"blocks":block_count,"model_seconds":block_count*values.size/8000000, + "background":"zeros; noisy background covered by six-second integration", + "peak_iq_bytes":receiver.peak_buffer_samples*8,"iq_limit_bytes":receiver.buffer_limit_samples*8, + "retained_after_finish":receiver.buffer.nbytes+receiver.decimator.values.nbytes, + "checkpoints":checkpoints,"rf_tx":0} + + +def run_candidate_replay() -> dict: + metadata=json.loads((OUTPUT/"optimized_examples.json").read_text(encoding="utf-8")) + result={} + for kind, entry in metadata.items(): + raw=np.load(OUTPUT/f"optimized_{kind}_window.npy") + candidate=fast.offline.CoarseCandidate(entry["offset"],entry["score"]) + def call(optimized=False): + with fast.previous.streaming_mode(video.phy.PhyMode(500000)): + def decode(): + return fast.offline.decode_candidate_from_memmap(raw,entry["sample_count"],candidate,1, + read_iq_window=lambda data,start,end:data[2*start:2*end].view(np.complex64)) + if not optimized: + return decode() + front=fast.BlockFrontEnd(raw.view(np.complex64),65536,Counter()) + with fast.optimized_context(front): return decode() + old=call(False) + new=call(True) + assert (old.accepted,old.reason,old.refined_start_sample)==(new.accepted,new.reason,new.refined_start_sample) + result[kind]={"reason":new.reason,"baseline_arrays":array_observation(lambda:call(False)), + "optimized_arrays":array_observation(lambda:call(True))} + return result + + +def run_benchmark(sequence) -> dict: + original=video.StreamingReceiver + try: + video.StreamingReceiver=fast.StreamingReceiver + repeats=[video.benchmark_receiver(sequence[:3],500000) for unused in range(3)] + profiler=StageProfiler() + with profiler.measure(optimized=True): profiled=video.benchmark_receiver(sequence[:3],500000) + metadata={} + for kind,(raw,count,candidate) in profiler.examples.items(): + np.save(OUTPUT/f"optimized_{kind}_window.npy",raw) + metadata[kind]={"sample_count":count,"offset":candidate.sample_offset,"score":candidate.score} + write_result("optimized_examples.json",metadata) + return {"repeats":repeats,"median_processing_seconds":statistics.median(row["processing_seconds"] for row in repeats), + "profile":profiler.summary(),"profiled_benchmark":profiled,"rf_tx":0} + finally: + video.StreamingReceiver=original + + +def run_functional_tests() -> None: + assert video.maximum_jpeg_bytes(500000,5)==4148 + assert fast.lab045.conv.CONSTRAINT_LENGTH==7 + + +def main() -> None: + parser=argparse.ArgumentParser(description=__doc__) + parser.add_argument("--stage",choices=("benchmark","stream","memory","replay","all"),default="all") + args=parser.parse_args() + OUTPUT.mkdir(parents=True,exist_ok=True) + with Image.open(ROOT/"data/raw/lab011_scene.jpg") as source: + sequence=video.encode_sequence(source,video.PROFILES[2],30) + for name,function in (("benchmark",lambda:run_benchmark(sequence)),("stream",lambda:run_stream(sequence)), + ("memory",run_memory_test),("replay",run_candidate_replay)): + if args.stage not in ("all",name): continue + print(f"Lab051 {name}: START; RF TX=0",flush=True) + result=function() + write_result(f"{name}.json",result) + print(json.dumps({key:value for key,value in result.items() if key not in ( + "blocks","images","repeats","profiled_benchmark","rss_samples")},ensure_ascii=False),flush=True) + + +if __name__=="__main__": + main() diff --git a/experiments/lab051_receiver_profile.py b/experiments/lab051_receiver_profile.py new file mode 100644 index 0000000..7547754 --- /dev/null +++ b/experiments/lab051_receiver_profile.py @@ -0,0 +1,246 @@ +"""Lab051: воспроизводимое профилирование приёмника, без оборудования. + +Измерение времени отделено от медленного наблюдения массивов/tracemalloc. +Классификация valid/false происходит только после штатного PHY/FEC/CRC. +""" + +from __future__ import annotations + +from collections import defaultdict +from contextlib import contextmanager +from dataclasses import asdict, dataclass +import ctypes +from ctypes import wintypes +import json +from pathlib import Path +import statistics +import sys +import time +import tracemalloc +import weakref + +if __package__ in (None, ""): + sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +import numpy as np +from PIL import Image + +from experiments import lab046c_offline_recovery as offline +from experiments import lab050_video_stream as video +from experiments.lab050_streaming_receiver import streaming_mode + + +ROOT = Path(__file__).resolve().parents[1] +OUTPUT = ROOT / "data/processed/lab051" +lab045 = video.phy.lab045 +lab043 = lab045.lab044.lab043 + + +def process_memory() -> dict: + """Working set Windows без psutil; чужие процессы не перечисляются.""" + if sys.platform != "win32": + return {"rss_bytes": None, "peak_rss_bytes": None} + + class Counters(ctypes.Structure): + _fields_ = [("cb", wintypes.DWORD), ("PageFaultCount", wintypes.DWORD)] + [ + (name, ctypes.c_size_t) for name in ( + "PeakWorkingSetSize", "WorkingSetSize", "QuotaPeakPagedPoolUsage", + "QuotaPagedPoolUsage", "QuotaPeakNonPagedPoolUsage", "QuotaNonPagedPoolUsage", + "PagefileUsage", "PeakPagefileUsage")] + + kernel = ctypes.WinDLL("kernel32", use_last_error=True) + psapi = ctypes.WinDLL("psapi", use_last_error=True) + kernel.GetCurrentProcess.restype = wintypes.HANDLE + psapi.GetProcessMemoryInfo.argtypes = [wintypes.HANDLE, ctypes.POINTER(Counters), wintypes.DWORD] + counters = Counters() + counters.cb = ctypes.sizeof(counters) + if not psapi.GetProcessMemoryInfo(kernel.GetCurrentProcess(), ctypes.byref(counters), counters.cb): + return {"rss_bytes": None, "peak_rss_bytes": None, "error": ctypes.get_last_error()} + return {"rss_bytes": counters.WorkingSetSize, "peak_rss_bytes": counters.PeakWorkingSetSize} + + +@dataclass +class Stage: + calls: int = 0 + seconds: float = 0.0 + exclusive_seconds: float = 0.0 + + +class StageProfiler: + """Только последовательное профилирование; подмены возвращаются в finally.""" + + def __init__(self): + self.rows = [] + self.current = None + self.shared = defaultdict(Stage) + self.stack = [] + self.examples = {} + + @contextmanager + def measure(self, *, optimized: bool = False): + patches = [] + targets = ( + (offline, "_correlation_scores", "coarse_localization"), + (lab043, "_refine_frame_start", "refinement"), + (lab043, "_matched_waveform", "matched_filter"), + (lab043, "_preamble_timing_offset", "timing"), + (lab043, "_timing_offsets", "timing_fallback"), + (lab043, "_estimate_cfo_gain", "cfo_gain"), + (lab043, "_evaluate_symbols", "phase_diagnostics"), + (lab045, "decode_phy_header_soft", "phy_header"), + (lab045, "analyze_post_preamble_soft", "body_pipeline"), + (lab045.conv, "viterbi_decode_soft", "viterbi"), + (lab045, "parse_packet", "crc_parser"), + ) + if optimized: + from experiments import lab051_streaming_receiver as fast + targets += ((fast.BlockFrontEnd, "refine", "refinement"), + (fast.BlockFrontEnd, "coarse_scores", "coarse_localization"), + (fast.BlockFrontEnd, "matched_window", "matched_filter"), + (fast.BlockFrontEnd, "timing", "timing"), + (fast, "fast_viterbi", "viterbi")) + + def wrap(function, name): + def measured(*args, **kwargs): + scope = self.shared if self.current is None else self.current + stage = scope[name] + started = time.perf_counter() + entry = [0.0] + self.stack.append(entry) + try: + return function(*args, **kwargs) + finally: + elapsed = time.perf_counter() - started + self.stack.pop() + if self.stack: + self.stack[-1][0] += elapsed + stage.calls += 1 + stage.seconds += elapsed + stage.exclusive_seconds += elapsed - entry[0] + return measured + + for owner, name, stage in targets: + original = getattr(owner, name) + patches.append((owner, name, original)) + setattr(owner, name, wrap(original, stage)) + original_decode = offline.decode_candidate_from_memmap + + def candidate(raw, sample_count, coarse, number, **kwargs): + self.current = defaultdict(Stage) + started = time.perf_counter() + try: + outcome = original_decode(raw, sample_count, coarse, number, **kwargs) + elapsed = time.perf_counter() - started + kind = "valid" if outcome.accepted else "false" + self.rows.append({"kind": kind, "seconds": elapsed, "reason": outcome.reason, + "offset": coarse.sample_offset, "refined": outcome.refined_start_sample, + "stages": {name: asdict(row) for name, row in self.current.items()}}) + # По одному примеру после решения, только для отдельного replay. + if kind not in self.examples and (kind == "valid" or outcome.reason.startswith("PHY_HEADER_MAGIC")): + self.examples[kind] = (raw.copy(), sample_count, coarse) + return outcome + finally: + self.current = None + + offline.decode_candidate_from_memmap = candidate + try: + yield self + finally: + offline.decode_candidate_from_memmap = original_decode + for owner, name, original in reversed(patches): + setattr(owner, name, original) + + def summary(self) -> dict: + result = {"shared_stages": {name: asdict(row) for name, row in self.shared.items()}} + for kind in ("valid", "false"): + selected = [row for row in self.rows if row["kind"] == kind] + stages = defaultdict(Stage) + for row in selected: + for name, stage in row["stages"].items(): + stages[name].calls += stage["calls"] + stages[name].seconds += stage["seconds"] + stages[name].exclusive_seconds += stage["exclusive_seconds"] + times = [row["seconds"] for row in selected] + result[kind] = {"count": len(times), "mean_seconds": statistics.mean(times) if times else None, + "median_seconds": statistics.median(times) if times else None, + "total_seconds": sum(times), + "stages": {name: asdict(row) for name, row in stages.items()}} + return result + + +def array_observation(function) -> dict: + """Нижняя граница числа массивов в локальных переменных проектного Python. + + Временные выражения и внутренности C/SciPy не видны line tracer-у. + tracemalloc отдельно считает пик отслеживаемой памяти, включая NumPy. + Эти проходы НИКОГДА не используются как измерение производительности. + """ + seen = {} + counters = {"observed_array_objects": 0, "observed_owned_arrays": 0, "observed_owned_bytes_total": 0} + + def trace(frame, event, argument): + filename = frame.f_code.co_filename.replace("\\", "/") + if not ("/experiments/" in filename or "/protocol/" in filename): + return None + if event in ("line", "return"): + for value in frame.f_locals.values(): + if not isinstance(value, np.ndarray): + continue + identity = id(value) + if identity in seen and seen[identity]() is value: + continue + seen[identity] = weakref.ref(value) + counters["observed_array_objects"] += 1 + if value.flags.owndata: + counters["observed_owned_arrays"] += 1 + counters["observed_owned_bytes_total"] += value.nbytes + return trace + + previous = sys.gettrace() + try: + sys.settrace(trace) + function() + finally: + sys.settrace(previous) + tracemalloc.start() + try: + function() + current, peak = tracemalloc.get_traced_memory() + finally: + tracemalloc.stop() + return {**counters, "tracemalloc_retained_bytes": current, "tracemalloc_peak_bytes": peak, + "array_count_is_lower_bound": True} + + +def run_functional_tests() -> None: + assert video.phy.PhyMode(500_000).samples_per_symbol == 16 + + +def main() -> None: + OUTPUT.mkdir(parents=True, exist_ok=True) + with Image.open(ROOT / "data/raw/lab011_scene.jpg") as source: + sequence = video.encode_sequence(source, video.PROFILES[2], 3) + profiler = StageProfiler() + with profiler.measure(): + benchmark = video.benchmark_receiver(sequence, 500_000) + result = {"benchmark": benchmark, "profile": profiler.summary(), "rf_tx": 0} + (OUTPUT / "baseline_profile.json").write_text(json.dumps(result, indent=2) + "\n", encoding="utf-8") + print(json.dumps(result["profile"], indent=2), flush=True) + # Небольшие ограниченные окна, не полная запись. В Git не включать. + metadata = {} + for kind, (raw, count, coarse) in profiler.examples.items(): + np.save(OUTPUT / f"baseline_{kind}_window.npy", raw) + metadata[kind] = {"sample_count": count, "offset": coarse.sample_offset, "score": coarse.score} + with streaming_mode(video.phy.PhyMode(500_000)): + call = lambda: offline.decode_candidate_from_memmap( + raw, count, coarse, 1, + read_iq_window=lambda data, start, end: data[2*start:2*end].view(np.complex64)) + result.setdefault("array_observation", {})[kind] = array_observation(call) + (OUTPUT / "baseline_examples.json").write_text(json.dumps(metadata, indent=2) + "\n", encoding="utf-8") + result["process_memory_after_profiling"] = process_memory() + (OUTPUT / "baseline_profile.json").write_text(json.dumps(result, indent=2) + "\n", encoding="utf-8") + print(json.dumps(result["array_observation"]), flush=True) + + +if __name__ == "__main__": + main() diff --git a/experiments/lab051_streaming_receiver.py b/experiments/lab051_streaming_receiver.py new file mode 100644 index 0000000..b30cc40 --- /dev/null +++ b/experiments/lab051_streaming_receiver.py @@ -0,0 +1,364 @@ +"""Lab051: общий front-end и эквивалентный timing на 500 ксимв/с. + +PHY, FEC, CRC и порог первого каскада заимствованы без изменения правил. +Подмены старых функций действуют только внутри последовательного push. +""" + +from __future__ import annotations + +from collections import Counter +from contextlib import contextmanager +from functools import lru_cache +import math +import time + +import numpy as np +from scipy.signal import convolve, fftconvolve, oaconvolve, firwin, resample_poly + +from experiments import lab046b_continuous_iq as iq +from experiments import lab046c_offline_recovery as offline +from experiments import lab050_streaming_receiver as previous + + +phy = previous.phy +lab045 = phy.lab045 +lab043 = lab045.lab044.lab043 +ORIGINAL_REFINE = lab043._refine_frame_start +ORIGINAL_TIMING = lab043._preamble_timing_offset +ORIGINAL_MATCHED = lab043._matched_waveform +ORIGINAL_VITERBI = lab045.conv.viterbi_decode_soft + + +@lru_cache(maxsize=4) +def timing_kernel(samples_per_symbol: int) -> np.ndarray: + """Те же символы преамбулы на исходной сетке отсчётов.""" + expected = iq.radio.bpsk_modulate(lab045.lab044.preamble_bits()) + kernel = np.zeros((expected.size - 1) * samples_per_symbol + 1, np.complex64) + kernel[::samples_per_symbol] = np.conj(expected) + return kernel[::-1].copy() + + +def fast_preamble_timing(matched: np.ndarray, nominal: int, expected_symbols: np.ndarray) -> int: + """Все прежние 1601 смещения; отрицательные/усечённые окна имеют score=0. + + Корреляция с разреженной преамбулой эквивалентна vdot каждой выборки. + Энергии получаются разностями сумм на каждой из 16 фаз. Диапазон не сужен. + """ + samples_per_symbol = lab045.SAMPLES_PER_SYMBOL + offsets = np.arange(-800, 801) + starts = nominal + offsets + count = len(expected_symbols) + # Тело не участвует ни в одном из прежних 1601 timing-окон. + matched = matched[:nominal + 800 + (count - 1) * samples_per_symbol + 1] + valid = (starts >= 0) & (starts + (count - 1) * samples_per_symbol < matched.size) + scores = np.zeros(offsets.size, np.float64) + if np.any(valid): + kernel = timing_kernel(samples_per_symbol) + correlations = fftconvolve(matched, kernel, mode="valid") + padding = (-matched.size) % samples_per_symbol + power = np.pad(np.abs(matched) ** 2, (0, padding)).reshape(-1, samples_per_symbol) + cumulative = np.concatenate((np.zeros((1, samples_per_symbol)), + np.cumsum(power, axis=0, dtype=np.float64))).ravel() + selected = starts[valid] + energy = cumulative[selected + count * samples_per_symbol] - cumulative[selected] + scores[valid] = np.abs(correlations[selected]) / np.sqrt(count * np.maximum(energy, 0) + 1e-30) + largest = np.partition(scores, -2)[-2:] + if largest[-1] > 0 and largest[-1] - largest[-2] <= 32 * np.finfo(np.float32).eps * largest[-1]: + # FFT меняет последние разряды. На неразделимых пиках сохраняем + # исходное суммирование и его tie→первый offset, включая чистый тон. + return ORIGINAL_TIMING(matched, nominal, expected_symbols) + return int(offsets[int(np.argmax(scores))]) + + +@lru_cache(maxsize=8) +def carrier_rotation(length: int) -> np.ndarray: + """Кэш переносов не очищается при каждом входном блоке старым адаптером.""" + indexes = np.arange(length) + return np.exp(-2j * np.pi * lab043.CARRIER_OFFSET_HZ * indexes / lab045.SAMPLE_RATE_HZ).astype(np.complex64) + + +@lru_cache(maxsize=8) +def dc_response(length: int, samples_per_symbol: int) -> np.ndarray: + """Отклик локального окна постоянной составляющей после переноса/RRC.""" + rotation = carrier_rotation(length) + return oaconvolve(rotation, lab043._matched_filter_taps(), mode="full") + + +@lru_cache(maxsize=4) +def decimation_taps(decimation: int) -> np.ndarray: + """Штатные коэффициенты resample_poly(up=1, window=('kaiser', 8)).""" + return firwin(20 * decimation + 1, 1 / decimation, window=("kaiser", 8)).astype(np.float32) + + +@lru_cache(maxsize=8) +def detection_rotation(length: int, decimation: int) -> np.ndarray: + return np.exp(-2j * np.pi * lab045.CARRIER_OFFSET_HZ * np.arange(length) + / (lab045.SAMPLE_RATE_HZ / decimation)).astype(np.complex64) + + +class DecimationCache: + """Повторно использовать внутреннюю часть FIR, пересчитать только края. + + resample_poly имеет поддержку ±10 выходных отсчётов. После сдвига окна + неизменная внутренняя область даёт ровно те же значения; левый нулевой + край и новое продолжение считаются с прежними коэффициентами заново. + """ + + def __init__(self, decimation: int): + self.decimation = decimation + self.base = self.input_count = 0 + self.values = np.empty(0, np.complex64) + self.reused_samples = self.filtered_input_samples = 0 + + def get(self, samples: np.ndarray, base: int) -> np.ndarray: + stride = self.decimation + count = math.ceil(samples.size / stride) + shift = (base - self.base) // stride + low = max(10, -shift + 10) + high = min(count - 10, self.values.size - 11 - shift) + + def filtered(array): + self.filtered_input_samples += array.size + return resample_poly(array, 1, stride, window=decimation_taps(stride)) + + if not self.values.size or (base - self.base) % stride or high <= low: + output = filtered(samples) + else: + output = np.empty(count, np.complex64) + output[low:high] = self.values[low + shift:high + shift] + self.reused_samples += high - low + prefix_end = min(samples.size, (low + 11) * stride) + output[:low] = filtered(samples[:prefix_end])[:low] + suffix_start = (high - 11) * stride + output[high:] = filtered(samples[suffix_start:])[11:11 + count - high] + self.values = output + self.base, self.input_count = base, samples.size + return output + + +def fast_viterbi(soft_values: np.ndarray, information_bit_count: int) -> np.ndarray: + """Та же евклидова метрика и tie→branch 0, с готовыми метриками ветвей.""" + conv = lab045.conv + if not isinstance(information_bit_count, (int, np.integer)) or information_bit_count <= 0: + return ORIGINAL_VITERBI(soft_values, information_bit_count) + values = np.asarray(soft_values, dtype=np.float64) + if (values.ndim != 1 or values.size != conv.encoded_bit_count(information_bit_count) + or not np.all(np.isfinite(values))): + return ORIGINAL_VITERBI(soft_values, information_bit_count) + step_count = int(information_bit_count) + conv.TAIL_BIT_COUNT + received = values.reshape(step_count, 2) + # Всего четыре различных пары BPSK-символов. Порядок арифметики исходный. + negative = (received + 1.0) ** 2 + positive = (received - 1.0) ** 2 + metrics = np.column_stack((negative[:, 0] + negative[:, 1], negative[:, 0] + positive[:, 1], + positive[:, 0] + negative[:, 1], positive[:, 0] + positive[:, 1])) + symbols = conv._BRANCH_SYMBOLS + codes = (2 * (symbols[:, :, 0] > 0) + (symbols[:, :, 1] > 0)).astype(np.intp) + metric_zero = metrics[:, codes[:, 0]] + metric_one = metrics[:, codes[:, 1]] + predecessor_zero = conv._PREDECESSORS[:, 0] + predecessor_one = conv._PREDECESSORS[:, 1] + path = np.full(conv.STATE_COUNT, 1e18) + path[0] = 0.0 + choices = np.empty((step_count, conv.STATE_COUNT), np.uint8) + for step in range(step_count): + zero = path[predecessor_zero] + metric_zero[step] + one = path[predecessor_one] + metric_one[step] + choices[step] = one < zero + path = np.minimum(zero, one) + decoded = np.empty(step_count, np.uint8) + state = 0 + for step in range(step_count - 1, -1, -1): + decoded[step] = state >> (conv.MEMORY - 1) + state = int(conv._PREDECESSORS[state, choices[step, state]]) + assert state == 0 + return decoded[:information_bit_count] + + +class BlockFrontEnd: + """Один ограниченный общий участок; кандидаты читают его представления. + + Конечные края и локальное вычитание среднего восстановлены отдельно: + нельзя без этого подменять фильтрацию изолированного окна непрерывной. + """ + + def __init__(self, samples: np.ndarray, owned_end: int, statistics: Counter, + *, decimator: DecimationCache | None = None, base: int = 0): + self.samples = samples + self.statistics = statistics + self.decimator, self.base = decimator, base + self.reference = lab045.lab044._preamble_reference_samples() + self.reference_length = (16 + lab043.PILOT_SYMBOL_COUNT + 10) * lab045.SAMPLES_PER_SYMBOL + self.probe_symbols = lab045.PREAMBLE_BIT_COUNT + lab045.PHY_HEADER_BIT_COUNT + self.probe_waveform = (self.probe_symbols + 42) * lab045.SAMPLES_PER_SYMBOL + self.front_length = min(samples.size, owned_end + self.probe_waveform + offline.REFINEMENT_MARGIN_SAMPLES) + self.owned_end = owned_end + self.prefix_correlation = None + self.changes = None + self.matched = None + self.baseband = None + self.soft_cache = {} + + def coarse_scores(self, samples: np.ndarray, reference: np.ndarray) -> np.ndarray: + """Сохранить DC всего старого окна, считать корреляцию только owned+1.""" + decimation = lab043.DETECTION_DECIMATION + needed = math.ceil(self.owned_end / decimation) + reference.size + 1 + raw = (resample_poly(samples, 1, decimation, window=decimation_taps(decimation)) if self.decimator is None + else self.decimator.get(samples, self.base)) + mean = np.mean(raw, dtype=np.complex128).astype(np.complex64) + values = raw[:needed].copy() + values -= mean + values *= detection_rotation(values.size, decimation) + if values.size < reference.size: + return np.empty(0, np.float32) + scores = lab043._normalized_sliding_correlation(values, reference).astype(np.float32) + scores[~np.isfinite(scores)] = 0 + np.clip(scores, 0, 1, out=scores) + return scores + + def local_start(self, array: np.ndarray) -> int: + return (array.ctypes.data - self.samples.ctypes.data) // self.samples.itemsize + + def refine(self, samples: np.ndarray, reference: np.ndarray, coarse_start: int) -> int: + start = self.local_start(samples) + low = max(0, coarse_start - 2000) + high = min(samples.size, coarse_start + self.reference_length + 2000) + if high - low < self.reference_length or start < 0: + return ORIGINAL_REFINE(samples, reference, coarse_start) + if self.changes is None: + self.changes = np.empty(self.front_length, np.int64) + self.changes[0] = 0 + np.cumsum(self.samples[1:self.front_length] != self.samples[:self.front_length-1], + dtype=np.int64, out=self.changes[1:]) + if self.changes[start + samples.size - 1] == self.changes[start]: + # После вычитания локального среднего точно нулевой сигнал. + # Общая FFT может оставить шум округления вместо нулевого tie. + return low + if self.prefix_correlation is None: + centered = self.reference[:self.reference_length] - np.mean(self.reference[:self.reference_length]) + self.centered_reference_sum = np.sum(np.conj(centered), dtype=np.complex128) + self.prefix_correlation = fftconvolve( + self.samples[:self.front_length], np.conj(centered[::-1]), mode="valid") + self.statistics["shared_refinement_correlations"] += 1 + first = start + low + last = start + high - self.reference_length + 1 + correlation = self.prefix_correlation[first:last] + if not correlation.size: + return ORIGINAL_REFINE(samples, reference, coarse_start) + # Та же DC-поправка, что у корреляции (samples - mean(probe)). + correlation = correlation - np.mean(samples) * self.centered_reference_sum + magnitudes = np.abs(correlation) + if magnitudes.size > 1: + largest = np.partition(magnitudes, -2)[-2:] + if largest[-1] - largest[-2] <= 32*np.finfo(np.float32).eps*largest[-1]: + self.statistics["refinement_tie_fallbacks"] += 1 + return ORIGINAL_REFINE(samples, reference, coarse_start) + return low + int(np.argmax(magnitudes)) + + def matched_window(self, samples: np.ndarray, start: int, length: int): + absolute = self.local_start(samples) + start + taps = lab043._matched_filter_taps() + edge = taps.size - 1 + if absolute < 0 or absolute + length + edge > self.front_length: + self.statistics["local_body_matched_calls"] += 1 + segment = samples[start:start + length] - np.mean(samples) + baseband = segment * carrier_rotation(length) + return oaconvolve(baseband, taps, mode="full"), 16 * lab045.SAMPLES_PER_SYMBOL + edge + if self.matched is None: + self.baseband = self.samples[:self.front_length] * carrier_rotation(self.front_length) + self.matched = oaconvolve(self.baseband, taps, mode="full") + self.statistics["shared_matched_calls"] += 1 + matched = self.matched[absolute:absolute + length + edge].copy() + # Восстановить нулевые края исходного локального окна, без соседнего IQ. + matched[:edge] = convolve(self.baseband[absolute:absolute + edge], taps, method="direct")[:edge] + matched[-edge:] = convolve(self.baseband[absolute + length - edge:absolute + length], taps, + method="direct")[edge:] + phase = np.complex64(np.exp(2j * np.pi * lab043.CARRIER_OFFSET_HZ * absolute / lab045.SAMPLE_RATE_HZ)) + matched *= phase + mean = np.mean(samples) + matched -= mean * dc_response(length, lab045.SAMPLES_PER_SYMBOL) + nominal = 16 * lab045.SAMPLES_PER_SYMBOL + edge + return matched, nominal + + def timing(self, matched, nominal, expected): + """Локальный FFT оказался дешевле дополнительных общих timing-массивов.""" + return fast_preamble_timing(matched, nominal, expected) + + def extract(self, samples: np.ndarray, frame_start: int, symbol_count: int) -> iq.SoftWindow: + key = (self.local_start(samples) + frame_start, symbol_count) + # Усечение зависит и от доступности текущего probe, а не только от start. + length = (symbol_count + 42) * lab045.SAMPLES_PER_SYMBOL + if frame_start < 0 or frame_start + length > samples.size: + return iq.SoftWindow(False, np.empty(0), 0, 0, 0, {}, "TRUNCATED_IQ_WINDOW") + if key in self.soft_cache: + self.statistics["soft_window_cache_hits"] += 1 + return self.soft_cache[key] + segment = samples[frame_start:frame_start + length] + matched, nominal = lab043._matched_waveform(segment, 0, length) + bits = lab045.lab044.preamble_bits() + expected = iq.radio.bpsk_modulate(bits) + timing = lab043._preamble_timing_offset(matched, nominal, expected) + carrier = lab043._evaluate_symbols(matched, nominal, timing, bits, lab045.PREAMBLE_BIT_COUNT) + if carrier["abs_h"] == 0: + result = iq.SoftWindow(False, np.empty(0), timing, 0, nominal, carrier, "ZERO_GAIN") + else: + symbols = matched[nominal + timing:nominal + timing + symbol_count * lab045.SAMPLES_PER_SYMBOL: + lab045.SAMPLES_PER_SYMBOL].astype(np.complex128) + if symbols.size != symbol_count: + result = iq.SoftWindow(False, np.empty(0), timing, 0, nominal, carrier, "TRUNCATED_SYMBOLS") + else: + symbol_time = (np.arange(symbol_count, dtype=np.float64) + 0.5) / lab045.SYMBOL_RATE + normalized = symbols * np.exp(-2j * math.pi * carrier["cfo_hz"] * symbol_time) + normalized /= carrier["abs_h"] * np.exp(1j * carrier["phase_rad"]) + result = iq.SoftWindow(True, normalized.real, int(timing), + int((frame_start + nominal + timing) % lab045.SAMPLES_PER_SYMBOL), + nominal, carrier, None) + self.soft_cache[key] = result + self.statistics["unique_soft_windows"] += 1 + return result + + +@contextmanager +def optimized_context(front: BlockFrontEnd): + targets = ((lab043, "_refine_frame_start", front.refine), + (lab043, "_matched_waveform", front.matched_window), + (lab043, "_preamble_timing_offset", front.timing), + (iq, "_extract_soft_window", front.extract), + (lab045.conv, "viterbi_decode_soft", fast_viterbi), + (offline, "_correlation_scores", front.coarse_scores)) + originals = [(owner, name, getattr(owner, name)) for owner, name, unused in targets] + try: + for owner, name, function in targets: + setattr(owner, name, function) + yield + finally: + for owner, name, function in reversed(originals): + setattr(owner, name, function) + + +class StreamingReceiver(previous.StreamingReceiver): + """Совместимый API Lab050, ускорение только для рабочей точки 500 ксимв/с.""" + + def __init__(self, symbol_rate: int = 500_000, *, block_samples: int = 65_536): + if symbol_rate != 500_000: + raise ValueError("Lab051 исследует только 500 ксимв/с") + super().__init__(symbol_rate, block_samples=block_samples) + self.front_statistics = Counter() + self.decimator = DecimationCache(self.decimation) + + def _scan(self, owned_end: int) -> list[previous.ReceivedPacket]: + front = BlockFrontEnd(self.buffer, owned_end - self.base_sample, self.front_statistics, + decimator=self.decimator, base=self.base_sample) + with optimized_context(front): + return super()._scan(owned_end) + + def finish(self): + result = super().finish() + self.decimator.values = np.empty(0, np.complex64) + return result + + +def run_functional_tests() -> None: + receiver = StreamingReceiver() + assert receiver.mode.samples_per_symbol == 16 + assert receiver.finish() == [] diff --git a/tests/test_lab051_streaming_receiver.py b/tests/test_lab051_streaming_receiver.py new file mode 100644 index 0000000..cd581a8 --- /dev/null +++ b/tests/test_lab051_streaming_receiver.py @@ -0,0 +1,160 @@ +"""Регрессии вычислительной архитектуры Lab051, без файлов/оборудования.""" + +from __future__ import annotations + +from collections import Counter +from dataclasses import replace + +import numpy as np +import pytest +from scipy.signal import resample_poly + +from experiments import lab051_streaming_receiver as lab +from experiments.lab050_streaming_receiver import StreamingReceiver as PreviousReceiver +from experiments.lab050_streaming_receiver import streaming_mode + + +@pytest.mark.parametrize("seed", range(8)) +def test_all_timing_offsets_preserved_including_negative_start(seed): + random_generator = np.random.default_rng(seed) + samples = (random_generator.normal(size=23616) + 1j * random_generator.normal(size=23616)).astype(np.complex64) + with streaming_mode(lab.phy.PhyMode(500000)): + expected = lab.iq.radio.bpsk_modulate(lab.lab045.lab044.preamble_bits()) + if seed % 2: + samples[416 + 47:416 + 47 + len(expected)*16:16] += expected * 3 + old = lab.ORIGINAL_TIMING(samples, 416, expected) + assert lab.fast_preamble_timing(samples, 416, expected) == old + + +def test_zero_timing_tie_is_same_first_offset(): + with streaming_mode(lab.phy.PhyMode(500000)): + expected = lab.iq.radio.bpsk_modulate(lab.lab045.lab044.preamble_bits()) + assert lab.fast_preamble_timing(np.zeros(23616, np.complex64), 416, expected) == -800 + + +@pytest.mark.parametrize("value", [1, 1j, 1+1j, 44]) +def test_equal_nonzero_timing_scores_preserve_original_tie(value): + with streaming_mode(lab.phy.PhyMode(500000)): + expected = lab.iq.radio.bpsk_modulate(lab.lab045.lab044.preamble_bits()) + samples = np.full(23616, value, np.complex64) + assert lab.fast_preamble_timing(samples, 416, expected) == lab.ORIGINAL_TIMING(samples,416,expected) + + +@pytest.mark.parametrize("value", [1, 1j, 44]) +def test_refinement_constant_iq_preserves_zero_after_local_dc(value): + with streaming_mode(lab.phy.PhyMode(500000)): + samples=np.full(100000,value,np.complex64) + front=lab.BlockFrontEnd(samples,65536,Counter()) + window=samples[1000:28456] + assert front.refine(window,front.reference,2000)==lab.ORIGINAL_REFINE(window,front.reference,2000)==0 + + +def test_refinement_equal_nonzero_peaks_preserve_first_maximum(): + with streaming_mode(lab.phy.PhyMode(500000)): + samples=np.zeros(100000,np.complex64) + samples[1200]=samples[2200]=1 + front=lab.BlockFrontEnd(samples,65536,Counter()) + reference=np.zeros(front.reference_length,np.complex64) + reference[0],reference[1]=1,-1 + front.reference=reference + window=samples[1000:28456] + assert front.refine(window,reference,2000)==lab.ORIGINAL_REFINE(window,reference,2000)==199 + + +@pytest.mark.parametrize("seed", range(5)) +def test_shared_matched_preserves_local_dc_and_both_zero_padded_edges(seed): + random_generator = np.random.default_rng(seed) + values = (random_generator.normal(size=110000) + 1j * random_generator.normal(size=110000) + 4 + 3j).astype(np.complex64) + with streaming_mode(lab.phy.PhyMode(500000)): + front = lab.BlockFrontEnd(values, 70000, Counter()) + segment = values[5000 + seed:5000 + seed + 23456] + expected, nominal = lab.ORIGINAL_MATCHED(segment, 0, len(segment)) + actual, actual_nominal = front.matched_window(segment, 0, len(segment)) + assert actual_nominal == nominal + np.testing.assert_allclose(actual, expected, atol=2e-5, rtol=2e-5) + + +def test_reused_decimation_is_bit_exact_for_moving_and_truncated_windows(): + random_generator = np.random.default_rng(51001) + values = (random_generator.normal(size=1800000) + 1j * random_generator.normal(size=1800000)).astype(np.complex64) + cache = lab.DecimationCache(8) + for base in range(0, len(values) - 10000, 65536): + window = values[base:base + 400123] + expected = resample_poly(window, 1, 8, window=("kaiser", 8)) + np.testing.assert_array_equal(cache.get(window, base), expected) + assert cache.values.size <= 50016 + assert cache.reused_samples > 1000000 + + +@pytest.mark.parametrize("seed,count", [(0, 1), (1, 32), (2, 244*8), (3, 268*8), (4, 1024*8)]) +def test_viterbi_exact_bits_for_noisy_metrics_and_ties(seed, count): + random_generator = np.random.default_rng(seed) + for values in (np.zeros(lab.lab045.conv.encoded_bit_count(count)), + random_generator.normal(size=lab.lab045.conv.encoded_bit_count(count)), + random_generator.choice([-1., 1.], size=lab.lab045.conv.encoded_bit_count(count))): + np.testing.assert_array_equal(lab.fast_viterbi(values, count), lab.ORIGINAL_VITERBI(values, count)) + + +@pytest.mark.parametrize("values,count", [(np.array([np.nan, 0.]), 1), (np.zeros((2,2)), 1), + (np.zeros(12), 1), (np.zeros(12), 0), (np.zeros(12), 1.5)]) +def test_viterbi_rejects_same_invalid_input(values, count): + with pytest.raises((ValueError, TypeError)): + lab.fast_viterbi(values, count) + + +def signal_with_unknown_offsets(seed=51): + random_generator = np.random.default_rng(seed) + plan = lab.lab045.build_transmission_plan(bytes(range(256))) + values = lab.phy.build_parameterized_tx_complex(plan, lab.phy.PhyMode(500000)).astype(np.complex64) + values *= np.exp(1j * (0.73 + 2*np.pi*10*np.arange(len(values))/8000000)).astype(np.complex64) + values += (random_generator.normal(size=len(values)) + 1j*random_generator.normal(size=len(values))).astype(np.complex64) + return np.concatenate((np.zeros(63217,np.complex64), values, np.zeros(450000,np.complex64))) + + +@pytest.mark.parametrize("block", [32749, 65536]) +def test_independent_stream_packets_equal_old_decoder_across_block_boundaries(block): + samples = signal_with_unknown_offsets() + results = [] + for receiver in (PreviousReceiver(500000), lab.StreamingReceiver()): + output = [] + for start in range(0,len(samples),block): + output.extend(receiver.push_iq_block(samples[start:start + block])) + assert [item.payload for item in output] == [bytes(range(256))] + output.extend(receiver.finish()) + results.append([(item.start_sample,item.end_sample,item.payload) for item in output]) + assert results[0] == results[1] + + +def test_invalid_push_and_finish_preserve_bounded_state(): + receiver = lab.StreamingReceiver() + for invalid in (np.array([complex(float("nan"),0)]), np.zeros((1,2)), np.zeros(65537)): + with pytest.raises(ValueError): receiver.push_iq_block(invalid) + assert receiver.total_samples == 0 + for unused in range(100): + assert receiver.push_iq_block(np.zeros(65536, np.complex64)) == [] + assert receiver.buffer.size <= receiver.buffer_limit_samples + assert receiver.decimator.values.size <= (receiver.buffer_limit_samples + 7)//8 + assert receiver.finish() == [] + assert receiver.buffer.size == receiver.decimator.values.size == 0 + with pytest.raises(RuntimeError): receiver.finish() + with pytest.raises(RuntimeError): receiver.push_iq_block(np.zeros(1,np.complex64)) + + +def test_truncated_frame_cannot_reach_crc_pass(): + samples = signal_with_unknown_offsets()[:100000] + receiver = lab.StreamingReceiver() + output = [] + for start in range(0,len(samples),65536): + output.extend(receiver.push_iq_block(samples[start:start+65536])) + assert output + receiver.finish() == [] + + +def test_context_restores_functions_even_on_exception(): + originals = (lab.lab043._matched_waveform, lab.iq._extract_soft_window, + lab.lab045.conv.viterbi_decode_soft, lab.offline._correlation_scores) + with streaming_mode(lab.phy.PhyMode(500000)): + front = lab.BlockFrontEnd(np.zeros(100000,np.complex64),65536,Counter()) + with pytest.raises(RuntimeError): + with lab.optimized_context(front): raise RuntimeError("test") + assert originals == (lab.lab043._matched_waveform, lab.iq._extract_soft_window, + lab.lab045.conv.viterbi_decode_soft, lab.offline._correlation_scores)