LibuvスレッドプールによるノードJSパフォーマンスの増加



この5番目の内訳では、私はNode JS スレッドプール管理によるパフォーマンスこれを達成するにはLibuv Works、スレッドプールの仕組み、およびマシンの仕様に基づいてスレッド数を設定する方法.
あなたはまだノードJSの内部の作業に精通していないノード開発者ですか?もしそうならば、あなたはノードをインストールしてから存在したいくつかのデフォルト構成で生産アプリケーションを配備しているかもしれません.この記事では、あなたのアプリケーションの操作のいくつかのパフォーマンスを非常によく倍増させることができる、あまり知られていない設定について触れます.これは多くの要因に依存しますが、チャンスはこれが多くのための勝利になるだろう良いです.

動画を見る


ノードJSランタイム環境


ノード実行環境はいくつかの可動部分から構成される.我々はすべての人に精通している必要がありますGoogle V8 engine , 我々の実行に責任があるJavaScript ロジック.しかし、あまり知られていない図書館がありますLibuv , 非同期I/O操作の管理に責任があります.
これらのI/O操作は、オペレーティングシステムに関連する「ヘビーデューティタスク」としてもよく知られています.ファイルやフォルダ管理、TCP/UDPトランザクション、圧縮、暗号化などのタスクはLibuvを介して処理されます.
現在、これらの操作のほとんどがデザインによって非同期である間、同期しているいくつかがあります、そして、正しく扱われないならば、我々のアプリケーションをブロックさせるかもしれません.Libuvがいわゆる「スレッドプール」を持っているのはこのためです.

スレッドプール


Libuvは、同期操作を無効にするために使用する4スレッドのスレッドプールを開始します.これを行うには、Libuvは、アプリケーションが同期タスクで不必要にブロックされないことを保証します.
ここでは、我々は我々のマシンの仕様やアプリケーションが展開される仮想マシンに合うように設定を利用することです.これは4スレッドのデフォルト値を1024スレッドまで変更することができます.我々はこの設定を達成することによってUV_THREADPOOL_SIZE ノード変数.

物理的対論理CPUコア


どのように多くの論理コアが動いているかを理解する必要があります.私たちの例として私のMacBook Proを取る場合、それは6物理CPUコア(インテル)を実行している.
しかし、これらのコアにはハイパースレッドがあり、それぞれのコアは2つのオペレーションを同時に実行することができます.したがって、我々は1つの物理的なコアを2つの論理的なコアとしてハイパースレッディングで考えます.私のケースでは、私のMacBook Proは12の論理コアを実行しています.

ノードJSパフォーマンスを上げる方法


この勧告は、あなたのマシンが動いている論理的なコアの数に対して、UVSUNEスレッド変数を設定することです.私の場合、スレッドプールサイズを12に設定します.
それはあなたのハードウェアが実行されている実際のコアよりも多くの何かにサイズを設定する意味をなし、実際により悪いパフォーマンスをもたらす可能性があります.

論理コアのチェック方法


あなたのアプリケーションが異なるマシン仕様で複数の環境で動くかもしれないので、配備に関して、あなたがしたい最後のことは手動でUVSUNE ThreadPolRangeサイズをセットすることです.このように、アプリケーションが起動された環境で起動される瞬間にスレッドプールサイズを動的に設定する方法が必要です.
良いニュースは、これは非常に簡単ですが、慎重に対処する必要があります.これを実現するには、次のコードをノードアプリケーションのルートJSファイルの先頭に追加します.
const OS = require('os')
process.env.UV_THREADPOOL_SIZE = OS.cpus().length
The OS モジュールはノードjsに固有です.機能があるcpus() , あなたのマシンが動いている論理的なコアの合計量を返します.何が良いです、あなたのCPUコアがHyperthreadingを持たないならば、この機能はちょうど代わりに物理的なCPUコアの数を返します.

閉鎖


私はこの記事が貴重であることを証明した.私は、私のチェックアウトと同様に、埋め込まれたビデオを見ることを勧めますSource Code repo ここで言及されたすべてのコードサンプルを持っているGithubで.
次回まで、歓呼😎