この記事では、Node.js のパフォーマンス指標について説明します。お役に立てば幸いです。
私たちフロントエンド エンジニアにとって、Node.js
アプリケーション開発をマスターすることが、シニア/エキスパートになる唯一の方法です。また、Node.js はサーバーサイド言語であるため、開発タスクを完了できるだけでなく、サーバーのパフォーマンスにも注意を払う必要があります。 [推奨学習: "nodejs チュートリアル "]
この記事では、Node.js の基本とパフォーマンス指標について予備的な紹介をします。
アプリケーション シナリオ
NodeJS
パフォーマンス インジケーターを紹介する前に、まずそのアプリケーション シナリオを見てみましょう。アプリケーション シナリオが異なると、注目するパフォーマンス インジケーターは異なります。 。
BFF
中間層、つまりインターフェイスのプロキシは、ゲートウェイ層として機能します開発および構築ツール
gulp
、webpack
Node.js に基づくデスクトップ アプリケーション
Electron
と Node.js を組み合わせたSSR
サーバーサイドレンダリング
Node.js がフロントエンドに使用されている場合 SSR
、その場合、CPU
と Network
が主な パフォーマンス ボトルネックになります
;
NodeJS を使用してデータ永続化関連の作業を実行する場合、 I/O
および Disk
の占有率は高くなります。
ほとんどのシナリオでは、CPU
、Memory
、および ネットワーク
ノードの主なパフォーマンスのボトルネックと言えます。
利点と欠点
node.js はフォールト トレラントですが、パフォーマンスはあまり良くありません
node.js操作データベースは専門的ではありません
node.js は非同期 io の処理に優れています
io 集中型ですが、CPU 集中型には適していません
イベント ループ (libuv)
これは公式 Web サイトから引用した図で、イベント ループの操作シーケンスの概要を簡略化して示しています
フェーズの説明
-
Timer: このステージでは、
setTimeout()
となっているスケジュール コールバック関数を実行します。およびsetInterval()
。 - 保留中のコールバック : 次のループ反復まで実行が遅延される I/O コールバック。
- idle、prepare: システムによって内部的にのみ使用されます。
-
ポーリング: 新しい I/O イベントを取得し、I/O 関連のコールバックを実行します (シャットダウン コールバックを除くほぼすべての場合、タイマーと
setImmediate() によって駆動されます
スケジューリングを除く)、その他の場合、ノードは適切なタイミングでここでブロックされます。 -
検出:
setImmediate()
ここでコールバック関数が実行されます。 - #クローズド コールバック関数: いくつかのクローズド コールバック関数 (例: socket.on('close', ...)
Node.js® は
Chrome V8 エンジンに基づく JavaScript ランタイム環境であり、シングルスレッドであることがわかっています。
V8 メモリ は新世代と旧世代に分かれています:
: スペースからスペースへのメモリ リサイクル スカベンジ アルゴリズムを使用します
旧世代: 参照マーキングとデフラグメンテーションの形式でのメモリのリサイクルGC 時間が長すぎると、JS スレッドがブロックされ、サービスに影響を及ぼします。パフォーマンス。メモリを不適切に使用すると、メモリ オーバーフローが発生します。上記の Node.js の基本知識を理解した後、パフォーマンス指標を見てみましょう
パフォーマンス指標
システム レベルと Node.js プロセス レベルからパフォーマンス指標について説明します
システム レベル##サーバーの場合 (物理マシン
、仮想マシン、
Dockerなど) レベルで、次の監視指標を提供します:
#メモリ使用量
-
CPU
使用率 システム負荷、使用中/進行を待機しているプロセスの数
- システム
QPS
ハード パフォーマンス インジケーター
##ディスク使用量- ##GC
- 統計## … …
-
プロセス レベル - Node.js プロセスごとに、次の監視インジケーターが提供されます。
ヒープ内 (合計および使用済み) およびオフヒープ メモリの統計情報 ##ヒープ内の各メモリ領域が占有するメモリ統計
- ガベージ コレクション (GC) はプロセス全体の実行時間の割合を占めます
- QPS
- CPU 統計に基づく1 秒、15 秒、30 秒、および 60 秒
- libuv ハンドル、タイマー統計
- ....
- 上記のパフォーマンス指標はどのように取得すればよいでしょうか?
- システム レベル
システムレベルのインジケーターは、次の 2 つの方法で取得できます
1. os モジュール
const os = requie('os')
コード例
実行結果
2. top および iostat コマンドを使用して、メモリとハードディスクを確認します。
top [パラメータ]
iostat[パラメータ]
メモリ使用量
//该方法返回 Node.js 进程的内存使用情况的对象 process.memoryUsage()
コード例
実行結果:
{ rss: 4935680, heapTotal: 1826816, heapUsed: 650472, external: 49879 }复制代码
名詞の説明:
rss が常駐しています セット サイズは、このプロセスに割り当てられている物理メモリの量です (割り当てられた合計メモリの一部)
一般に、このインジケータが増加すると、メモリ リークが発生する可能性があります
heapTotal と heapused は、V8 のメモリ使用量を表します。
external は、V8 によって管理される Javascript にバインドされた C オブジェクトのメモリ使用量を表します。
CPU プロファイル
一般的に、メモリ リークが関係する場合は、ヒープ スナップショットを取得してから、 CPU の負荷が異常に高い場合は、CPU プロファイル
# を取得できます。これは次の 2 つの方法で取得できます。
GC トレース
V8 には、node.js プログラムの起動用の多くのパラメーター オプションが用意されています。次のサンプル コードを通じて GC ログ情報を取得できます
node --trace_gc の実行結果
#V8 では新しいメモリと古いメモリに対して異なる GC プロセスが使用されていることがわかります。
##メモリ スナップショット
ノードインスペクターを使用すると、スナップショットにフロントエンド変数の干渉が発生します。メモリ スナップショットを保存するには heapdump を使用し、メモリ スナップショットを表示するには devtool を使用することをお勧めします。 heapdump を使用してメモリ スナップショットを保存すると、Node.js 環境内のオブジェクトのみが中断されません。 heapdump
の使用については後で紹介します
ストレス テスト
プロジェクトをオンラインにする前に、ストレス テストを行って、問題がないかどうかを確認する必要があります。ストレス テストによるメモリ リーク
ストレス テスト ツール: ab テスト (ApacheBench)、autocannon
以下は ab 関数を使用したストレス テストの結果を示します
上記の実行結果を確認できます。
QPS の 1 つ: 4301.28/秒
平均継続時間各リクエスト: 23ms
送信速度: 617.47kb/s
#メモリリーク
Node.js は比較的専門的なバックエンド言語 Java、PHPなど、いくつかの基本的な構造は比較的完璧ではありません。シングルスレッドの特性と相まって、大規模なアプリケーションではサーバーや Node.js プロセスでパフォーマンスのボトルネックが発生しやすくなります。 ノード メモリ リークの原因となる状況は通常 3 つあります。- ノード v8 自体のメモリ サイズ制限: 64 ビット システムは約 1.4GB、32 ビットです。システム容量は約0.7GBです。
- プログラムの不適切な使用: グローバル変数の参照、クロージャの不適切な使用、破棄されていないイベント リスナー
- 大きなファイルのアプリケーション: バッファ操作は次のとおりです。バッファは v8 メモリを占有しません
#1. heapdump: メモリ スナップショットのクロム パネル分析の生成
メモリ スナップショットの印刷は CPU を非常に消費する操作であり、オンライン ビジネスに影響を与える可能性があることに注意してください。
はじめに
const heapdump = require('heapdump')Get
方法 1: コマンドkill -USR2
方式二:调用writeSnapshot
heapdump.writeSnapshot('./' + Date.now() + '.heapsnapshot');
chrome面板分析
二. alinode
阿里云也提供了Nodejs应用的性能平台alinode,可以很方便、全面的为我们收集性能指标数据,同时以可视化图表的方式,更加的直观。接入alinode可参考5分钟快速入门
以下是部分采集数据图表展示
一些指标描述
Memory
-
memory_sys
:系统内存使用百分比。 -
memory_node
: 所有 Node.js 进程内存使用之和占系统内存的百分比。
CPU
-
cpu_sys
:系统 CPU 使用百分比。 -
cpu_node
:所有 Node.js 进程 CPU 使用百分比之和。
Load
load1
:1分钟内平均 Load。load5
:5分钟内平均 Load。load15
:15分钟内平均 Load。-
下面是一些
Load
的参考信息 (Load
已经归一化处理,如果是 N 核 CPU,那么相应Load * N
):0.7 :不错的状态,有新任务也可以及时处理;
-
Load = 1
:即将有任务需要额外的等待时间才能被处理,需要引起关注; -
Load > 5
:任务需要等待时间很长,需要干预处理。 - 通常先看
load15
,如果很高,再看load1
和load5
,看是否有下降趋势,短时间内load1
大于 1,不用担心,如果长时间Load
较高,需要引起关注。
QPS
该实例所有 Node.js 进程每秒钟处理的 HTTP 请求数之和。
GC
-
gc_avg
:所有 Node.js 进程垃圾回收时间占比平均值。 -
gc_max
:每分钟内垃圾回收时间最多的 Node.js 进程的垃圾回收时间占比。
三. 开源Easy-Monitor
企业级 Node.js 应用性能监控与线上故障定位解决方案。
Easy-Monitor是一款轻量级的Node性能监控工具。快速入口
我们也可以给予它的基础之上去搭建部署一套自己内部的性能平台。
总结
以上是我关于Node.js性能指标以及获取的简单介绍,更多的是对包含性能点的一个整体上的介绍,那针对每个性能指标我们都可以去再做更深入的研究。希望这篇文章能够帮助你,同时也感谢你的阅读,期待再见~
参考
Node.js 性能平台
如何分析 Node.js 中的内存泄漏
本文示例代码
原文地址:https://juejin.cn/post/7008006326857138184
作者:比心FE
更多编程相关知识,请访问:编程入门!!
以上がNode.js のパフォーマンス指標をすぐに理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 中国語版
中国語版、とても使いやすい

Dreamweaver Mac版
ビジュアル Web 開発ツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター
