Как методы асинхронного файлового ввода-вывода работают для локальных файлов в Node.js?

У Node есть асинхронные/синхронные версии всех операций ввода-вывода в файловой системе, но мне было интересно: как реализован асинхронный файловый ввод-вывод в Node.js для операций с локальными файлами? Я сам возился с libevent, который использует шаблон реактора, как Node, но я прочитал, что использование событийного ввода-вывода в локальных файлах бессмысленно, потому что они всегда доступны для чтения и записи, поэтому с ними можно будет работать мгновенно.

Если это так, то в чем разница между этими методами, по крайней мере, для локальных файлов?


person Alexis King    schedule 12.06.2013    source источник


Ответы (1)


Посмотрите таблицу «Стоимость операций ввода-вывода» в «понимание цикла ввода-вывода node.js". Локальный файловый ввод-вывод не выполняется мгновенно. Внутренне это реализовано с использованием блокирующих файловых операций и пула потоков libuv в системах, где API асинхронного файла недоступен (Linux), и с использованием асинхронных вызовов на уровне ядра, где это возможно (например, IOCP в Windows).

Я не видел тестов синхронизации и асинхронного файлового ввода-вывода в разных системах, но стоит знать, что диспетчеризация пула потоков добавляет некоторые штрафы, и обычно размер пула соответствует количеству процессоров, что хорошо для асинхронных задач с привязкой к процессору, но может быть неоптимальным для эмуляции асинхронного файлового ввода-вывода.

Я предполагаю, что в среднем даже асинхронная FS на основе пула потоков приведет к лучшей задержке/отклику сервера по сравнению с версиями синхронизации, особенно для больших файлов.

person Andrey Sidorov    schedule 12.06.2013
comment
Кажется, я понимаю... значит, Node.js фактически выполняет ввод-вывод в отдельном потоке? Однако libevent этого не делает, он просто ждет, пока дескриптор файла станет доступным. - person Alexis King; 13.06.2013
comment
только файловый ввод-вывод и только на linux. Node.js использует библиотеку libuv, похожую на libevent. Вот хорошая книга о libuv: nikhilm.github.io/uvbook/index.html - person Andrey Sidorov; 13.06.2013