14

何もしないサーバーでnodejsv8メモリのプロファイルを作成しようとしています。node-memwatchを使用してヒープ差分を取得しました。接続前と接続が切断された後、ヒープ情報を収集します。node-memwatchを使用しました。クライアント側から200の同時接続を試しました。

これは、接続が切断された後のgcトレースです。

誰かが私が理解するのを手伝ってくれる?

1.なぜメモリが増加するのですか?接続が切断された後、サーバーはまったく何もしていません。ゴミが溜まっているのでいつも落とすのではないでしょうか?
2.それらの割り当ての失敗は何ですか?ここでトレースを実際に解釈するにはどうすればよいですか?

 15802 ms: Mark-sweep 8.9 (45.0) -> 8.1 (45.0) MB, 58 ms [allocation failure] [GC in old space forced by flags].
 16144 ms: Mark-sweep 9.2 (45.0) -> 8.4 (45.0) MB, 53 ms [allocation failure] [GC in old space forced by flags].
 16495 ms: Mark-sweep 9.5 (45.0) -> 8.7 (46.0) MB, 60 ms [allocation failure] [GC in old space forced by flags].
 16837 ms: Mark-sweep 9.8 (46.0) -> 9.0 (46.0) MB, 56 ms [allocation failure] [GC in old space forced by flags].
 17197 ms: Mark-sweep 10.1 (46.0) -> 9.4 (46.0) MB, 62 ms [allocation failure] [GC in old space forced by flags].
 17905 ms: Mark-sweep 11.5 (46.0) -> 10.0 (47.0) MB, 74 ms [Runtime::PerformGC] [GC in old space forced by flags].                                                               
 18596 ms: Mark-sweep 12.2 (47.0) -> 10.7 (47.0) MB, 75 ms [Runtime::PerformGC] [GC in old space forced by flags].
 19315 ms: Mark-sweep 12.8 (47.0) -> 11.3 (48.0) MB, 83 ms [allocation failure] [GC in old space forced by flags].
 20035 ms: Mark-sweep 13.4 (48.0) -> 12.0 (49.0) MB, 90 ms [Runtime::PerformGC] [GC in old space forced by flags].
 21487 ms: Mark-sweep 16.0 (49.0) -> 13.2 (50.0) MB, 96 ms [Runtime::PerformGC] [GC in old space forced by flags].
 22950 ms: Mark-sweep 17.3 (50.0) -> 14.5 (52.0) MB, 116 ms [Runtime::PerformGC] [GC in old space forced by flags].
 24376 ms: Mark-sweep 18.8 (52.0) -> 15.9 (53.0) MB, 114 ms [allocation failure] [GC in old space forced by flags].
 25849 ms: Mark-sweep 19.9 (53.0) -> 17.2 (54.0) MB, 129 ms [Runtime::PerformGC] [GC in old space forced by flags].
 28773 ms: Mark-sweep 25.2 (54.0) -> 19.7 (57.0) MB, 149 ms [allocation failure] [GC in old space forced by flags].
 31725 ms: Mark-sweep 27.7 (57.0) -> 22.2 (59.0) MB, 172 ms [Runtime::PerformGC] [GC in old space forced by flags].
 34678 ms: Mark-sweep 30.2 (59.0) -> 24.7 (61.0) MB, 190 ms [Runtime::PerformGC] [GC in old space forced by flags].
 44045 ms: Mark-sweep 28.4 (61.0) -> 25.8 (63.0) MB, 180 ms [idle notification] [GC in old space forced by flags].
 44216 ms: Mark-sweep 25.8 (63.0) -> 25.8 (63.0) MB, 170 ms [idle notification] [GC in old space requested].
 57471 ms: Mark-sweep 26.9 (63.0) -> 25.8 (62.0) MB, 167 ms [Runtime::PerformGC] [GC in old space forced by flags].
 57651 ms: Mark-sweep 26.8 (62.0) -> 25.5 (62.0) MB, 160 ms [Runtime::PerformGC] [GC in old space forced by flags].
 57828 ms: Mark-sweep 26.5 (62.0) -> 25.5 (62.0) MB, 159 ms [Runtime::PerformGC] [GC in old space forced by flags].

ありがとう、

4

2 に答える 2

6

「割り当ての失敗」は非常に劇的に聞こえますが、実際の失敗はありません。これは、メモリを大量に割り当てたため、メモリを収集できるかどうかを確認するためにGCを実行するときが来たことを意味します。

--gc-globalフラグ(「フラグによって強制されたGC」)を使用して実行しているようです。これは本番環境では悪い考えですが、デバッグ時に問題を絞り込むのには問題ないかもしれません。

プロセスがリークしている理由がわかりません。ヒーププロファイラーが役立つ場合があります。https://github.com/felixge/node-memory-leak-tutorialを参照してください

于 2012-12-20T08:09:12.800 に答える
2

コードによると:

PrintF("%s %.1f (%.1f) -> %.1f (%.1f) MB, ",
       CollectorString(),
       static_cast<double>(start_object_size_) / MB,                                                                                    
       static_cast<double>(start_memory_size_) / MB, 
       SizeOfHeapObjects(),
       end_memory_size_mb);

gcが開始されると、各行は1つのgcになります。

start_object_size_ = heap_->SizeOfObjects();

gcの要約:

PrintF("total_size_before=%" V8_PTR_PREFIX "d ", start_object_size_);                                                                   
PrintF("total_size_after=%" V8_PTR_PREFIX "d ", heap_->SizeOfObjects());

アプリがアイドル状態のときにstart_object_size_が増加する理由については、おそらくgcの間に、一部のオブジェクトが古いスペースに昇格し、古いスペースのオブジェクトサイズが増加したと推測しています。

于 2013-01-08T05:48:23.537 に答える