Автор статьи - инженер из VictoriaMetrics. На примере реального движка хранения VictoriaLogs разбирает выбор между системным вызовом pread и отображением файла в память mmap при чтении байтов из файлов.
Автор объясняет, что pread имеет заметную цену: каждый вызов - это дорогой переход из пользовательского пространства в ядро с копированием данных, и при миллионе мелких случайных чтений на один запрос теряется целая секунда процессорного времени только на пересечение границы ядра.
Mmap превращает эти чтения в дешевый доступ к памяти, но у него есть коварная проблема именно для Go: обращение к "холодной" странице вызывает major page fault, который блокирует поток ОС незаметно для планировщика Go. При достаточном числе таких блокировок программа может застопориться.
В итоге, оптимальное решение - это абстракция ReaderAt, которая через системный вызов mincore проверяет, находится ли нужная страница уже в оперативной памяти. Если да, то используется быстрый mmap-путь, а если нет - то безопасный pread. При этом результаты mincore кэшируются в битовой карте на срок до минуты.
В статье еще разбирается целая куча самых разных тонкостей
16.07.2026
Похожее
14.08.2026
Soppo
Пятничный язык программирования! Я про него уже писал, но он продолжает развиват...
12.08.2026
Typescript Defer
Автор экспериментировал с добавлением оператора defer из Go в компилятор TypeScr...
11.08.2026
Raft сломан
Ребята из Antithesis(я хз кто это) протестировали несколько популярных реализаци...
11.08.2026
Движение назад
Прикольная статья если вы хотите поковыряться в итераторах, джинериках и вот в э...