nodejsのメモリリークを検出するためのツールはありますか?そして、nodejsアプリケーションのテストの経験について教えてください。
7 に答える
次のツールは、メモリリークを見つけるのに役立ちます。
また、ここにメモリリークを見つけるのに役立つチュートリアルもあります。
メモリリークを追跡する際に、上記のノードインスペクターを試しました。
2012年4月の時点では、最新のノードリリースv0.6.12で動作するように更新されていません。そのため、https ://github.com/c4milo/node-webkit-agentを見つけました。
node-inspectorでサポートされていない新しいV8エンジンのヒープスナップショットを表示することができました。短い順序で、リークしているモジュールを検出できました(場合によってはログに記録されます)。同様の成功を収めることを願っています。
次の情報源もお勧めします。
NodeUpの次のエピソードでは、プロファイリングとメモリリークの検出ツールについて説明します。
この記事-Node.jsでのメモリリークの追跡– Node.JSホリデーシーズン。基本的に、広く知られているすべてのモジュールと手法を集約して、メモリリークを追跡します。
- Mac OSの場合-Instrumentsツールは、ネイティブ(C ++)モジュールのデバッグに役立つ場合があります。SmartOSツールほど洗練されていませんが、セットアップは非常に簡単です。
方法1-
ノードを使用すると、ガベージコレクションを手動でトリガーできます。これは、メモリリークを確認するときに最初に行う必要があることです。これは、-expose-gcフラグを指定してNodeを実行することで実現できます(つまり、node --expose-gc index.js)。ノードがそのモードで実行されると、プログラムからglobal.gc()を呼び出すことにより、いつでもプログラムでガベージコレクションをトリガーできます。
process.memoryUsage()。heapUsedを呼び出すことにより、プロセスで使用されているメモリの量を確認することもできます。
ガベージコレクションを手動でトリガーし、使用されているヒープを確認することで、プログラムのメモリリークを実際に観察しているかどうかを判断できます。このテストを行うと、メモリの増加がさらに明らかになります。
方法2-
3ヒープダンプ方式
ノードの--inspectフラグがノードバージョン6に追加されました。この機能を使用すると、ChromeのDevTools内からノードプロセスをデバッグおよび検査できます。
--inspectフラグを渡してアプリケーションを起動するだけです。
$ node --inspect index.js
インスペクターのURLをたどり、[メモリ]タブに移動します。
DevToolsの[メモリ]タブ
autocannon -c 1 -d 60 http:// localhost:PORT
[ https://www.npmjs.com/package/autocannon ]でアプリケーションをヒットします
。約10秒後、および30秒後にヒープスナップショットを取得します。
ヒープスナップショット
の比較比較ビューには、スナップショット間で何が起こったかが表示されます。膨大な数のオブジェクトが作成されたか、GCによって収集されていないことがわかります。
詳細については、これらのすばらしい記事をお読みください。
彼らはリークを見つけて修正するのに大いに役立ちました:-
https://www.alexkras.com/simple-guide-to-finding-a-javascript-memory-leak-in-node-js/
https://www.nearform.com/blog/self-detect-memory-leak-node/
https://addyosmani.com/blog/taming-the-unicorn-easing-javascript-memory-profiling-in-devtools/
node-inspectorやnode-webkit-agentではなく、Chrome開発ツールとheapsnapshotファイルを直接使用しています。
require()
ヒープダンプモジュール。
実行中のnodejsプロセスにusr2シグナルを送信して、heapsnapshotファイルを取得します。
Chrome開発ツールの[プロファイル]タブにheapsnapshotファイルをロードします。
私はnpmパッケージMemwatchを使用しました:
Githubリポジトリと NPMソースを見てください
基本的に、このパッケージは、V8エンジンによってガベージコレクションが実行された直後にメモリヒープ使用量をチェックし、実際のメモリ使用量のベースラインを提供します。
これが私がそれをどのように使用したかです:
var memwatch = require('memwatch');
memwatch.on('leak', function(info) {
console.log('Memwatch leak: ');
console.log(info);
});
memwatch.on('stats', function(stats) {
console.log.message('Memwatch stats: ');
console.log(stats);
});
元のドキュメントから:
時折発生するこの
'stats'
イベントは、ヒープの使用状況と時間の経過に伴う傾向を説明するデータを提供します。この
'leak'
イベントは、コードがメモリリークしているように見えるときに発行されます。通常、ヒープサイズが短時間で継続的に大きくなる場合に実行されます。
Memwatchには、関数で取得できる2つのスナップショット間のヒープ状態を計算するための「HeapDiff」クラスも用意されています。
問題の原因となっているイベントを追跡するために、ステージ環境でmemwatchを実行することをお勧めします。
https://github.com/bnoordhuis/node-heapdumpは 非常にシンプルで、Chromeで結果を表示し(ブラウザーのjavascriptとnodejsで同じV8エンジンを使用しているため)、必要なときにメモリ内のオブジェクトサイズを比較できます。
そして、メモリリークを「手動で」検出する方法、またはそれを防ぐのに役立つもう1つのヒントは、コードの一部の場所でガベージコレクターを強制し、何が起こるかを確認することです。
「node--expose-gcfile.js」でアプリケーションを起動し、コード内の任意の場所で関数gc();を使用できます。ガベージコレクションを呼び出します。