Configurer la gestion de la mémoire de v8 pour qu’elle soit intelligente pour un processus node.js

Nous exécutons un serveur XMPP sur node.js, sur une machine disposant d’environ 3,8 Go de RAM. Voici les parameters de ligne de commande que nous passons lors de l’appel du noeud: / opt / node / bin / noeud –max-old-space-size = 3000 –trace-gc –trace-gc-verbose main.js

Cependant, nous devons souvent voir plus de 10 secondes de pause gc dans le processus (parfois jusqu’à plus de 1 minute, lorsque notre serveur ne fait que lancer GC). Lorsque cela se produit, notre processus consum normalement de la mémoire: environ 1 Go d’utilisation. Il y a environ 2 Go d’espace libre ou disponible pour le processus, mais le processus ne l’utilise pas et passe une minute à essayer de libérer de la mémoire.

En regardant la trace gc donnée par l’option –trace-gc-verbose, on dirait qu’environ 2 Go d’espace libre sont marqués comme “Espace object large” et ne sont pas utilisés, car il n’y a pas beaucoup d’objects volumineux. Et bien que le processus ait cruellement besoin de plus de mémoire pour les “anciens pointeurs” et le “vieil espace de données”, cette mémoire libre de “Large object space” n’est pas utilisée.

Voici la trace laissée par gc lors d’une de ces périodes où il y a eu une longue pause dans le processus:

    

 91635809 ms: balayer les repères 968,8 (1039,0) -> 958,5 (1038,0) Mo, 1/410 ms (+ 2287 ms en 79 étapes depuis le début du marquage, la plus grande étape 140,227051 ms) [notification inactive: finaliser incrémentielle] [GC dans l'ancienne espace demandé].  Allocateur de mémoire, utilisé: 1088446464, disponible: 2124390400 Nouvel espace, utilisé: 192, disponible: 8388416 Anciens pointeurs, utilisé: 633992112, disponible: 10460240, déchet: 0 Ancien espace de données, utilisé: 315819248, disponible: 14 5876, disponible: 149776, déchet: 0 Code espace utilisé: 5867936, disponible: 1271392, déchets: 0 Espace de carte, utilisé: 10257976, disponible: 6384072, déchets: 0 emplacement de cellule, utilisé: 175936, disponible: 954304, déchets: 0 grand espace de rangement, utilisé: 51413600, disponible : 2123325184 91636499 ms: Récupération 965.5 (1038.0) -> 964.6 (1038.0) Mo, 17 ms (+ 109 ms en 10 étapes depuis le dernier CPG) [Runtime :: PerformGC].  Allocateur de mémoire, utilisé: 1088446464, disponible: 2124390400 Nouvel espace, utilisé: 41256, disponible: 2055896 Anciens pointeurs, utilisé: 628458688, disponible: 15993664, déchet: 0 Ancien espace de données, utilisé: 315821792, disponible: 1499326, déchet: 0 Code espace utilisé: 5904256, disponible: 1235072, déchets: 0 Espace de carte, utilisé: 10263072, disponible: 6378976, déchets: 0 espace de cellule, utilisé: 175936, disponible: 954304, déchets: 0 grand espace de rangement, utilisé: 51413600, disponible : 2123325184 91637979 ms: Récupération 966.6 (1038.0) -> 964.7 (1038.0) Mo, 1 ms (+ 1404 ms en 43 étapes depuis le dernier CPG) [Runtime :: PerformGC].  Allocateur de mémoire, utilisé: 1088446464, disponible: 2124390400 Nouvel espace, utilisé: 76736, disponible: 2020416 Anciens pointeurs, utilisé: 628458688, disponible: 15993664, déchet: 0 Ancien espace de données, utilisé: 315845520, disponible: 123504, déchet: 0 Code espace utilisé: 5980576, disponible: 1158752, déchets: 0 Espace de carte, utilisé: 10271416, disponible: 6370632, déchets: 0 espace de cellules, utilisé: 175936, disponible: 954304, déchets: 0 grand espace d'objects, utilisé: 51413600, disponible : 2123325184 91639088 ms: Balayer le repère 965.2 (1038.0) -> 935.8 (1038.0) Mo, 1/369 ms (+ 2235 ms en 71 étapes depuis le début du marquage, étape la plus grande de 69,053955 ms) [notification inactive: incrémentation finale] [GC dans l'ancien espace demandé].  Allocateur de mémoire, utilisé: 1088446464, disponible: 2124390400 Nouvel espace, utilisé: 168, disponible: 2096984 Anciens pointeurs, utilisé: 641099768, disponible: 3352584, déchet: 0 Ancien espace de données, utilisé: 315820152, disponible: 14 5872, déchet: 0 Code espace utilisé: 5862976, disponible: 1276352, déchet: 0 espace de carte, utilisé: 10256744, disponible: 6385304, déchet: 0 espace de cellule, utilisé: 175936, disponible: 954304, déchet: 0 grand espace object, utilisé: 51413600, disponible : 2123325184 91640987 ms: Scavenge 966.4 (1038.0) -> 964.5 (1038.0) Mo, 1 ms (+ 1275 ms en 36 étapes depuis le dernier CPG) [échec d'allocation].  Allocateur de mémoire, utilisé: 1088446464, disponible: 2124390400 Nouvel espace, utilisé: 100944, disponible: 1996208 Anciens pointeurs, utilisé: 627957504, disponible: 16494848, déchet: 0 Ancien espace de données, utilisé: 315830536, disponible: 138488, déchet: 0 Code espace utilisé: 5951200, disponible: 1188128, déchets: 0 Espace de carte, utilisé: 10266376, disponible: 6375672, déchets: 0 emplacement de cellule, utilisé: 175936, disponible: 954304, déchets: 0 grand espace de rangement, utilisé: 51413600, disponible : 2123325184 91641560 ms: Récupération 966.5 (1038.0) -> 964.8 (1038.0) Mo, 2 ms (+ 481 ms en 29 étapes depuis le dernier CPG) [Runtime :: PerformGC].  Allocateur de mémoire, utilisé: 1088446464, disponible: 2124390400 Nouvel espace, utilisé: 180712, disponible: 1916440 Anciens pointeurs, utilisé: 627957504, disponible: 16494848, déchet: 0 Ancien espace de données, utilisé: 315871432, disponible: 495921432, disponible: 16494848, déchet: 0 Code espace utilisé: 6019392, disponible: 1119936, déchets: 0 Espace de carte, utilisé: 10269848, disponible: 6372200, déchets: 0 emplacement de cellule, utilisé: 176192, disponible: 954048, déchets: 0 grand espace object, utilisé: 51413600, disponible : 2123325184 91642589 ms: Balayage 965.9 (1038.0) -> 947.7 (1038.0) Mo, 1/371 ms (+ 2369 ms en 89 étapes depuis le début du marquage, la plus grande étape 67.302002 ms) [notification inactive: incrémentation finale] [GC dans l'ancien espace demandé].  Allocateur de mémoire, utilisé: 1088446464, disponible: 2124390400 Nouvel espace, utilisé: 264, disponible: 2096888 Anciens pointeurs, utilisé: 639592840, disponible: 4859512, déchet: 0 Ancien espace de données, utilisé: 315849408, disponible: 11 5816, déchet: 0 Code espace utilisé: 5862976, disponible: 1276352, déchet: 0 espace de carte, utilisé: 10257136, disponible: 6384912, déchet: 0 espace de cellule, utilisé: 175936, disponible: 954304, déchet: 0 grand espace object, utilisé: 51413600, disponible : 2123325184 91643688 ms: Récupération 966.4 (1038.0) -> 964.6 (1038.0) Mo, 5 ms (+ 356 ms en 21 étapes depuis le dernier CPG) [Runtime :: PerformGC].  Allocateur de mémoire, utilisé: 1088446464, disponible: 2124390400 Nouvel espace, utilisé: 144088, disponible: 1953064 Anciens pointeurs, utilisé: 627748368, disponible: 16703984, déchet: 0 Ancien espace de données, utilisé: 315864504, disponible: 10 5720, déchet: 0 Code espace utilisé: 5990240, disponible: 1149088, déchet: 0 Espace carte, utilisé: 10264248, disponible: 6377800, déchet: 0 espace de cellule, utilisé: 176192, disponible: 954048, déchet: 0 grand espace object, utilisé: 51413600, disponible : 2123325184 91645276 ms: Récupération 966,5 (1038.0) -> 964.8 (1039.0) Mo, 2 ms (+ 1520 ms en 46 étapes depuis le dernier GC) [échec d'allocation].  Allocateur de mémoire, utilisé: 1089495040, disponible: 2123341824 Nouvel espace, utilisé: 108192, disponible: 1988960 Anciens pointeurs, utilisé: 627748368, disponible: 16703984, déchet: 0 Ancien espace de données, utilisé: 315978760, disponible: 10 52200, disponible: 1022200, déchet: 0 Code espace utilisé: 6039008, disponible: 1100320, déchet: 0 Espace de carte, utilisé: 10274216, disponible: 6367832, déchet: 0 espace de cellule, utilisé: 176192, disponible: 954048, déchet: 0 grand espace object, utilisé: 51413600, disponible : 2122276608 91645577 ms: Récupération 966.6 (1039.0) -> 965.8 (1039.0) Mo, 3 ms (+ 263 ms en 23 étapes depuis le dernier GC) [erreur d'allocation].  Allocateur de mémoire, utilisé: 1089495040, disponible: 2123341824 Nouvel espace, utilisé: 516168, disponible: 1580984 Anciens pointeurs, utilisé: 627843088, disponible: 16609264, déchet: 0 Ancien espace de données, utilisé: 316550680, disponible: 450708, déchet: 0 Code espace utilisé: 6039008, disponible: 1100320, déchet: 0 Espace de carte, utilisé: 10275280, disponible: 6366768, déchet: 0 espace de cellule, utilisé: 176192, disponible: 954048, déchet: 0 grand espace object, utilisé: 51413600, disponible : 2122276608 91645645 ms: Récupération 967.3 (1039.0) -> 966.8 (1039.0) Mo, 5 ms (+ 8 ms depuis 16 étapes depuis la dernière GC) [échec d'allocation].  Allocateur de mémoire, utilisé: 1089495040, disponible: 2123341824 Nouvel espace, utilisé: 1012304, disponible: 3182000 Anciens pointeurs, utilisé: 627968088, disponible: 16484264, déchet: 0 Ancien espace de données, utilisé: 316947304, disponible: 53656, déchet: 0 Code espace utilisé: 6039008, disponible: 1100320, déchet: 0 Espace de carte, utilisé: 10275280, disponible: 6366768, déchet: 0 espace de cellule, utilisé: 176192, disponible: 954048, déchet: 0 grand espace object, utilisé: 51413600, disponible : 2122276608 91645948 ms: Scavenge 969.8 (1039.0) -> 968.6 (1041.0) Mo, 9 ms (+ 188 ms en 35 étapes depuis le dernier GC) [erreur d'allocation].  Allocateur de mémoire, utilisé: 1091592192, disponible: 2121244672 Nouvel espace, utilisé: 1032320, disponible: 3161984 Anciens pointeurs, utilisé: 628219008, disponible: 16233344, déchet: 0 Ancien espace de données, utilisé: 318537928, disponible: 526904, déchet: 0 Code espace utilisé: 6039264, disponible: 1100064, déchet: 0 espace de carte, utilisé: 10276232, disponible: 6365816, déchet: 0 espace de cellule, utilisé: 176192, disponible: 954048, déchet: 0 grand espace object, utilisé: 51413600, disponible : 2120179456 91646093 ms: Récupération 971.6 (1041.0) -> 970.5 (1042.0) Mo, 13 ms (+ 36 ms en 30 étapes depuis le dernier CPG) [Runtime :: PerformGC].  Allocateur de mémoire, utilisé: 1092640768, disponible: 2120196096 Nouvel espace, utilisé: 2044456, disponible: 6344152 Anciens pointeurs, utilisé: 628437424, disponible: 16014928, déchet: 0 Ancien espace de données, utilisé: 319366376, disponible: 730392, déchet: 0 Code espace utilisé: 6039264, disponible: 1100064, déchet: 0 espace de carte, utilisé: 10276232, disponible: 6365816, déchet: 0 espace de cellule, utilisé: 176192, disponible: 954048, déchet: 0 grand espace object, utilisé: 51413600, disponible : 2119130880 91646306 ms: Récupération 976.5 (1042.0) -> 974.7 (1044.0) Mo, 1/14 ms (+ 114 ms depuis la dernière GC) [erreur d'allocation].  Allocateur de mémoire, utilisé: 1094737920, disponible: 2118098944 Nouvel espace, utilisé: 2064112, disponible: 6324496 Anciens pointeurs, utilisé: 630440024, disponible: 14012328, déchet: 0 Ancien espace de données, utilisé: 321653384, disponible: 5016256, gaspillage: 0 Code espace utilisé: 6055936, disponible: 1083392, déchet: 0 espace de carte, utilisé: 10278192, disponible: 6363856, déchet: 0 espace de cellule, utilisé: 176192, disponible: 954048, déchet: 0 grand espace de travail, utilisé: 51413600, disponible : 2117033728 91646386 ms: Récupération 980.6 (1044.0) -> 979.2 (1046.0) Mo, 12 ms (+ 10 ms par 64 pas depuis le dernier CPG) [échec d'allocation].  Allocateur de mémoire, utilisé: 1096835072, disponible: 2116001792 Nouvel espace, utilisé: 4127736, disponible: 12649480 Anciens pointeurs, utilisé: 631182984, disponible: 13269368, déchet: 0 Ancien espace de données, utilisé: 323586008, disponible: 6335504, déchet: 0 Code espace utilisé: 6055936, disponible: 1083392, déchet: 0 espace de carte, utilisé: 10278192, disponible: 6363856, déchet: 0 espace de cellule, utilisé: 176192, disponible: 954048, déchet: 0 grand espace de travail, utilisé: 51413600, disponible : 2114936576 Nouvel espace limité en raison du taux de promotion élevé: 1 Mo 91646810 ms: Balayage des marques 979,2 (1046.0) -> 973,2 (1049,0) Mo, 1/422 ms (+ 2500 ms sur 303 étapes depuis le début du marquage, la plus grande étape 0,122070 ms) [demande StackGuard GC] [GC demandé dans l'ancien espace].  Allocateur de mémoire, utilisé: 1099980800, disponible: 2112856064 Nouvel espace, utilisé: 192, disponible: 1048384 Anciens pointeurs, utilisé: 636894816, disponible: 9621408, déchet: 0 Ancien espace de données, utilisé: 325256448, disponible: 0, déchet: 0 Code espace utilisé: 5860928, disponible: 1278400, déchets: 0 Espace de carte, utilisé: 10257976, disponible: 6384072, déchets: 0 espace de cellules, utilisé: 176192, disponible: 954048, déchets: 0 grand espace de rangement, utilisé: 51413600, disponible : 2111790848 91646825 ms: Récupération 974,2 (1049.0) -> 979,0 (1049,0) Mo, 7 ms [erreur d'allocation].  Allocateur de mémoire, utilisé: 1099980800, disponible: 2112856064 Nouvel espace, utilisé: 257960, disponible: 790616 Anciens pointeurs, utilisé: 635948464, disponible: 10567760, déchet: 0 Ancien espace de données, utilisé: 325256448, disponible: 0, déchet: 0 Code espace utilisé: 5873440, disponible: 1265888, déchet: 0 espace de carte, utilisé: 10258536, disponible: 6383512, déchet: 0 espace de cellule, utilisé: 176192, disponible: 954048, déchet: 0 grand espace object, utilisé: 51413600, disponible : 2111790848 91646834 ms: Récupération 979,7 (1049,0) -> 980,0 (1049,0) Mo, 2 ms [erreur d'allocation].  Allocateur de mémoire, utilisé: 1099980800, disponible: 2112856064 Nouvel espace, utilisé: 257968, disponible: 790608 Anciens pointeurs, utilisé: 635671408, disponible: 10844816, déchet: 0 Ancien espace de données, utilisé: 325256448, disponible: 0, déchet: 0 Code espace utilisé: 5873440, disponible: 1265888, déchet: 0 espace de carte, utilisé: 10258536, disponible: 6383512, déchet: 0 espace de cellule, utilisé: 176192, disponible: 954048, déchet: 0 grand espace object, utilisé: 51413600, disponible : 2111790848 91646842 ms: Récupération 980,7 (1049,0) -> 980,6 (1049,0) Mo, 2 ms [erreur d'allocation].  Allocateur de mémoire, utilisé: 1099980800, disponible: 2112856064 Nouvel espace, utilisé: 257960, disponible: 790616 Anciens pointeurs, utilisé: 635493872, disponible: 11022352, déchet: 0 Ancien espace de données, utilisé: 325256448, disponible: 0, déchet: 0 Code espace utilisé: 5873440, disponible: 1265888, déchet: 0 espace de carte, utilisé: 10258536, disponible: 6383512, déchet: 0 espace de cellule, utilisé: 176192, disponible: 954048, déchet: 0 grand espace object, utilisé: 51413600, disponible : 2111790848 91646849 ms: Récupération 981.3 (1049.0) -> 981.2 (1049.0) Mo, 1 ms [erreur d'allocation].  Allocateur de mémoire, utilisé: 1099980800, disponible: 2112856064 Nouvel espace, utilisé: 257968, disponible: 790608 Anciens pointeurs, utilisé: 635981640, disponible: 10534584, déchet: 0 Ancien espace de données, utilisé: 325256448, disponible: 0, déchet: 0 Code espace utilisé: 5873440, disponible: 1265888, déchet: 0 espace de carte, utilisé: 10258536, disponible: 6383512, déchet: 0 espace de cellule, utilisé: 176192, disponible: 954048, déchet: 0 grand espace object, utilisé: 51413600, disponible : 2111790848 91646863 ms: Scavenge 981.9 (1049.0) -> 981.6 (1051.0) Mo, 1 ms [erreur d’atsortingbution].  Allocateur de mémoire, utilisé: 1102077952, disponible: 2110758912 Nouvel espace, utilisé: 257960, disponible: 790616 Anciens pointeurs, utilisé: 637013288, disponible: 10534872, déchet: 0 Ancien espace de données, utilisé: 326288384, disponible: 0, déchet: 0 Code espace utilisé: 5873440, disponible: 1265888, déchet: 0 espace de carte, utilisé: 10258536, disponible: 6383512, déchet: 0 espace de cellule, utilisé: 176192, disponible: 954048, déchet: 0 grand espace object, utilisé: 51413600, disponible : 2109693696 91651639 ms: Balayer le repère 981,6 (1051,0) -> 924,7 (1051,0) Mo, 1/4775 ms [dernier recours gc].  Allocateur de mémoire, utilisé: 1102077952, disponible: 2110758912 Nouvel espace, utilisé: 96, disponible: 1048480 Anciens pointeurs, utilisé: 626794192, disponible: 20753968, déchet: 0 Ancien espace de données, utilisé: 275760200, disponible: 50528184, déchet: 0 Code espace utilisé: 6182208, disponible: 957120, déchet: 0 espace de carte, utilisé: 10257808, disponible: 6384240, déchet: 0 espace de cellule, utilisé: 176192, disponible: 954048, déchet: 0 grand espace object, utilisé: 51413600, disponible : 2109693696 91663655 ms: Balayer le repère 924,7 (1051,0) -> 924,7 (1050,0) Mo, 1/12015 ms [dernier recours gc].  Allocateur de mémoire, utilisé: 1101029376, disponible: 2111807488 Nouvel espace, utilisé: 0, disponible: 1048576 Anciens pointeurs, utilisé: 626169464, disponible: 21378696, déchet: 0 Ancien espace de données, utilisé: 275759960, disponible: 49756488, déchet: 0 Code espace utilisé: 5850624, disponible: 1288704, déchets: 0 Espace de carte, utilisé: 10257808, disponible: 6384240, déchets: 

Est-ce que je peux faire un réglage pour mieux configurer la gestion de la mémoire de v8? Des idées sur ce qui pourrait aider ici?

Je pense que c’est une limitation de V8. Il n’utilise pas plus de 1,7 Go de RAM sur les ordinateurs 64 bits. Citation de FAQ :

Actuellement, par défaut, la v8 a une limite de mémoire de 512 Mo sur les systèmes 32 bits et de 1 Go sur les systèmes 64 bits. La limite peut être augmentée en définissant –max-old-space-size sur ~ 1 Go (32 bits) et ~ 1,7 Go (64 bits) au maximum, mais il est recommandé de fractionner votre processus unique en plusieurs utilisateurs. si vous atteignez les limites de la mémoire.

Par conséquent, vous respectez les limites de mémoire maximales et la pause de 10 secondes due à la récupération de place est un gros problème. Vous devez envisager d’exécuter le ramasse-miettes régulièrement / lorsqu’il est inactif pour éviter de dépasser la limite et de faire face à de longs délais.

Les parameters que vous pouvez transmettre pour améliorer la situation sont les suivants: (Consultez ce blog )

  • --nouse-idle-notification qui empêche de faire fonctionner le CPG constamment et
  • --expose-gc qui vous permettra d’exécuter GC à partir de votre code.

Plus important encore, déboguez votre code pour éliminer les memory leaks. Utilisez ces paquets pour les trouver dans votre code:

  • nodetime
  • inspecteur de noeuds