cnpm / cnpmcore

Private NPM Registry for Enterprise
https://npmmirror.com
MIT License
622 stars 84 forks source link

cacheKeyNormalize 存在性能问题 #624

Closed fengmk2 closed 10 months ago

fengmk2 commented 11 months ago

image

node_modules/_tar@6.2.0@tar/lib/unpack.js node_modules/_tar@6.2.0@tar/lib/normalize-unicode.js

长期方案

fengmk2 commented 11 months ago

https://github.com/isaacs/node-tar/blob/5bc9d404e88c39870e0fbb55655a53de6fbf0a04/lib/unpack.js#L108

fengmk2 commented 11 months ago

https://github.com/isaacs/node-tar/blob/5bc9d404e88c39870e0fbb55655a53de6fbf0a04/lib/normalize-unicode.js#L9 image 存在内存泄漏?

fengmk2 commented 11 months ago

normalizeCache 的 key 每次 tar unpack 之后都会递增。 image

fengmk2 commented 11 months ago

https://github.com/isaacs/node-tar/pull/286/files#r1429388455

fengmk2 commented 11 months ago

https://github.com/node-modules/compressing/blob/master/package.json#L48C6-L48C16 呃,难怪以前没有出现过这个问题

fengmk2 commented 11 months ago

ezm headdump 也抓到了 image

barretlee commented 11 months ago

从内网之前的分析来看,堆内内存占用并不大,主要是堆外占用很大,而堆外大部分都是碎片内存。

也就是说,在 unpack 之后,在 normalizeCache 对象储存了大量的 key-value 对,但是由于存在少量 key/value 仍然被后续的程序使用(猜测)导致整个 normalizeCache 对象都没有被释放,这里说的没释放是没有释放给系统,被 ptmalloc 的 main arena 给保留了,原因是 top chunk 附近存在未回收内存。

经历了多次 unpack 后,堆外内存就暴涨了。泄露的不是 heap,是 mm 区。

fengmk2 commented 11 months ago

从内网之前的分析来看,堆内内存占用并不大,主要是堆外占用很大,而堆外大部分都是碎片内存。

也就是说,在 unpack 之后,在 normalizeCache 对象储存了大量的 key-value 对,但是由于存在少量 key/value 仍然被后续的程序使用(猜测)导致整个 normalizeCache 对象都没有被释放,这里说的没释放是没有释放给系统,被 ptmalloc 的 main arena 给保留了,原因是 top chunk 附近存在未回收内存。

经历了多次 unpack 后,堆外内存就暴涨了。因此泄露的不是 heap。

这个不是的,这个是真的 heap 泄漏,js 代码实现问题。

barretlee commented 11 months ago

这个不是的,这个是真的 heap 泄漏,js 代码实现问题。

那就是存在不止一个问题咯

fengmk2 commented 10 months ago

RSS 内存泄漏 https://zhuanlan.zhihu.com/p/675317993