Утечка памяти с шуткой (узел, коа, sequelize) - PullRequest
0 голосов
/ 05 июня 2018

Стек: System: OS: macOS High Sierra 10.13.4 CPU: x64 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz Binaries: Node: 8.1.4 - ~/.nvm/versions/node/v8.1.4/bin/node npm: 6.0.0 - ~/.nvm/versions/node/v8.1.4/bin/npm npmPackages: jest: ^23.0.1 => 23.0.1 sequelize: ^4.37.10 pg: ^7.4.3 koa: ^2.3.0 babel-jest: ^22.4.3

1.Предисловие

Недавно мы перевели все тесты нашего API с Mocha на Jest.У нас около 90 тестов, половина из которых требует синхронного запуска из-за их использования нашей тестовой базы данных (запуска семян между ними), поэтому мы должны использовать --runInBand.

Я, к сожалению, не могу поделиться своим кодом, поскольку он является приватным.

2.Проблема

Запуск тестов один за другим был в порядке, затем я попытался запустить их все сразу, и все пошло плохо.С --logHeapUsage кажется, что контекстная память не GC, что приводит к куче Javascript из памяти.

Я попытался использовать новую опцию --detectOpenHandles, чтобы увидеть, что может помешать работе GC, новот что получилось: ● PROMISE at Promise.catch (<anonymous>) at node_modules/core-js/library/modules/es6.promise.js:244:30 at Object.<anonymous>.module.exports (node_modules/core-js/library/modules/_iter-detect.js:19:5) at Object.<anonymous> (node_modules/core-js/library/modules/es6.promise.js:243:74) at Object.<anonymous> (node_modules/core-js/library/fn/promise.js:4:1) У меня около 6-8 из них, и я понятия не имею, где искать.

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

afterAll(async () => {
    await db.close(); // Sequelize instance
    server.close(); // Koa server instance used with supertest (when needed)
});

Это не сильно изменилось, память все равно очень быстро растет (30-40 МБ на тест).В конце концов, я несколько раз написал небольшой файл для запуска, чтобы избежать проблем с памятью и склеить отчет о покрытии, но это не идеально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...