ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js のパフォーマンス指標をすぐに理解する

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

青灯夜游
青灯夜游転載
2021-09-16 10:10:183255ブラウズ

この記事では、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 までご連絡ください。