nodejs イベントループとマルチプロセス (3) - マルチプロセスとマルチスレッドの概要 & プロセスは複数のスレッドで構成されます & ノードはクラスターを使用してマルチプロセスを開きます & マルチプロセスのパフォーマンスは明らかに単一プロセスより優れています-ab は Apache ストレス テスト ツールに組み込まれています
第4章 nodejsマルチプロセス
章のまとめ
- マルチプロセッシングを使用する理由
- マルチプロセッシングとマルチスレッドの概要
- Nodejsをマルチスレッド、マルチプロセスで開く方法
- クラスター原理の紹介
なぜ複数のプロセスが必要なのか
- Nodejs はシングルスレッドであり、http リクエストの処理中にエラーが発生するとプロセス全体が終了し、致命的になります。
マルチプロセッシングとマルチスレッドの概要
プロセスはリソース割り当ての最小単位であり、スレッドは CPU スケジューリングの最小単位です。
「プロセス - リソース割り当ての最小単位、スレッド - プログラム実行の最小単位」
スレッドとは、プロセスの実行フローであり、CPU のスケジューリングとディスパッチの基本単位であり、プロセスよりも小さく、独立して実行できる基本単位です。プロセスは複数のスレッドで構成され、スレッドはプロセスが所有するすべてのリソースを同じプロセスに属する他のスレッドと共有します。
プロセス下のスレッドは通信してリソースを共有できます
プロセスには独立したアドレス空間があります。プロセスがクラッシュしても、保護モードの他のプロセスには影響せず、スレッドはプロセス内の別の実行パスにすぎません。スレッドには独自のスタックとローカル変数がありますが、スレッドには個別のアドレス空間はなく、スレッドの終了はプロセス全体の終了と同等です。
-
グーグルクローム
- プロセス: タブはプロセスです
- スレッド: タブは、レンダリング スレッド、JS 実行スレッド、ガベージ コレクション、サービス ワーカーなどの複数のスレッドで構成されます。
-
ノードサービス
ab は、Apache に付属するストレス テスト ツールです。
ab -n1000 -c20 '192.168.31.25:8000/'
- プロセス: http サービスが特定のポートをリッスンする
- スレッド: http サービスは、次のような複数のスレッドで構成されます。
- メインスレッド: コードの取得、コンパイル、実行
- コンパイル スレッド: メイン スレッドの実行時にコードを最適化できます。
- プロファイラー スレッド: 時間のかかるメソッドを記録し、最適化のサポートを提供します。
- その他のスレッド: ガベージコレクションとクリア作業に使用されます。複数のスレッドであるため、並行してクリアできます。
最終的にマルチプロセスかマルチスレッドを選択しますか?
マルチプロセスとマルチスレッドは組み合わせて使用されることが一般的ですので、どちらか一方を誤解しないでください。
1) 頻繁に作成および破棄する必要がある優先スレッド
この原則の最も一般的な適用例は Web サーバーです。接続によってスレッドが作成され、スレッドが切断されるとスレッドは破棄されます。プロセスを使用する場合、作成と破棄にかかるコストは耐え難いものになります。
2) 計算量の多いスレッドを優先的に使用する
いわゆる大規模な計算は当然ながら多くの CPU を消費し、頻繁に切り替えられるため、この場合にはスレッドが最適です。
この原理は、画像処理とアルゴリズム処理で最も一般的です。
3) 関連性の高い処理はスレッドを使用し、関連性が弱い処理はプロセスを使用します。
強い相関と弱い相関とは何ですか? 理論的に定義するのは難しいですが、簡単な例で明確にします。
一般的なサーバーは、メッセージの送受信、およびメッセージの処理というタスクを実行する必要があります。「メッセージの送受信」と「メッセージの処理」は関連性の低いタスクであり、「メッセージの処理」は「メッセージのデコード」と「ビジネスの処理」に分けられるが、この 2 つのタスクは比較的関連性が高い。そのため、「メッセージの送受信」と「メッセージの処理」を別プロセスで設計したり、「メッセージのデコード」と「業務処理」を別のスレッドで設計したりすることができます。
4) マルチマシン分散にはプロセスを使用し、マルチコア分散にはスレッドを使用するように拡張できます。
5) すべての要件が満たされている場合は、最も使い慣れた、最も得意な方法を使用します。
概要: 高速スレッドと高いプロセス信頼性。
Nodejsのマルチスレッド化
10.5.0 のリリースでは、Node.js にマルチスレッド (worker_threads モジュール) の実験的なサポートが追加されました。2018年
Nodejs の主流はまだマルチプロセス ソリューションしかなく、API が安定してからマルチスレッドが使用できるようになります。
参考記事:https://blog.csdn.net/azard5/article/details/85016412
複数のプロセスを作成する
クラスターを使用してマルチプロセスを起動する
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length; // 获取CPU的个数
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
}
わずかに最適化:
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
// 其它代码
} else {
require("./app.js");
}
例
http_cluster.js
const cluster = require('cluster'); // nodejs内置模块
const http = require('http');
const cpuMuns = require('os').cpus().length; // cpu核数
//cluser 基本原理, 就是主线程去fork 子线程,然后管理他们
if (cluster.isMaster) {
// 如果你是主线程
// cluster.fork();
for(var i = 0; i < cpuMuns; i++) {
cluster.fork(); // 开启子进程
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
//子线程走下面
http.createServer((req, res) => {
res.end('hello');
}).listen(8001, () => {
console.log('server is listening: ' + 8001);
});
}
コマンドターミナル、入力します
ノード .\http_cluster.js
見せる
ブラウザ入力
http://ローカルホスト:8001/
表示 -- こんにちは
マルチプロセスと単一プロセスのパフォーマンスの比較
マルチプロセスのパフォーマンスは単一プロセスよりも大幅に優れています
ab は、Apache に付属するストレス テスト ツールです。みんなにMacの使用を勧める
ab -n1000 -c20 '192.168.31.25:8000/'
- n 件のリクエスト
- c 同時接続数
nodejsのデバッグ方法
https://code.visualstudio.com/Docs/editor/debugging
vscode的 .vscode文件下面配置 launch.json
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceFolder}/chapter4/http_cluster.js"
}
]
}