2013-03-20 54 views
19
  1. 我已经了解到,Node.js的使用libeio内部执行异步文件 I/O,以线程池,在* nix平台,是吗?
  2. 异步网络 I/O?它是由libev完成的吗?是否还有线程池?
  3. 如果里面有线程池,它怎么比传统的单线程每请求模型更有效率?并且它是每个I/O请求的一个线程?
  4. 什么是Windows的机制?我知道它是由IOCP完成的,并且有一个内核级线程池,对吧?
  5. 为什么linux没有像Windows IOCP那样的本地完全AIO机制呢?将来会有吗?

根据长常的回答更新:关于Node.js的困惑内部异步I/O机制

  1. 我参加了一个快速查看在给@changchang的source code,发现默认的线程池的大小可以通过UV_THREADPOOL_SIZE被重置,我想知道在这种情况下这将被使用?
  2. 我还发现getaddrinfo使用这个线程池,除了fs之外还有更多吗?如果所有同步作业都将在此线程池中完成,那么缺省大小'4'是否足够?
  3. 按照我现在的理解,node.js过程中将会有6个基本线程:1个V8线程(事件循环,其中用户JavaScript代码运行),1个libuv事件循环,以及线程池中的4个,对吗?
  4. 我如何在我的shell(Ubuntu)中看到这些线程?我使用ps -eLf | grep节点|的grep -v grep的只看到有两个:

    根16148 7492 16148 0 2 20点43分/ 26 00:00:00 ./bin/node /home/aaron/workspace/test.js
    根16148 7492 16149 0 2 20点43分/ 26 00:00:00 ./bin/node /home/aaron/workspace/test.js

+0

看到这里http://stackoverflow.com/questions/10680601/nodejs-event-loop – user568109 2013-03-20 15:20:29

+1

node.js的实际使用[libuv(https://github.com/joyent/libuv/)抽象所有支持平台的异步IO – Milan 2013-03-20 15:23:12

+0

@ user568109我已经阅读过,但不能直接从中得到答案,实际上,不清楚的表达会让我更加困惑。它提到libeio'异步执行输入输出'(包括套接字),我对此表示怀疑。我从某个地方了解到这一点:因为不能在普通文件上使用epoll,所以这里来解放执行线程的aio。 – 2013-03-21 00:58:37

回答

24
  1. 首先,libuv已经移除了libeio从它。但它确实像您提到的那样使用线程池(如libeio)执行异步文件I/O。

  2. libuv也删除libev。它根据不同平台中的异步I/O接口(如epollkqueueIOCP)执行异步网络I/O,而不使用线程池。有一个事件循环在主线程uv上运行,它轮询I/O事件并处理它们。

  3. 内部libuv线程池的大小是固定的线程池(4 in uinx like system)。它执行任务队列角色,并通过在请求增加时无限地生成线程来避免耗尽系统资源。用于libev运行为异步I事件循环和libeio

+0

坦克很多,很多资源都过时了,你救了我! – 2013-03-21 12:52:04

+2

@AaronWang你应该接受这个,如果它回答你的问题。 – travis 2013-03-22 16:11:15

+0

AFAIK节点将libuv线程池大小设置为内核数量 – 2013-03-25 23:13:06

2

Uptil版本0.6节点/ O,(Unix的后端位于重上这两个库)。但libuv已开始替换和libeio,version 0.8。它执行,维护和管理事件池中的所有io和事件。 libuv是跨平台异步IO库的选择。

  1. 是,高达0.6点,弃用0.8,并使用线程池
  2. 是的,但libev不使用线程池。见here

    澄清:根据在question我张贴的linklibeio不支持处理我所有的POSIX功能/ O(包括插座)。但节点作者决定仅将它用于异步文件I/O,并将网络I/O使用libev。我不知道你从哪里听到它,但你可以在普通文件上使用epoll。

  3. libev使用事件循环,所以在这里没有问题。

  4. 是的IOCP在Windows中处理异步I/O,内核使用线程池。
  5. 新的Linux内核在新的BSD内核中有epoll,kqueue。 libevlibeio用于Linux环境,并为所有内核提供事件循环/异步IO(支持select,poll,epoll,kqueue)。

更新问题:

  1. 不知道太多关于libuv
  2. 也许就够了(不知道)
  3. 这是我在Windows 8上的研究结果,通过的Process Explorer检查它。针对节点应用程序进程显示4个线程,1个DLL,1个文件和1个部分(总共7个条目)。

  4. ps -eLf会显示所有线程和进程,也许您正在过滤它,只需查找节点进程pid,如ps -eLf | grep x其中x是节点进程的pid。

+0

谢谢。我试过'ps -eLf | grep pid',仍然是相同的输出 – 2013-03-25 00:44:11