Урок 19: I/O с отображением в память против буферизованного I/O
При загрузке гигабайтов датасетов для обучения на GPU важна каждая миллисекунда I/O. Есть три основных подхода: буферизованный I/O (stdio), mmap, который отображает файл напрямую в виртуальную память, и sendfile для сетевого обмена без копирования (zero-copy). В NVIDIA, при загрузке весов моделей и
Буферизованное чтение — это как взять книги в библиотеке и сделать с них фотокопии перед использованием. mmap — это как сидеть прямо в библиотеке: никакого копирования, вы читаете оригинал. sendfile — это как отправить библиотечную книгу другу по почте напрямую, ни разу к ней не прикоснувшись.
- Буферизованный I/O
- I/O через stdio (fread, fwrite), который накапливает данные в буфере пространства пользователя (user space) перед передачей ядру. Сокращает количество системных вызовов, но добавляет лишнее копирование данных.
- Прямой I/O
- I/O, который обходит страничный кэш ядра (page cache). Включается флагом O_DIRECT. Требует выравнивания буфера по 512 байт. Полезен, когда приложение управляет собственным кэшем.
- zero-copy
- Техника I/O, которая передаёт данные напрямую между буферами ядра без копирования в пространство пользователя. sendfile() и mmap — две распространённые реализации.
- sendfile
- Системный вызов, который передаёт данные из файлового FD в сокетный FD напрямую внутри ядра — без копирования в пространство пользователя. Используется в Nginx и веб-серверах для отдачи статических файлов.
- page cache
- Буфер в оперативной памяти (RAM) ядра, который хранит недавно использованное содержимое файлов. Повторные чтения одного и того же файла обслуживаются из RAM, а не с диска.