Смятение о внутреннем асинхронном механизме ввода-вывода node.js
- Я узнал, что node.js использует libeio внутренне для выполнения async файла ввода/вывода, с пулом потоков, на платформе * nix, правильно?
- Как насчет async сети ввода/вывода? Это сделано libev? Есть ли пул потоков?
- Если внутри есть пул потоков, как он может быть более эффективным, чем традиционная модель с одним потоком за запрос? И это один поток на запрос ввода-вывода?
- А какой механизм на окнах? Я знаю, что это сделано IOCP, и есть пул потоков уровня ядра, правильно?
- Почему у linux нет собственного полностью механизма AIO, такого как Windows IOCP? Будет ли это в будущем?
Обновление в соответствии с ответом changchang:
- Я быстро просмотрел исходный код @changchang, установил, что размер пула потоков по умолчанию может быть reset на UV_THREADPOOL_SIZE, мне интересно, в каком случае это будет использоваться?
- Я также нашел getaddrinfo использовать этот пул потоков, есть ли больше, кроме fs? И если все задания синхронизации будут выполняться в этом пуле потоков, достаточно ли размер по умолчанию "4"?
- Как я понимаю, в процессе node.js будет 6 основных потоков: 1 поток V8 (цикл событий, где выполняются javascript-коды пользователей), 1 цикл событий libuv и 4 в пуле потоков, я прав?
-
И как я могу увидеть эти потоки в своей оболочке (Ubuntu)? Я использую ps -eLf | grep node | grep -v grep видел только два:
root 16148 7492 16148 0 2 20:43 pts/26 00:00:00./bin/node/home/aaron/workspace/test.js
root 16148 7492 16149 0 2 20:43 pts/26 00:00:00./bin/ node/home/aaron/workspace/test.js
Ответы
Ответ 1
-
Прежде всего, libuv
удалил из него libeio
. Но он выполняет операции ввода-вывода с использованием aync файлов с пулом потоков, например libeio
, как вы уже упоминали.
-
libuv
также удаляет libev
. Он выполняет операции ввода-вывода асинхронной сети на основе асинхронных интерфейсов ввода-вывода на разных платформах, таких как epoll
, kqueue
и IOCP
, без пула потоков. Существует цикл событий, который запускается в основном потоке uv
, который проверяет события ввода-вывода и обрабатывает их.
-
Пул потоков внутри libuv
представляет собой пул потоков фиксированного размера (4 в uinx like system). Он выполняет роль очереди задач и избегает исчерпания системных ресурсов путем генерации потоков неограниченно, когда запросы увеличиваются.
Ответ 2
Uptil версии 0.6 node используется libev
для запуска цикла событий и libeio
для асинхронного ввода-вывода (бэкенд Unix сильно зависит от этих двух библиотек). Но libuv
начал заменять libev
и libeio
на версия 0.8. Он выполняет, поддерживает и управляет всеми io и событиями в пуле событий. libuv
- это выбор в кросс-платформенных асинхронных библиотеках ввода-вывода.
- Да, upto node 0,6, устарел в 0,8 и использует пул потоков
-
Да, но libev
не использует пул потоков. См. здесь
Уточнение: в соответствии с ссылка в question я опубликовал, libeio
поддерживает все функции POSIX, связанные с I/O (включая сокет). Но автор node решил использовать его только для ввода/вывода асинхронного файла и использует libev
для сетевых операций ввода-вывода. Я не знаю, откуда вы это слышали, но вы можете использовать epoll для обычных файлов.
-
libev
использует цикл событий, поэтому здесь нет проблем.
- Да IOCP обрабатывает асинхронный ввод-вывод в Windows, ядро использует пулы потоков.
- Новое ядро linux имеет epoll, kqueue в новом ядре BSD.
libev
и libeio
были для среды linux и обеспечивают цикл событий/асинхронного ввода-вывода для всех ядер (поддержка select, poll, epoll, kqueue).
Обновить вопросы:
- Не знаю много о
libuv
- может быть достаточно (не знаю)
-
Вот мои выводы в Windows 8, проверили его через Process Explorer. Отображено 4 потока, 1 DLL, 1 файл и 1 раздел (всего 7 записей) для процесса приложения node.
-
ps -eLf
показывает все потоки и процессы, возможно, вы перефильтровываете его, просто посмотрите на процесс node pid как ps -eLf | grep x
, где x является pid для процесса node.