検索
ホームページウェブフロントエンドjsチュートリアルNode.js のパフォーマンス指標をすぐに理解する

Node.js のパフォーマンス指標をすぐに理解する

Sep 16, 2021 am 10:10 AM
node.jsパフォーマンス

この記事では、Node.js のパフォーマンス指標について説明します。お役に立てば幸いです。

Node.js のパフォーマンス指標をすぐに理解する

私たちフロントエンド エンジニアにとって、Node.js アプリケーション開発をマスターすることが、シニア/エキスパートになる唯一の方法です。また、Node.js はサーバーサイド言語であるため、開発タスクを完了できるだけでなく、サーバーのパフォーマンスにも注意を払う必要があります。 [推奨学習: "nodejs チュートリアル "]

この記事では、Node.js の基本とパフォーマンス指標について予備的な紹介をします。

アプリケーション シナリオ

NodeJS パフォーマンス インジケーターを紹介する前に、まずそのアプリケーション シナリオを見てみましょう。アプリケーション シナリオが異なると、注目するパフォーマンス インジケーターは異なります。 。

  • BFF中間層、つまりインターフェイスのプロキシは、ゲートウェイ層として機能します

  • 開発および構築ツールgulpwebpackNode.js に基づく

  • デスクトップ アプリケーションElectron と Node.js を組み合わせた

  • SSRサーバーサイドレンダリング

Node.js がフロントエンドに使用されている場合 SSR、その場合、CPUNetwork が主な パフォーマンス ボトルネックになります ;

NodeJS を使用してデータ永続化関連の作業を実行する場合、 I/O および Disk の占有率は高くなります。

ほとんどのシナリオでは、CPUMemory、および ネットワークノードの主なパフォーマンスのボトルネックと言えます。

利点と欠点

  • node.js はフォールト トレラントですが、パフォーマンスはあまり良くありません

  • node.js操作データベースは専門的ではありません

  • node.js は非同期 io の処理に優れています

  • io 集中型ですが、CPU 集中型には適していません

イベント ループ (libuv)

これは公式 Web サイトから引用した図で、イベント ループの操作シーケンスの概要を簡略化して示しています

Node.js のパフォーマンス指標をすぐに理解する

フェーズの説明

  • Timer: このステージでは、setTimeout() となっているスケジュール コールバック関数を実行します。および setInterval()
  • 保留中のコールバック : 次のループ反復まで実行が遅延される I/O コールバック。
  • idle、prepare: システムによって内部的にのみ使用されます。
  • ポーリング: 新しい I/O イベントを取得し、I/O 関連のコールバックを実行します (シャットダウン コールバックを除くほぼすべての場合、タイマーと setImmediate() によって駆動されます スケジューリングを除く)、その他の場合、ノードは適切なタイミングでここでブロックされます。
  • 検出: setImmediate() ここでコールバック関数が実行されます。
  • #クローズド コールバック関数: いくつかのクローズド コールバック関数 (例: socket.on('close', ...)
  • #V8 GC メカニズム

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')

コード例

Node.js のパフォーマンス指標をすぐに理解する

実行結果

Node.js のパフォーマンス指標をすぐに理解する

2. top および iostat コマンドを使用して、メモリとハードディスクを確認します。

top [パラメータ]

Node.js のパフォーマンス指標をすぐに理解する

iostat[パラメータ]

Node.js のパフォーマンス指標をすぐに理解する

メモリ使用量

//该方法返回 Node.js 进程的内存使用情况的对象
process.memoryUsage()

コード例

Node.js のパフォーマンス指標をすぐに理解する

実行結果:

{
  rss: 4935680,
  heapTotal: 1826816,
  heapUsed: 650472,
  external: 49879
}复制代码

名詞の説明:

rss が常駐しています セット サイズは、このプロセスに割り当てられている物理メモリの量です (割り当てられた合計メモリの一部)

一般に、このインジケータが増加すると、メモリ リークが発生する可能性があります

heapTotal と heapused は、V8 のメモリ使用量を表します。

external は、V8 によって管理される Javascript にバインドされた C オブジェクトのメモリ使用量を表します。

CPU プロファイル

一般的に、メモリ リークが関係する場合は、ヒープ スナップショットを取得してから、 CPU の負荷が異常に高い場合は、CPU プロファイル

# を取得できます。これは次の 2 つの方法で取得できます。

Node.js のパフォーマンス指標をすぐに理解する

GC トレース

V8 には、node.js プログラムの起動用の多くのパラメーター オプションが用意されています。次のサンプル コードを通じて GC ログ情報を取得できます

Node.js のパフォーマンス指標をすぐに理解する

node --trace_gc の実行結果

#V8 では新しいメモリと古いメモリに対して異なる GC プロセスが使用されていることがわかります。

Node.js のパフォーマンス指標をすぐに理解する

##メモリ スナップショット

Node.js のパフォーマンス指標をすぐに理解する

ノードインスペクターを使用すると、スナップショットにフロントエンド変数の干渉が発生します。メモリ スナップショットを保存するには heapdump を使用し、メモリ スナップショットを表示するには devtool を使用することをお勧めします。 heapdump を使用してメモリ スナップショットを保存すると、Node.js 環境内のオブジェクトのみが中断されません。 heapdump の使用については後で紹介します

ストレス テスト

プロジェクトをオンラインにする前に、ストレス テストを行って、問題がないかどうかを確認する必要があります。ストレス テストによるメモリ リーク

ストレス テスト ツール: ab テスト (ApacheBench)、autocannon

以下は ab 関数を使用したスト​​レス テストの結果を示します

1Node.js のパフォーマンス指標をすぐに理解する

上記の実行結果を確認できます。

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面板分析

1Node.js のパフォーマンス指標をすぐに理解する

二. alinode

阿里云也提供了Nodejs应用的性能平台alinode,可以很方便、全面的为我们收集性能指标数据,同时以可视化图表的方式,更加的直观。接入alinode可参考5分钟快速入门

以下是部分采集数据图表展示

1Node.js のパフォーマンス指標をすぐに理解する

一些指标描述

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 サイトの他の関連記事を参照してください。

声明
この記事は掘金--比心FEで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
JavaScript in Action:実際の例とプロジェクトJavaScript in Action:実際の例とプロジェクトApr 19, 2025 am 12:13 AM

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

JavaScriptとWeb:コア機能とユースケースJavaScriptとWeb:コア機能とユースケースApr 18, 2025 am 12:19 AM

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

JavaScriptエンジンの理解:実装の詳細JavaScriptエンジンの理解:実装の詳細Apr 17, 2025 am 12:05 AM

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

Python vs. JavaScript:学習曲線と使いやすさPython vs. JavaScript:学習曲線と使いやすさApr 16, 2025 am 12:12 AM

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

Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

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

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

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

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

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

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

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

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

mPDF

mPDF

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

SublimeText3 英語版

SublimeText3 英語版

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

SublimeText3 中国語版

SublimeText3 中国語版

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

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター