4

最近、私は で最初のプロジェクトを開始しましたが、node.js間違いなく気に入っています。すべてのモジュールで非常に強力です。ただし、約 1 時間後にサーバーがクラッシュする原因となる「わずかな」メモリ リークが発生しているようです (99 ~ 100% の CPU 使用率)。私はしばらくの間、この問題を解決しようとしてきました。

幸いなことに、少し検索したところ、 という人気のあるツールが見つかりましたmemwatch。もちろん、モジュールをインストールし、サーバーのプロセスのメモリ使用量/ストレージのログを記録し始めました。

最終的に、ログを調べたところ、考えられる原因が見つかりました。

  {
    "what": "String",
    "size_bytes": 9421368,
    "size": "8.98 mb",
    "+": 16635,
    "-": 533
  }

もちろん、30 秒以内に、この小さなバガーは 9MB の増加に成功しました (非常に珍しいことです)。これは、私のメモリ リークのタイプが であるように思われることを知るのは素晴らしいことですstringが、ここからどこへ行くのでしょうか? より正確な結果を得る方法はありますか?

私は自分のコードを調べましたが、stringこのように成長する可能性のあるコードは実際にはありません。この文字列が実際には私のコードの一部ではなく、ノードまたは Socket.IO モジュールの一部である可能性はありますか?

4

3 に答える 3

3

正しいアプローチ。StrongOps (以前の Nodefly) を使用してメモリをプロファイリングします。漏れているオブジェクトのタイプを分離します。ヒープの保持サイズとインスタンス数を確認します。安定したワークロードで増加するインスタンス数は、いくつかの喫煙銃を示します。

StrongOps は内部で memwatch と V8 プロファイラー/GC コードを使用していると思います。より良い自動化。リンクを参照してください - http://strongloop.com/node-js-performance/strongops/

次に、ノードヒープダンプ モジュールを使用しました。これは、共同創設者 (中心的な貢献者である Ben Noordhuis) が作成したもので、リークをコレクション オブジェクト、GC ルート、およびコード行に切り分けました。

Ben のブログを参照してください - http://strongloop.com/strongblog/how-to-heap-snapshots/

于 2014-01-30T05:50:52.263 に答える
0

Shubhra が示唆したように、メモリ リークの診断に役立つもう 1 つのツールは、StrongOps 監視のヒープ プロファイラーです。http://docs.strongloop.com/display/DOC/Setting+up+StrongOps+monitoringのいくつかの手順で簡単に開始できます。

ここに画像の説明を入力

これにより、ログを掘り下げる時間を節約し、時間の経過とともにアプリケーション ヒープで何が起こっているかを視覚的に把握できるだけでなく、メモリ リークを引き起こしている可能性のある他の原因と文字列を比較することもできます。

詳細については、http: //docs.strongloop.com/display/DOC/Profiling#Profiling-Memoryprofilerをご覧ください。

于 2014-01-30T18:52:07.173 に答える