Сеть гостей: с 5,7 секунды до 2,8 — и две идеи, которые не выдержали замеров
Posted interrupts, one-shot-таймер, модерация прерываний приёма, offload, отображённые кольца — с замерами на железе; halt polling и задача для NIC не помогли.
Истории о разработке nos: настоящие баги на настоящем железе, гипервизор, Rust в ядре и гейты, которые не дают выдать желаемое за действительное.
RSS-лентаPosted interrupts, one-shot-таймер, модерация прерываний приёма, offload, отображённые кольца — с замерами на железе; halt polling и задача для NIC не помогли.
Очистка регистров, заполнение RSB, IBPB, IBRS, BHI_DIS_S, VERW: что гипервизор nos делает вокруг каждого VM exit, сколько это стоит и что ещё открыто.
Третий этап по git log: за месяц hv.ko прошёл путь от включения AMD-V до Alpine, Debian и многопроцессорных Linux-гостей на железе AMD и Intel.
В TCG из QEMU 10.2 чтение CR4 гостем не вызывает vmexit, а точка останова по данным во вложенном госте вешает CPU насовсем. Как мы это нашли и обошли.
Четыре фаззера, которые собирают исходники самого ядра в программы для хоста, — гипервизор, сеть, хранилище и C++ — и ошибки, которые они нашли.
За два дня блочный слой, сеть, файловые системы и virtio в nos переехали на Rust, C++ удалили, а unsafe в слоях сократился с 924 мест до 113.
nos не исполняет .init_array, и глобальный объект с настоящим конструктором остаётся нулями. Так два лока выпали из watchdog — теперь такое не слинкуется.
В nos нет страниц, доступных одновременно на запись и на исполнение. Как разделили образ, какая дыра была под каждым отображением и какой тест её стережёт.
Ядро умерло раньше, чем появилась хоть какая-то консоль, на сервере, где консоль — только сеть. Два счётчика на дисках и копия в QEMU нашли причину.
I210 на AX41 показывал линк, включённый приёмник и 255 дескрипторов — и не принимал ничего: MAC защёлкнул 10 Мбит/с, а PHY работал на 1000.
Под UDP-нагрузкой EX44 глох насовсем. Семь теорий, выведенных из кода драйвера, оказались ложными, а одно чтение регистров чипа нашло потерянный фронт MSI-X.
TLB shootdown ждал CPU, который крутился на спинлоке отправителя. Как одно тихое зависание стало правилом, пулом кадров, гейтом и паникой через 10 секунд.