Работая над тестированием производительности для Node Project, я столкнулся с некоторыми отчетами о памяти, которые немного сбивают с толку с точки зрения производительности и утечек памяти.
Фон
Итак, я сгенерировалотчеты, использующие process.memoryUsage () API, который предоставляет информацию о следующих -
- RSS - подмножестве общей выделенной памяти, включая кучу, кодсегмент и стек
- heapTotal - память, выделенная для объектов, строк и замыканий
- heapUsed - фактическая память, используемая объектами, строками,и замыкания
- external - использование памяти объектами C ++, привязанными к объектам JavaScript, управляемым V8
Проблема
Я записалснимок памяти после каждого запроса к серверу и построения графика для 100 запросов -
![image](https://i.stack.imgur.com/8zTwrl.png)
The graph shows following information -
- The
RSS
memory keeps increasing with every request served
- The
External Memory
usage is significant compared to Heap Memory
- The
External Memory
goes down once the process is idle
- The
Total Heap
& Used Heap
memories are well under control
Findings
As per my understanding, something outside Heap is causing the memory to rise.
I am using sharp node package
which is resizing a lot of large images which ends up generating huge in memory buffers for those images.
In terms of memory, every request is serving 10 images that ends up generating 80 MB of buffer data
This is where I came across эта проблема github , где обсуждается влияние создания буферов в NodeJ
этот ответ в той же проблеме github объясняет, как буферы могут занимать память, которую garbage collector
не может отслеживать
Вопросы
Я на правильном пути?
Если нет, использование буферов в Node Applications не является правильным способом?