configurationv8的内存pipe理对于node.js进程来说是明智的

我们在node.js上运行一台XMPP服务器,这台服务器的内存大约为3.8 GB。 以下是我们在调用节点时传递的命令行参数:/ opt / node / bin / node –max-old-space-size = 3000 –trace-gc –trace -gc-verbose main.js

但是,我们经常需要在这个过程中看到超过10秒的gc暂停(有时甚至超过1分钟gc暂停,我们的服务器除了运行GC之外什么都不做)。 发生这种情况时,我们的过程就是正常的内存消耗:大约1 GB的堆使用率。 这个过程大约有2GB或者可用空间,但是这个过程并没有使用它,花了一分钟的时间来释放内存。

看看由-trace-gc-verbose选项给出的gc trace,看起来大约有2 GB的可用空间被标记为“大对象空间”,并没有被使用,因为没有那么多的大对象。 虽然这个过程迫切需要更多的“旧指针”和“旧数据空间”的内存,但是这个“大对象空间”中的空闲内存没有被使用。

这是gc在这个过程中长时间停顿的时间之一留下的痕迹:

    

 91635809 ms:标记扫描968.8(1039.0) - > 958.5(1038.0)MB,1/410 ms(自标记开始以来的79个步骤中+ 2287 ms,最大步骤140.227051 ms)[idle notification:finalize incremental]请求的空间]。
内存分配器,使用:1088446464,可用:2124390400
新的空间,使用:192,可用:8388416
老指针,使用:633992112,可用:10460240,浪费:0
旧的数据空间,使用:315819248,可用:149776,浪费:0
代码空间,使用:5867936,可用:1271392,浪费:0
使用的地图空间:10257976,可用:6384072,浪费:0
单元格空间使用:175936,可用:954304,浪费:0
大对象空间,使用:51413600,可用:2123325184
 91636499 ms:清除965.5(1038.0) - > 964.6(1038.0)MB,17 ms(从上次GC开始的10个步骤中为+ 109 ms)[Runtime :: PerformGC]。
内存分配器,使用:1088446464,可用:2124390400
新的空间,使用:41256,可用:2055896
老指针,使用:628458688,可用:15993664,浪费:0
旧的数据空间,使用:315821792,可用:147232,浪费:0
使用的代码空间:5904256,可用:1235072,浪费:0
地图空间,使用:10263072,可用:6378976,浪费:0
单元格空间使用:175936,可用:954304,浪费:0
大对象空间,使用:51413600,可用:2123325184
 91637979 ms:清除966.6(1038.0) - > 964.7(1038.0)MB,1 ms(自上次GC以来的43个步骤中为+ 1404 ms)[Runtime :: PerformGC]。
内存分配器,使用:1088446464,可用:2124390400
新的空间,使用:76736,可用:2020416
老指针,使用:628458688,可用:15993664,浪费:0
旧数据空间,使用:315845520,可用:123504,浪费:0
使用的代码空间:5980576,可用:1158752,浪费:0
使用的地图空间:10271416,可用:6370632,浪费:0
单元格空间使用:175936,可用:954304,浪费:0
大对象空间,使用:51413600,可用:2123325184
 91639088 ms:标记扫描965.2(1038.0) - > 935.8(1038.0)MB,1/369 ms(从开始标记开始,以71个步骤+ 2235 ms,最大步骤69.053955 ms)[idle notification:finalize incremental]请求的空间]。
内存分配器,使用:1088446464,可用:2124390400
新的空间,使用:168,可用:2096984
老指针,使用:641099768,可用:3352584,浪费:0
旧的数据空间,使用:315820152,可用:148872,浪费:0
代码空间,使用:5862976,可用:1276352,浪费:0
使用的地图空间:10256744,可用:6385304,浪费:0
单元格空间使用:175936,可用:954304,浪费:0
大对象空间,使用:51413600,可用:2123325184
 91640987 ms:清除966.4(1038.0) - > 964.5(1038.0)MB,1 ms(自上次GC后36个步骤中的+ 1275 ms)[分配失败]。
内存分配器,使用:1088446464,可用:2124390400
新的空间,使用:100944,可用:1996208
老指针,使用:627957504,可用:16494848,浪费:0
旧的数据空间,使用:315830536,可用:138488,浪费:0
代码空间,使用:5951200,可用:1188128,浪费:0
使用的地图空间:10266376,可用:6375672,浪费:0
单元格空间使用:175936,可用:954304,浪费:0
大对象空间,使用:51413600,可用:2123325184
 91641560 ms:清除966.5(1038.0) - > 964.8(1038.0)MB,2 ms(自上次GC以来的29个步骤中为+ 481 ms)[Runtime :: PerformGC]。
内存分配器,使用:1088446464,可用:2124390400
新的空间,使用:180712,可用:1916440
老指针,使用:627957504,可用:16494848,浪费:0
旧的数据空间,使用:315871432,可用:97592,浪费:0
代码空间,使用:6019392,可用:1119936,浪费:0
使用的地图空间:10269848,可用:6372200,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2123325184
 91642589 ms:标记扫描965.9(1038.0) - > 947.7(1038.0)MB,1/371 ms(从开始标记开始的89个步骤中+ 2369 ms,最大步骤67.302002 ms)[idle notification:finalize incremental]请求的空间]。
内存分配器,使用:1088446464,可用:2124390400
新的空间,使用:264,可用:2096888
老指针,使用:639592840,可用:4859512,浪费:0
旧的数据空间,使用:315849408,可用:119616,浪费:0
代码空间,使用:5862976,可用:1276352,浪费:0
使用的地图空间:10257136,可用:6384912,浪费:0
单元格空间使用:175936,可用:954304,浪费:0
大对象空间,使用:51413600,可用:2123325184
 91643688 ms:清除966.4(1038.0) - > 964.6(1038.0)MB,5 ms(自上一个GC以来的21个步骤中的+ 356 ms)[Runtime :: PerformGC]。
内存分配器,使用:1088446464,可用:2124390400
新的空间,使用:144088,可用:1953064
老指针,使用:627748368,可用:16703984,浪费:0
旧的数据空间,使用:315864504,可用:104520,浪费:0
代码空间,使用:5990240,可用:1149088,浪费:0
使用的地图空间:10264248,可用:6377800,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2123325184
 91645276 ms:清除966.5(1038.0) - > 964.8(1039.0)MB,2 ms(从上次GC开始的46个步骤中+ 1520 ms)[分配失败]。
内存分配器,使用:1089495040,可用:2123341824
新的空间,使用:108192,可用:1988960
老指针,使用:627748368,可用:16703984,浪费:0
旧的数据空间,使用:315978760,可用:1022200,浪费:0
代码空间,使用:6039008,可用:1100320,浪费:0
使用的地图空间:10274216,可用:6367832,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2122276608
 91645577 ms:清除966.6(1039.0) - > 965.8(1039.0)MB,3 ms(自上次GC后23个步骤中+ 263 ms)[分配失败]。
内存分配器,使用:1089495040,可用:2123341824
新的空间,使用:516168,可用:1580984
老指针,使用:627843088,可用:16609264,浪费:0
旧数据空间,使用:316550680,可用:450280,浪费:0
使用的代码空间:6039008,可用:1100320,浪费:0
地图空间,使用:10275280,可用:6366768,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2122276608
 91645645 ms:清除967.3(1039.0) - > 966.8(1039.0)MB,5 ms(自上次GC以来的16个步骤中为+ 8 ms)[分配失败]。
内存分配器,使用:1089495040,可用:2123341824
新的空间,使用:1012304,可用:3182000               
老指针,使用:627968088,可用:16484264,浪费:0
旧数据空间,使用:316947304,可用:53656,浪费:0
使用的代码空间:6039008,可用:1100320,浪费:0
地图空间,使用:10275280,可用:6366768,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2122276608
 91645948 ms:清除969.8(1039.0) - > 968.6(1041.0)MB,9 ms(从上次GC开始的35个步骤中为+ 188 ms)[分配失败]。
内存分配器,使用:1091592192,可用:2121244672
新的空间,使用:1032320,可用:3161984
老指针,使用:628219008,可用:16233344,浪费:0
旧的数据空间,使用:318537928,可用:526904,浪费:0
使用的代码空间:6039264,可用:1100064,浪费:0
使用的地图空间:10276232,可用:6365816,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2120179456
 91646093 ms:清除971.6(1041.0) - > 970.5(1042.0)MB,13 ms(自上次GC起30个步骤中的+ 36 ms)[Runtime :: PerformGC]。
内存分配器,使用:1092640768,可用:2120196096
新空间,使用:2044456,可用:6344152
老指针,使用:628437424,可用:16014928,浪费:0
旧的数据空间,使用:319366376,可用:730392,浪费:0
使用的代码空间:6039264,可用:1100064,浪费:0
使用的地图空间:10276232,可用:6365816,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2119130880
 91646306 ms:清除976.5(1042.0) - > 974.7(1044.0)MB,1/14 ms(从上次GC开始的67个步骤中为+ 114 ms)[分配失败]。
内存分配器,使用:1094737920,可用:2118098944
新的空间,使用:2064112,可用:6324496
旧的指针,使用:630440024,可用:14012328,浪费:0
旧的数据空间,使用:321653384,可用:507256,浪费:0
代码空间,使用:6055936,可用:1083392,浪费:0
使用的地图空间:10278192,可用:6363856,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2117033728
 91646386 ms:清除980.6(1044.0) - > 979.2(1046.0)MB,12 ms(自上次GC以来的64个步骤中为+ 10 ms)[分配失败]。
内存分配器,使用:1096835072,可用:2116001792
新的空间,使用:4127736,可用:12649480
老指针,使用:631182984,可用:13269368,浪费:0
旧数据空间,使用:323586008,可用:638504,浪费:0
代码空间,使用:6055936,可用:1083392,浪费:0
使用的地图空间:10278192,可用:6363856,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2114936576
由于较高的升级率,有限的新空间大小:1 MB
 91646810 ms:标记扫描979.2(1046.0) - > 973.2(1049.0)MB,1/422 ms(从开始标记开始,在303步中为+ 2500 ms,最大步长为0.122070 ms)[StackGuard GC请求] ]。
内存分配器,使用:1099980800,可用:2112856064
新的空间,使用:192,可用:1048384
老指针,使用:636894816,可用:9621408,浪费:0
旧数据空间,使用:325256448,可用:0,浪费:0
使用的代码空间:5860928,可用:1278400,浪费:0
使用的地图空间:10257976,可用:6384072,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2111790848
 91646825 ms:清除974.2(1049.0) - > 979.0(1049.0)MB,7 ms [分配失败]。
内存分配器,使用:1099980800,可用:2112856064
新的空间,使用:257960,可用:790616
老指针,使用:635948464,可用:10567760,浪费:0
旧数据空间,使用:325256448,可用:0,浪费:0
代码空间,使用:5873440,可用:1265888,浪费:0
使用的地图空间:10258536,可用:6383512,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2111790848
 91646834 ms:清除979.7(1049.0) - > 980.0(1049.0)MB,2 ms [分配失败]。
内存分配器,使用:1099980800,可用:2112856064
新的空间,使用:257968,可用:790608
老指针,使用:635671408,可用:10844816,浪费:0
旧数据空间,使用:325256448,可用:0,浪费:0
使用的代码空间:5873440,可用:1265888,浪费:0
使用的地图空间:10258536,可用:6383512,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2111790848
 91646842 ms:清除980.7(1049.0) - > 980.6(1049.0)MB,2 ms [分配失败]。
内存分配器,使用:1099980800,可用:2112856064
新的空间,使用:257960,可用:790616
老指针,使用:635493872,可用:11022352,浪费:0
旧数据空间,使用:325256448,可用:0,浪费:0
代码空间,使用:5873440,可用:1265888,浪费:0
使用的地图空间:10258536,可用:6383512,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2111790848
 91646849 ms:清除981.3(1049.0) - > 981.2(1049.0)MB,1 ms [分配失败]。
内存分配器,使用:1099980800,可用:2112856064
新的空间,使用:257968,可用:790608
老指针,使用:635981640,可用:10534584,浪费:0
旧数据空间,使用:325256448,可用:0,浪费:0
使用的代码空间:5873440,可用:1265888,浪费:0
使用的地图空间:10258536,可用:6383512,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2111790848
 91646863 ms:清除981.9(1049.0) - > 981.6(1051.0)MB,1 ms [分配失败]。
内存分配器,使用:1102077952,可用:2110758912
新的空间,使用:257960,可用:790616
老指针,使用:637013288,可用:10534872,浪费:0
旧数据空间,使用:326288384,可用:0,浪费:0
代码空间,使用:5873440,可用:1265888,浪费:0
使用的地图空间:10258536,可用:6383512,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2109693696
 91651639 ms:标记扫描981.6(1051.0) - > 924.7(1051.0)MB,1/4775 ms [最后手段gc]。
内存分配器,使用:1102077952,可用:2110758912
新空间,使用:96,可用:1048480
老指针,使用:626794192,可用:20753968,浪费:0
旧数据空间,使用:275760200,可用:50528184,浪费:0
代码空间,使用:6182208,可用:957120,浪费:0
使用的地图空间:10257808,可用:6384240,浪费:0
单元格空间使用:176192,可用:954048,浪费:0
大对象空间,使用:51413600,可用:2109693696
 91663655 ms:标记扫描924.7(1051.0) - > 924.7(1050.0)MB,1/12015 ms [最后手段gc]。
内存分配器,使用:1101029376,可用:2111807488
新的空间,使用:0,可用:1048576
老指针,使用:626169464,可用:21378696,浪费:0
旧数据空间,使用:275759960,可用:49496488,浪费:0
代码空间,使用:5850624,可用:1288704,浪费:0
使用的地图空间:10257808,可用:6384240,浪费:                 


有什么调整,我可以做更好地configurationV8的内存pipe理? 任何想法可能有帮助吗?

我认为这是V8的限制。 它不会在64位机器上使用超过1.7 GB的RAM。 从常见问题引用:

目前,默认情况下,v8在32位系统上具有512mb的内存限制,在64位系统上具有1gb的内存限制。 通过将-max-old-space-size设置为最大值〜1GB(32位)和〜1.7GB(64位),可以提高限制,但build议您将单个进程拆分为多个工人如果你正在打内存限制。

所以在这之后,你正在达到最大内存限制,因垃圾回收而停下来的10秒暂停是一个大问题。 您应该考虑定期/闲置时运行垃圾回收器,以避免达到极限并面临长时间的延迟。

你可以通过的参数来帮助你的情况是:(查看这个博客 )

  • --nouse-idle-notification防止不间断地运行GC的--nouse-idle-notification
  • --expose-gc这将允许你从你的代码运行GC。

最重要的是debugging你的代码,以消除内存泄漏。 使用这些包在代码中find它们:

  • nodetime
  • 节点检查