Faster Index I/O with NVMe SSDs
Поисковый индекс Marginalia переписан, чтобы лучше использовать NVMe-накопители.
Основные изменения:
- Объём: после ослабления фильтров и добавления рекламного детектора база выросла с 350 до 800 млн документов; ожидается дальнейший рост при добавлении новых языков.
- Структура: обратный индекс остался «картой терм → список (документ, позиции)», но B-дерево теперь читается в режиме
O_DIRECT
, минуя кэш страниц. - Чтение:
- Буферизованные чтения неэффективны при случайном доступе к файлам, превышающим RAM.
- Прямые чтения требуют выравнивания по 512/4096 Б, но дают стабильную задержку и не копируют данные лишний раз.
- В Linux появляется
RWF_DONTCACHE
, но поддержка пока неполная.
Первая оптимизация — переписать B-дерево под O_DIRECT
; дальнейшие шаги ещё описываются.
Комментарии (24)
- 128–256 КБ считаются «классическим» оптимальным размером блока, но в 2024 г. всё чаще замеряют индивидуально: всё зависит от архитектуры I/O.
- Для NVMe при высокой параллельности 4 КБ работает не хуже, если использовать AsyncIO/IO_uring или SPDK и выдавать много одновременных запросов.
- Меньшие блоки экономят чтение, но не избавляют от внутреннего read-amplification SSD; нужно знать минимальный физический размер чтения контроллера.
- Формат LBA (512 B vs 4 КБ+) и опции sysfs (optimal_io_size) влияют на производительность и стоит их проверять.
- В задачах индексного поиска параллельность ограничена, поэтому крупные блоки остаются практичным выбором при отсутствии точных данных о «железе».