目次
アプリケーション シナリオ
利点と欠点
イベント ループ (libuv)
Node.js® は
システム レベルと Node.js プロセス レベルからパフォーマンス指標について説明します
ストレス テスト
#メモリリーク
总结
参考
ホームページ ウェブフロントエンド 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Node V8 エンジンのメモリと GC の詳細な図による説明 Node V8 エンジンのメモリと GC の詳細な図による説明 Mar 29, 2023 pm 06:02 PM

この記事では、NodeJS V8 エンジンのメモリとガベージ コレクター (GC) について詳しく説明します。

Nodeのメモリ制御に関する記事 Nodeのメモリ制御に関する記事 Apr 26, 2023 pm 05:37 PM

ノンブロッキングおよびイベント駆動に基づいて構築されたノード サービスには、メモリ消費量が少ないという利点があり、大量のネットワーク リクエストの処理に非常に適しています。大量のリクエストを前提として、「メモリ制御」に関する問題を考慮する必要があります。 1. V8 のガベージ コレクション メカニズムとメモリ制限 Js はガベージ コレクション マシンによって制御されます

最適な Node.js Docker イメージを選択する方法について話しましょう。 最適な Node.js Docker イメージを選択する方法について話しましょう。 Dec 13, 2022 pm 08:00 PM

ノード用の Docker イメージの選択は些細なことのように思えるかもしれませんが、イメージのサイズと潜在的な脆弱性は、CI/CD プロセスとセキュリティに大きな影響を与える可能性があります。では、最適な Node.js Docker イメージを選択するにはどうすればよいでしょうか?

Node.js 19 が正式リリースされました。その 6 つの主要な機能についてお話しましょう。 Node.js 19 が正式リリースされました。その 6 つの主要な機能についてお話しましょう。 Nov 16, 2022 pm 08:34 PM

Node 19 が正式リリースされましたので、この記事では Node.js 19 の 6 つの主要な機能について詳しく説明します。

Node の File モジュールについて詳しく説明しましょう Node の File モジュールについて詳しく説明しましょう Apr 24, 2023 pm 05:49 PM

ファイル モジュールは、ファイルの読み取り/書き込み/開く/閉じる/削除の追加など、基礎となるファイル操作をカプセル化したものです。ファイル モジュールの最大の特徴は、すべてのメソッドが **同期** と ** の 2 つのバージョンを提供することです。 asynchronous**、sync サフィックスが付いているメソッドはすべて同期メソッドであり、持たないメソッドはすべて異種メソッドです。

Node.js の GC (ガベージ コレクション) メカニズムについて話しましょう Node.js の GC (ガベージ コレクション) メカニズムについて話しましょう Nov 29, 2022 pm 08:44 PM

Node.js はどのように GC (ガベージ コレクション) を行うのでしょうか?次の記事で詳しく説明します。

Nodeのイベントループについて話しましょう Nodeのイベントループについて話しましょう Apr 11, 2023 pm 07:08 PM

イベント ループは Node.js の基本的な部分であり、メイン スレッドがブロックされていないことを確認することで非同期プログラミングが可能になります。イベント ループを理解することは、効率的なアプリケーションを構築するために重要です。次の記事では、Node のイベント ループについて詳しく説明します。お役に立てれば幸いです。

ノードのバッファーについて詳しく見る ノードのバッファーについて詳しく見る Apr 25, 2023 pm 07:49 PM

当初、JS はブラウザ側でのみ動作していたため、Unicode でエンコードされた文字列の処理は簡単でしたが、バイナリ文字列や非 Unicode エンコード文字列の処理は困難でした。バイナリは、コンピュータのビデオ/オーディオ/プログラム/ネットワーク パッケージの最低レベルのデータ形式です。

See all articles