03:00. Дашборд кричит «диск здоров»: util 40%, iostat зелёный. При этом p99 случайного чтения 4K на NVMe подскочил с 90 до 310 микросекунд, и бэкенд начал отваливаться по таймауту. Классика: мониторинг смотрит на процент занятости, ядро — на цену каждого входа в него. Первым делом снимаем профиль, а не мнение: iostat -x 1, cat /proc/interrupts | grep nvme, cat /proc/sys/kernel/schedmingranularityns, затем perf stat -e syscalls:sysenteriouringenter,syscalls:sysenteriosubmit fio --name=t --ioengine=iouring --direct=1 --iodepth=1 --rw=randread --bs=4k --size=1G. Потом то же самое с --ioengine=libaio и --iodepth=64. Ответ в цифрах: syscall rate и context switches на операцию. Вердикт вскрылся в io-wq: воркеры ядра дрались за CPU на каждой короткой 4K-чтении, потому что SQPOLL и registered buffers были выключены, а глубина очереди стояла в единице. libaio при ODIRECT и iodepth 64 пайплайнил те же NVMe-команды и отдавал стабильный p99. Убираем шум: ionice -c2 -n0 на кон...