странная нехватка узлов памяти

#node.js #memory-leaks #heap-memory

#node.js #утечки памяти #куча-память

Вопрос:

Мой сервер узлов время от времени получает кучу из памяти. Я так старался отладить, но проблема все та же. Я получаю эту ошибку

 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
4|app |  1: node::Abort() [node /home/app/server.js]
4|app |  2: 0x1356bec [node /home/app/server.js]
4|app |  3: v8::Utils::ReportOOMFailure(char const*, bool) [node /home/app/server.js]
4|app |  4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [node /home/app/server.js]
4|app |  5: v8::internal::Factory::NewFixedArray(int, v8::internal::PretenureFlag) [node /home/app/server.js]
4|app |  6: v8::internal::OrderedHashTable<v8::internal::OrderedHashSet, 1>::Allocate(v8::internal::Isolate*, int, v8::internal::PretenureFlag) [node /home/app/server.js]
4|app |  7: v8::internal::OrderedHashTable<v8::internal::OrderedHashSet, 1>::Rehash(v8::internal::Handle<v8::internal::OrderedHashSet>, int) [node /home/app/server.js]
4|app |  8: v8::internal::OrderedHashTable<v8::internal::OrderedHashSet, 1>::EnsureGrowable(v8::internal::Handle<v8::internal::OrderedHashSet>) [node /home/app/server.js]
4|app |  9: v8::internal::Runtime_SetGrow(int, v8::internal::Object**, v8::internal::Isolate*) [node /home/app/server.js]
4|app | 10: 0x7a8879046fd
  

также иногда эта ошибка

 4|app | <--- Last few GCs --->
4|app |
4|app | [11385:0x2b893d0]   764692 ms: Mark-sweep 1398.5 (1871.3) -> 1398.5 (1871.3) MB, 27920.5 / 2.1 ms  allocation failure GC in old space requested
4|app | [11385:0x2b893d0]   789281 ms: Mark-sweep 1398.5 (1871.3) -> 1398.3 (1797.3) MB, 24586.0 / 4.6 ms  last resort
4|app | [11385:0x2b893d0]   797403 ms: Mark-sweep 1398.3 (1797.3) -> 1398.3 (1758.8) MB, 8119.9 / 1.0 ms  last resort
4|app |
4|app |
4|app | <--- JS stacktrace --->
4|app |
4|app | ==== JS stack trace =========================================
4|app |
4|app | Security context: 0x7e7bf028799 <JSObject>
4|app |     1: add [native collection.js:~111] [pc=0x7a887d1b539](this=0x13ebc6615671 <Set map = 0x18534a9053d9>,p=0x1d9c6aee7719 <String[24]: 5b9827afc5635e2a08f49b6f>)
4|app |     2: baseUniq [/home/app/node_modules/waterline/node_modules/lodash/index.js:~2670] [pc=0x7a887d4d51a](this=0x243308d07421 <JSGlobal Object>,array=0x13ebc66154d9 <JSArray[469241]>,iteratee=0x13ebc6615531 <JSFunction (sfi = 0x3fc29...
  

Пожалуйста, помогите мне найти, какой код раздувает кучу. Я пробовал инструменты для обнаружения утечек, но это говорит только о том, что утечка памяти произошла не там, где.

Комментарии:

1. Вы уверены, что это утечка памяти? т.Е. вы могли бы сначала попытаться увеличить максимальный размер кучи и посмотреть, происходит ли ошибка по-прежнему. Если да, возможно, проверьте эту ссылку, которая мне очень помогла, когда у меня была такая же проблема -> blog.risingstack.com/case-study-node-js-memory-leak-in-ghost

2. Спасибо, я обновлю после увеличения размера кучи

3. Как сказал @eol, попробуйте запустить node —max-old-space-size=8192 <ваша точка входа>.js. Мы не можем точно определить, где происходит утечка из-за ошибки, которую вы получаете.

4. У меня есть некоторое представление о том, где происходит утечка, это сторонняя библиотека (waterline.js ) для запроса базы данных. Все еще тестирую вещи. Что означает использование старого пространства в версии 8? @BrankoZivanovic

5. По умолчанию ваш процесс nodejs может занимать максимум 512 МБ, и при превышении этого значения произойдет сбой, как это уже было. Вы можете использовать узел —max-old-space-size=2048 index.js увеличить ее до 2 ГБ или выше и посмотреть, произойдет ли сбой, или вы даже не сможете профилировать загрузку процессора без этого, если вы даже не можете правильно запустить скрипт. Удачи!

Ответ №1:

Это была сторонняя библиотека ORM, вызванная Waterline.js конфигурация была неправильно настроена, было избыточное сопоставление между коллекциями, поэтому добавление любого документа в базу данных выполняется и проверяется, какому пользователю принадлежал документ или около того. И в коллекции оказалось более 130 Тыс. документов, поэтому, я думаю, она извлекает все из памяти и запускает код.