代码之家  ›  专栏  ›  技术社区  ›  Aaron Wang

关于node.js内部异步I/O机制的困惑

  •  25
  • Aaron Wang  · 技术社区  · 13 年前
    1. 我已经了解到node.js在内部使用libeio来执行异步 文件 I/O,带线程池,在*nix平台上,对吗?
    2. 异步呢 网络 输入/输出?是libev做的吗?还有线程池吗?
    3. 如果里面有线程池,它怎么会比传统的每个请求一个线程的模型更高效呢?是不是每个I/O请求都有一个线程?
    4. 窗户上的机制是什么?我知道它是由IOCP完成的,并且有一个内核级线程池,对吧?
    5. 为什么linux还没有像windowsIOCP那样的原生完全AIO机制?将来会有吗?

    根据畅畅的回答更新:

    1. 我快速浏览了一下 source code @changchang给出了,发现默认的线程池大小可以通过 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 只看到两个:

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

    2 回复  |  直到 6 年前
        1
  •  30
  •   devops    10 年前
    1. 首先 libuv 已删除 libeio 但它确实使用类似的线程池执行异步文件I/O 利比亚 正如你提到的。

    2. libuv公司 也删除 libev 。它基于不同平台中的异步I/O接口进行异步网络I/O,例如 epoll , kqueue IOCP ,没有线程池。有一个事件循环在的主线程上运行 uv 其轮询I/O事件并对其进行处理。

    3. 内部的线程池 libuv公司 是固定大小的线程池( 4 in uinx like system ). 它执行任务队列角色,并通过在请求增加时无限期地生成线程来避免系统资源的耗尽。

        2
  •  2
  •   Community Mohan Dere    9 年前

    已使用Uptil版本0.6节点 libev 运行事件循环和 libeio 对于异步I/O,(Unix后端主要依赖于这两个库)。但是 libuv 已开始更换 libev公司 利比亚 在里面 version 0.8 。它执行、管理和管理事件池中的所有io和事件。 libuv 是跨平台异步IO库中的选择。

    1. 是,最高节点0.6,在0.8中不推荐使用,并使用线程池
    2. 是的,但是 libev公司 不使用线程池。看见 here

      澄清:根据 link question 我发布了, 利比亚 确实支持所有处理I/O(包括套接字)的POSIX函数。但节点作者决定将其仅用于异步文件I/O,并使用 libev公司 用于网络I/O。我不知道你是从哪里听说的,但你可以在普通文件上使用epoll。

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

    4. IOCP 在windows中处理异步I/O,内核确实使用了线程池。
    5. 新的linux内核在新的BSD内核中有epoll,kqueue。 libev公司 利比亚 适用于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。