Node.js使用jemalloc内存分配器显著减少内存使用

前言

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 jemalloc
macOS
  # 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 M900 M 之间波动,可以看到回收效率显著提高,在调用需求下降时(如半夜),内存使用大幅减少:

经典例子:npmmirror 使用 jemalloc 大幅减少占用内存。( 来源 )

总结

对于 长时间、多进程 的 Node.js 服务端程序,我们可以切换至 jemalloc 内存分配器提高内存回收效率,特别对于易产生内存碎片(如大量 JSON 序列化)的场景,格外有效。

实践中,修订容器脚本,在镜像构建时运行对应的命令即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/313188.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lvm建立卷组和扩容

一、逻辑卷lvm 1.可以动态扩容 pe是逻辑卷最小的存储单元&#xff0c;最小4k 1.物理卷 将硬盘转化成 pe 2.卷组 将pe分组&#xff0c;一个逻辑卷只可以用一个组里面的pe 3.逻辑卷 类似于分区 1.1分区类型 lvm 如果使用分区&#xff0c;要修改分区类型为8e 二、…

Nacos身份认证权限绕过+漏洞利用工具分享

目录 一 JWT JWT: JWT的使用场景&#xff1a; JWT构造&#xff1a; 二 漏洞描述&#xff1a; 三 环境搭建 四 漏洞复现 五 工具漏洞复现 六 修复建议 七 工具分享 本文由掌控安全学院 - 小博 投稿 一 JWT JWT: JSON Web Token (JWT)是一个开放标准(RFC 7519)&…

【JAVA】实验一 从面向过程到面向对象

实验名称 实验一 从面向过程到面向对象 实验目的 1. 掌握Java语言简单数据类型、表达式、输入输出&#xff1b; 2. 理解Java类中main方法的编写及过程化编程&#xff1b; 3. 掌握Java数组的使用。 实验内容 1. 输入年份&#xff0c;判断是否是闰年。闰年…

看懂基本的电路原理图(入门)

文章目录 前言一、二极管二、电容三、接地一般符号四、晶体振荡器五、各种符号的含义六、查看原理图的顺序总结 前言 电子入门&#xff0c;怎么看原理图&#xff0c;各个图标都代表什么含义&#xff0c;今天好好来汇总一下。 就比如这个电路原理图来说&#xff0c;各个符号都…

【Linux C | 文件I/O】文件数据的同步 | sysc、fsync 和 fdatasync 函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

[每周一更]-(第47期):Go业务发展方向

Go业务方向 Go&#xff08;也称为Golang&#xff09;是一种开源编程语言&#xff0c;具有简洁、高效和并发性等特点&#xff0c;逐渐在业界流行起来。Go语言在不同领域有着广泛的应用&#xff0c; 下面列举了一些Go语言的业务发展方向&#xff1a; Web开发&#xff1a;Go语言…

jumpServer-01-跳板机与堡垒机

jumpServer-01-跳板机与堡垒机 文章目录 jumpServer-01-跳板机与堡垒机一、为什么需要跳板机&#xff1f;二、堡垒机的核心价值三、跳板机与堡垒机的区别四、堡垒机的核心作用与价值 一、为什么需要跳板机&#xff1f; 跳板机&#xff08;Jump Server&#xff09;是一种安全设备…

【小白专用】winform启动界面+登录窗口 更新2024.1.1

需求场景&#xff1a;先展示启动界面&#xff0c;然后打开登录界面&#xff0c;如果登录成功就跳转到主界面 首先在程序的入口路径加载启动界面&#xff0c;使用ShowDialog显示界面&#xff0c; 然后在启动界面中添加定时器&#xff0c;来实现显示一段时间的效果&#xff0c;等…

2023-12-30 AIGC-LangChain介绍

摘要: 2023-12-30 AIGC-LangChain介绍 LangChain介绍 1. https://youtu.be/Ix9WIZpArm0?t353 2. https://www.freecodecamp.org/news/langchain-how-to-create-custom-knowledge-chatbots/ 3. https://www.pinecone.io/learn/langchain-conversational-memory/ 4. https://de…

VSCode安装配置使用教程(最新版超详细保姆级含插件)一文就够了

前言 Visual Studio Code 是一个轻量级功能强大的源代码编辑器&#xff0c;支持语法高亮、代码自动补全&#xff08;又称 IntelliSense&#xff09;、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和 Git 版本控制系统。适用于 Windows、macOS 和 Linux。它内置了对…

HLS 2017.4 导出 RTL 报错:ERROR: [IMPL 213-28] Failed to generate IP.

软件版本&#xff1a;HLS 2017.4 在使用 HLS 导出 RTL 的过程中产生如下错误&#xff1a; 参考 Xilinx 解决方案&#xff1a;https://support.xilinx.com/s/article/76960?languageen_US 问题描述 DESCRIPTION As of January 1st 2022, the export_ip command used by Vivad…

Spring Cloud各个微服务之间为什么要用http交互?难道不慢吗?

解答 1、为什么要使用http交互&#xff1f; 通用、跨语言支持 HTTP是一种非常通用的协议&#xff0c;几乎所有的编程语言和平台都支持它&#xff0c; 这使得微服务可以使用不同的技术栈&#xff0c;只要它们都支持HTTP协议就可以进行通信。 简单、灵活、了扩展 HTTP协议相…