Node.js プログラムは、CPU または入出力操作の制限により、実行速度が非常に遅くなる場合があります。 CPU の観点から見ると、プログラムの動作が遅い一般的な原因の 1 つは、最適化されていない「ホット パス」 (頻繁にアクセスされるコード) です。入出力の観点から見ると、プログラムの実行速度の制限は、基盤となるオペレーティング システムの影響を受けるか、ノード自体の障害が原因である可能性があります。または、遅いプログラムは Node 自体とは何の関係もない可能性があります。問題は、遅く最適化されていないデータベース クエリや API 呼び出しなどの外部リソースにあります。
この記事では、CPU 負荷の高い操作を引き起こすコード ベースの操作を特定し、最適化することに焦点を当てます。同時に、実稼働アプリケーションの構成ファイルが調査され、運用効率を向上させる可能性のある変更が分析されて行われます。
ノードのシングルスレッドの性質により、サーバーにとって CPU の大きな負荷を回避することが特に重要です。 CPU に費やされる時間が他のリクエストに応答するのに時間がかかるためです。このプロセス中にアプリケーションの応答が遅く、CPU 使用率が常に高いことに気付いた場合は、アプリケーションを分析することでボトルネックを特定し、アプリケーションを高速に実行できる状態に戻すことができます。
分析アプリケーション
実稼働環境で遅いプログラムを複製するのは難しく、時間がかかります。ありがたいことに、これを自分で行う必要はありません。運用サーバー上でプロファイル データを収集し、オフラインで分析できます。いくつかの分析方法を見てみましょう。
1. カーネルレベルのツールを使用します
まず、DTrace (Solaris、BSD)、perf (Linux)、または XPerf (Windows) などのカーネル レベルのツールを使用して、実行中のプロセスからスタック トレースを収集し、フレーム グラフを生成できます。カーネルレベルの分析は、実行中のプロセスへの影響を最小限に抑えます。フレーム グラフは、ズームインおよびズームアウトをサポートするコール スタックに基づいて生成されるベクター グラフィックです。 Netflix の Yunong Xiao は、Linux システムのパフォーマンスについて素晴らしいスピーチやツイートを行っており、このテクノロジへの理解を深めるのに役立ちます。実稼働アプリケーションで高いスループットを維持したい場合は、この方法の使用を検討してください。
2、
2. V8 アナライザーを使用します
もう 1 つのオプションは、V8 プロファイラーを直接使用することです。このアプローチではプロセスをプログラムと共有するため、プログラムのパフォーマンスに影響します。このため、このような問題が発生した場合には、関連する出力をキャプチャするためにのみ V8 プロファイラーを実行してください。このアプローチの利点は、Chrome のすべての分析ツールとその出力 (フレーム グラフを含む) を使用してプログラムを調査できることです。
次のコードを実行してプログラムをテストしてください:
npm install v8-profiler --save
その後、プログラムに次のコードを追加します:
const profiler = require('v8-profiler') const fs = require('fs') var profilerRunning = false function toggleProfiling () { if (profilerRunning) { const profile = profiler.stopProfiling() console.log('stopped profiling') profile.export() .pipe(fs.createWriteStream('./myapp-'+Date.now()+'.cpuprofile')) .once('error', profiler.deleteAllProfiles) .once('finish', profiler.deleteAllProfiles) profilerRunning = false return } profiler.startProfiling() profilerRunning = true console.log('started profiling') } process.on('SIGUSR2', toggleProfiling)
SIGUSR2 シグナルをこのプロセスに送信するとすぐに分析が開始されます。再度 SIGUSR2 シグナルを送信することで解析を停止できます (以下のコード)。
kill -SIGUSR2 [pid]
このプロセスの分析結果は、現在の作業パスのファイルに書き込まれます (パスが書き込み可能であることを確認してください)。これはプログラム可能なインターフェイスであるため、(Web エンドポイント、IPC などを使用して) 自由にトリガーできます。プログラムがいつ遅くなるかを予感している場合は、いつでもこのインターフェイスをトリガーできます。自動トリガーの設定は、継続的な監視を避けるのに役立ちますが、キャプチャをいつ、どのくらい継続する必要があるかを予測的に理解する必要があります。
プロファイル データが収集されたら、Chrome デベロッパー ツールにロードして分析を開始します。
3. プロセスマネージャーを使用します
V8 アナライザーを直接使用することは非常に効率的でカスタマイズ可能ですが、コード ベースに入り込み、プロジェクトに望ましくない依存関係がさらに追加されることになります。別の方法は、プロセス マネージャーを使用することです。プロセス マネージャーを使用すると、プログラムを分析する必要があるときに、さまざまなツールを使用してプログラムをラップできます。オプションのツールは、StrongLoop の SLC コマンド ライン ツールです。
まず、npm install Strongloop –g を実行し、次に次のコードを実行します:
slc start [/path/to/app]
上記のコードはプロセス マネージャーでプログラムを起動し、オンデマンドで CPU プロファイリング データを抽出できます。アプリケーション ID を確認して取得するには、次を実行します:
slc ctl
次のような結果が得られます:
Service ID: 1 Service Name: my-sluggish-app Environment variables: Name Value NODE_ENV production Instances: Version Agent version Debugger version Cluster size Driver metadata 5.0.1 2.0.2 1.0.0 1 N/A Processes: ID PID WID Listening Ports Tracking objects? CPU profiling? Tracing? Debugging? 1.1.61022 61022 0 1.1.61023 61023 1 0.0.0.0:3000
検索アプリケーションのプロセス ID。この例では、ID は 1.1.61023 です。これで、次のコードを実行することで、いつでも分析を開始できます:
slc ctl cpu-start 1.1.61023
当我们觉得已经捕获到了迟滞行为,就可以运行以下代码来停止分析器:
slc ctl cpu-stop 1.1.61023
以下代码将写文件至硬盘:
CPU profile written to `node.1.1.61023.cpuprofile`, load into Chrome Dev Tools
好啦,就是这样。你可以像在 V8 分析器里那样把文件加载到 Chrome 里面进一步分析。
作出正确决定
在本文中,笔者展示了三种在 Node 中捕获生产环境下 CPU 使用量的方式。那么,你应该选用哪一种呢?下面是一些帮助你缩小决策范围的想法:
以上就是本文的全部内容,3种Node.js代码优化方式,希望大家可以熟练掌握。