html菜鸟入门,广州网站优化关键词公司,推广方法视频,广州做网站mxszpt前言
Node.js 默认使用的是 ptmalloc(glibc) 内存分配器#xff0c;而#xff1a; 在服务端领域「不会选择默认的 malloc」是一个常识。#xff08; 来源 #xff09; ptmalloc 的分配效率较低#xff08; 来源 #xff09;#xff0c;对于 长时间、多核 / 多线程 运行…前言
Node.js 默认使用的是 ptmalloc(glibc) 内存分配器而 在服务端领域「不会选择默认的 malloc」是一个常识。 来源 ptmalloc 的分配效率较低 来源 对于 长时间、多核 / 多线程 运行的程序 来源 特别适合使用 jemalloc 分配器使用 jemalloc 分配内存可以更好的处理 内存碎片 问题 来源 。
jemalloc 并不总是最优的 来源 但十分适合服务端 Node.js 程序使用。
正文
Linux # installsudo apt-get updatesudo apt-get install -y libjemalloc-dev# run# 启动的时候添加 jemalloc 分配器LD_PRELOAD 的格式是以空格为分割。LD_PRELOAD/usr/lib/x86_64-linux-gnu/libjemalloc.so $LD_PRELOAD node index.js将 jemalloc 写入 ld.so.preload 可以让所有写入之后运行的进程默认使用 jemalloc 分配器一般没必要除非你有会启动多个进程的场景
echo /usr/lib/x86_64-linux-gnu/libjemalloc.so /etc/ld.so.preload检验对应的 node 进程是否正确使用了 jemalloc # 使用 top 等工具找到对应 node 进程的 pid 再查询即可sudo cat /proc/PID OF NODEJS/smaps | grep jemallocmacOS # installbrew install jemalloc# run# 在具体使用时 ${version} 版本号的部分换成你自己安装的即可DYLD_INSERT_LIBRARIES/usr/local/Cellar/jemalloc/5.3.0/lib/libjemalloc.dylib node index.js# ^ ${version}检验脚本
运行以下脚本可以测试 jemalloc 是否生效默认情况下会使用多达 4 G 内存若使用 jemalloc 则使用内存会大大减少至几十 M 。
注不要在内存不足 8 G 的服务器上运行剩余内存不够会直接宕机。
// index.jsconst bs 4 * 1024 * 1024; // 4 MiB
const retained [];
let i 0, flag false;function tick() {i;if (i % 1000 0) {console.log(RSS [${i}]: ${process.memoryUsage().rss / 1024 / 1024} MiB);}retained.push(Buffer.allocUnsafe(bs));if (i 5000) {console.log(Clearing retained and enabling alloc);retained.length 0;flag true;}if (flag) Buffer.alloc(bs); // Buffer.alloc(bs - 10) seems to be fine hereif (i 10000) setImmediate(tick);
}tick();例子
个人例子使用 jemalloc 后在我的服务端程序上原持续占用 900 M 内存的程序现会在 200 M 至 900 M 之间波动可以看到回收效率显著提高在调用需求下降时如半夜内存使用大幅减少 经典例子npmmirror 使用 jemalloc 大幅减少占用内存。 来源
总结
对于 长时间、多进程 的 Node.js 服务端程序我们可以切换至 jemalloc 内存分配器提高内存回收效率特别对于易产生内存碎片如大量 JSON 序列化的场景格外有效。
实践中修订容器脚本在镜像构建时运行对应的命令即可。