2013-03-20 31 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