2017-05-31 13 views
2

過去に流出してしまったライブラリにいくつかのコードがありますが、これを避けるために回帰テストを追加したいと思います。私は、メモリー使用量プロファイルやValgrindを調べることで、手動でメモリリークを見つける方法を理解していますが、自動テストの作成には問題がありました。Nodeのメモリリークを自動的にテストする方法はありますか?

私は操作を実行した後にprocess.memoryUsage()を使用してみましたが、リークをチェックしていましたが、繰り返しこの操作を繰り返して操作数とメモリー使用量の間に線形関係を確立しようとしましたが、メモリ使用量これを正確に測定するのが難しい数字です。

私の質問は、これは、操作がメモリをリークしたときに一貫して渡され、メモリがリークしないときに失敗するNodeにテストを書き込む有効な方法ですか?

私が言及すべき1つのしわは、C++アドオンでメモリリークが発生していて、リークされたメモリの一部がノードVMによって管理されていないためです。したがって、process.memoryUsage().rssを測定していました。

答えて

3

ノードjsのメモリリークをテストするための情報の自動化とロギング。

  • memwatch-nextという素晴らしいモジュールがあります。これは、メモリリークがある場合は、自動的に測定することができるようになります

    const memwatch = require('memwatch-next'); 
    
    // ... 
    
    memwatch.on('leak', (info) => { 
    
        // Some logging code... 
    
        console.error('Memory leak detected:\n', info); 
    }); 
    

    NPMはapp.jsに追加--save memwatch-次

をインストールします。テストにそれを置くために

  • :このため

の良いツールは、のApache JMeterのです。詳細情報here

httpを使用している場合は、jMeterを使用してアプリケーションのエンドポイントをテストすることができます。

SOAKテストは、長期間にわたって、システムの安定性とパフォーマンスの特性を確認するために行われ、その良いあなたはメモリリーク、接続リークなど

  • 継続的インテグレーションソフトウェアを探しているとき:

Jenkinsのような継続的な統合ソフトウェアを使用している場合は、これを行うためにJenkinsジョブを作成して、アプリケーションをテストしますテスト後に提供されたパラメータを使用してアプリケーションを展開するか、メモリリークがある旨を報告します。(あなたのJenkinsの仕事の構成に応じて)

幸運、いくつかの任意のプログラムを考える

+0

このライブラリに関する情報をありがとうございますが、私の具体的なシナリオでは役に立たないと思います。私は、リーク(ループ内の異なるポートにバインドされたサーバーの作成と起動)となり、memwatchイベントが起きなかったと確信していたテストでそれを使用しようとしました。 – murgatroid99

+0

Mem Watchはアプリケーションのレベルにあります。起動するすべてのサーバーには独自のmemがあります。そのインスタンスを監視すると、サーバーを生成するプロセスであるグローバルな画像に気付かれません。このようなアクションのコンテナは永遠に永遠に監視することができます。ここでは、ノードのプロセスやメモリの概要、 – sBanda

0

、今までに終了するかどうかを判断することは常に可能ですか?停止の問題はこれを説明しています。次のプログラムを考えてみましょう。

function collatz(n){ 
    if(n==1) 
     return; 

    if(n%2==0) 
     return collatz(n/2); 
    else 
     return collatz(3*n+1); 
} 

メモリ内のデータにも同じ考えを適用できます。どのメモリがもはや必要でないことを識別することは常に可能ではなく、したがってガベージコレクションが可能です。ある状況では、多くのメモリを消費するように設計されている場合もあります。既知の唯一のオプションは、あなたのやり方のようなヒューリスティックがいくつか出てきていますが、間違いや否定の可能性が最も高くなります。リークの根本的な原因を特定して修正する方が簡単な場合があります。

関連する問題