Azure Websites で Node.js アプリケーションをマルチプロセスで動かす方法

Websites ではインスタンス構成によってはCPUコア数が2個以上ある環境が用意されるが、Node アプリケーションを一つしか動かさないシチュエーションでは高負荷時の処理効率があまり良くない。

一般的に Node アプリケーションをマルチプロセス化するには、子プロセスをスポーンさせたりする実装が必要。

Websites は 前記事の通り iisnodeという Node のプロセスを良い感じに管理する仕組みがあるので、これのオプションを変更することで、多くの場合は既存アプリケーションに手を加える事無く、実行させるプロセス数を増やすことができる。

この方法を使うことで、アプリケーションへのHTTPリクエストも効率よく分散できる。

how-to

nodeProcessCountPerApplication:プロセス数  

といった内容の iisnode.yml を wwwroot に配置する。だけで良い。 プロセス数は環境とアプリケーションによって調整する。デフォルトのプロセス数はもちろん1。

この設定は、iisnode がアクティブになった時 (アプリケーションのURLにリクエストがあった時) に一気に設定した数のプロセスを起動する。それぞれプロセスごとに違うポート(名前付きパイプ)でリッスンすることになる。

Websites の設定で常時接続を有効にした場合は常にその数のプロセスでリクエストを待機する状態なので非常にいい感じ。

上に貼ったスクショにあるように、iisnode.yml ではいろいろ設定できる ので状況に応じてチューニングしたい。

なお、実行しておけるプロセス数に制限があるのかはまだ調べていない。試しに10に設定したら10個動いた。

プロセスの実行状況はKuduで確認できる。

※Kudu: https://サイト名.scm.azurewebsites.net/