24
  1. node.js が内部的に libeio を使用して、*nix プラットフォームでスレッド プールを使用して非同期ファイルI/O を実行することを知りました。
  2. 非同期ネットワークI/O はどうですか? それはlibevによって行われますか?スレッドプールもありますか?
  3. 内部にスレッド プールがある場合、従来のリクエストごとに 1 スレッドのモデルよりも効率的である可能性はありますか? また、I/O 要求ごとに 1 つのスレッドですか?
  4. そして、窓のメカニズムは何ですか?IOCP によって行われ、カーネル レベルのスレッド プールがあることは知っていますよね?
  5. Windows IOCP のようなネイティブの完全な AIO メカニズムがまだ Linux にないのはなぜですか? 将来的にはありますか?

Changchang の回答に従って更新します。

  1. @changchang が提供したソース コードを簡単に確認したところ、デフォルトのスレッド プール サイズはUV_THREADPOOL_SIZEでリセットできることがわかりました。
  2. また、getaddrinfo がこのスレッド プールを使用していることがわかりました。fs 以外に他にあるでしょうか。また、すべての同期ジョブがこのスレッド プールで実行される場合、既定のサイズ '4' で十分ですか?
  3. 私の理解では、node.js プロセスには 6 つの基本的なスレッドがあります: 1 つの V8 スレッド (ユーザー JavaScript コードが実行されるイベント ループ)、1 つの libuv イベント ループ、およびスレッド プールに 4 つですよね?
  4. そして、シェル(Ubuntu)でこれらのスレッドを確認するにはどうすればよいですか? ps -eLf |を使用します。grep ノード | grep -v grep では次の 2 つしか表示されませんでした。

    ルート 16148 7492 16148 0 2 20:43 pts/26 00:00:00 ./bin/node /home/aaron/workspace/test.js
    ルート 16148 7492 16149 0 2 20:43 pts/26 00:00:00 . /bin/node /home/aaron/workspace/test.js

4

2 に答える 2

30
  1. First of all, libuv has removed the libeio from it. But it does perform async file I/O with a thread pool like libeio just as you mentioned.

  2. libuv also removes libev. It does the async network I/O based on the async I/O interfaces in different platforms, such as epoll, kqueue and IOCP, without a thread pool. There is a event loop which runs on the main thread of uv which polls the I/O events and processes them.

  3. The thread pool inside libuv is a fixed size thread pool (4 in uinx like system). It performs a task queue role and avoids the exhaustion of the system resources by generating threads indefinitely when the requests increase.

于 2013-03-21T08:39:19.323 に答える
2

アップティル バージョン 0.6 ノードはlibev、イベント ループの実行とlibeio非同期 I/O に使用されます (Unix バックエンドは、これら 2 つのライブラリに大きく依存しています)。しかし、バージョン 0.8libuvで置き換えlibevを開始しました。イベント プール内のすべての io およびイベントを実行、維持、および管理します。クロスプラットフォームの非同期 IO ライブラリの選択肢です。libeiolibuv

  1. はい、ノード 0.6 まで、0.8 で廃止され、スレッド プールを使用します
  2. はい。ただし、libevスレッド プールは使用しません。こちらをご覧ください

    明確化:私が投稿した質問のリンクによると、I/O (ソケットを含む) を扱うすべての POSIX 関数をサポートしています。しかし、ノード作成者はそれを非同期ファイル I/O のみに使用し、ネットワーク I/O に使用することにしました。どこから聞いたのかわかりませんが、通常のファイルで epoll を使用できます。libeiolibev

  3. libevイベント ループを使用するので、ここでは問題ありません。

  4. はい、 IOCPは Windows で非同期 I/O を処理します。カーネルはスレッド プールを使用します。
  5. 新しい Linux カーネルには、新しい BSD カーネルに epoll、kqueue があります。libevLinux 環境用でありlibeio、すべてのカーネルにイベント ループ/非同期 IO を提供します (select、poll、epoll、kqueue をサポート)。

更新に関する質問:

  1. についてあまり知らないlibuv
  2. たぶん十分です(わからない)
  3. これがWindows 8での私の発見であり、Process Explorerで確認しました。ノード アプリケーション プロセスの 4 つのスレッド、1 つの DLL、1 つのファイル、および 1 つのセクション (合計 7 エントリ) を示しました。

  4. ps -eLfps -eLf | grep xすべてのスレッドとプロセスが表示されます。過剰にフィルタリングしている可能性があります。x はノード プロセスの pid のように、ノード プロセス pid を探してください。

于 2013-03-22T20:37:59.940 に答える