Смятение о внутреннем асинхронном механизме ввода-вывода 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.