5

node.js アプリで発生する、非常に遅いが永続的なネイティブ メモリ リークを突き止めようとしましたが、戦略が尽きてしまいました。

プロセスにはレベル ヒープのように見えるものがありますが、数時間と数日が経過するにつれて、node.js プロセスの RSS はゆっくりと大きくなります。このプロセスは、異なるパラメーターに対して同じタイプのジョブを何度も実行するジョブ ハンドラーです。プロセスの RSS の増加は、実行されたジョブの累積数をプロットした線と同じ形をとっているため、ジョブの実行ごとに多少のメモリ リークが発生しています。

ヒープは多かれ少なかれ一定であるため、標準のヒープ検査ツールはあまり役に立たないようです。

メモリ消費量の例を次に示します。

数日間のメモリ使用量

現在、ノード 0.8.7 で実行されています。各ジョブは、多数のデータベースの読み取り/書き込みを行い、redis インスタンスと通信し、mikael/request を使用していくつかの Web 要求を行います。

4

1 に答える 1

2

最新のリリースに更新しましたか?

誰もがそう言っていることは知っています:)、私は、問題があると思われるときに、本番サーバーで2週間ごとにnode.jsのバージョンを更新するバンドワゴンに参加する必要があると感じました. 素晴らしいアイデアですね。

だから私は同じことを考えていました.私はいくつかのnode.jsプロジェクトを数ヶ月間管理しています(そして昨年書いたものもあります). V8 エンジンまたはノード アプリケーションが非常にゆっくりとメモリを消費し、決して解放しないようです。(時々再起動するだけで十分遅い)

これは、特に RSS メモリを解放するか、最終的にピークアウトする必要があることを考えると、非常にストレスがかかります。

ランタイム内でリークしているオブジェクト(つまり、javascript オブジェクト、関数など) を追跡することに興味がある場合は、mozilla に、メモリ リークの追跡に関する非常に完全なブログ投稿と、使用できるプロジェクトへのリンクがいくつかあります。これを行う。

なんらかの理由で、彼らはこれをリストに載せていません。(それは十分に単純に思えます。私は自分のプロジェクトで試してみて、それが機能するかどうかを確認しています.V8ベースのものを正しくコンパイルできない傾向があります)

heapdumpここにハウツーガイドへのリンクがあります


私自身の経験からすると、V8 エンジンはメモリを割り当て、後でまったく同じメモリ チャンクが必要になる場合に備えて保持しているようです。Node.jsを3年ほど愛用している兄も同じことを見たことがあります。

また、完全を期すために (既にお持ちだと思います)、V8 内でメモリ リークが発生していないことを確認したい場合は、joyent のエンジニアがV8 のメモリ リークを追跡する方法についてかなりまともな記事を書いています。

于 2013-10-21T17:16:00.757 に答える