TGViewer
YeaHub Tech YeaHub Tech @yeahub_tech · 412 subscribers
Post #203 89
#Performance

📎 Скрытая ловушка mmap: почему async/await не работает как ожидается

Memory-mapped файлы выглядят как идеальное решение: доступ к файлу как к обычному массиву без лишних копирований. Но есть подвох — они могут убить всю конкурентность в async-коде.


Проблема в цифрах

Эксперимент показал шокирующие результаты при чтении 8 файлов по 256 МБ каждый:

- async/await + mmap: 2.5-3 секунды
- 8 потоков + mmap: 0.75-0.8 секунды
- async/await + обычный I/O: 0.62-0.65 секунды

Асинхронная версия с mmap работает как однопоточная — конкурентность полностью исчезает!


Что происходит под капотом?

Memory mapping создает иллюзию, что файл находится в памяти:

let mmapped = unsafe { memmap2::Mmap::map(file)? };
let byte = mmapped[0]; // Выглядит как обычная индексация



Но на самом деле:
1. При первом обращении к странице происходит page fault
2. ОС блокирует поток и загружает данные с диска
3. В это время НЕТ await — исполнитель не может переключиться на другую задачу
4. Весь async runtime замораживается


Коварство скрытой блокировки

Самое опасное — Mmap разыменовывается в &[u8]. Функция получает обычный срез:

fn process_data(data: &[u8]) {
let value = data[1000]; // Может заблокировать весь runtime!
}


Код не подозревает, что индексация может вызвать I/O блокировку.


Когда mmap действительно быстр

С прогретым кэшем результаты кардинально меняются:
- Холодный кэш: 2.5 секунды
- Прогретый кэш: 0.12 секунды (в 21 раз быстрее!)

Memory mapping отлично работает, когда данные уже в памяти — меньше накладных расходов, чем у обычного I/O.


Практические выводы

✅ Используйте mmap когда:
- Данные помещаются в память
- Работаете с синхронным кодом
- Нужен произвольный доступ к файлу

❌ Избегайте mmap в async/await когда:
- Файлы больше доступной памяти
- Критична отзывчивость системы
- Используете кооперативную многозадачность


Альтернативы для async

Для асинхронного кода лучше использовать:
- tokio::fs::File с явными read().await
- Разбиение больших файлов на чанки
- Предварительная загрузка критичных данных

Memory mapping — мощный инструмент, но в async-мире он может превратить конкурентный код в последовательный. Знание этой особенности поможет избежать неожиданных проблем с производительностью.


📎 Ссылка

🎙 Новости

📝 База вопросов
More from @yeahub_tech
  1. Oct 9, 2026#Собес #pipeline #ci #stage 🤔 Что происходит при автоматической сборке feature-ветки на s…
  2. Oct 8, 2026#course #задачи #тесты 📚 JavaScript. A3 Задачи Задачи на программирования на языке JavaSc…
  3. Oct 7, 2026#course #начинающие 📚 Твой Golang Твой Golang — это идеальный старт для освоения языка. П…
  4. Oct 5, 2026🧑‍💻 Вопросы с собесов для Node.js Разработчика 1. Как использовать Service Workers для р…
  5. Oct 2, 2026#Собес #transaction #propagation #required 🤔 Что такое propagation у транзакций и какие т…
  6. Oct 1, 2026#book #book 📚 Библия C#. 6-е изд. Автор: Михаил Фленов Это настольная книга программиста,…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →