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

news2024/11/24 23:54:19

前言

Node.js 默认使用的是 ptmalloc(glibc) 内存分配器,而:

在服务端领域「不会选择默认的 malloc」是一个常识。( 来源 )

ptmalloc 的分配效率较低( 来源 ),对于 长时间、多核 / 多线程 运行的程序( 来源 ),特别适合使用 jemalloc 分配器,使用 jemalloc 分配内存可以更好的处理 内存碎片 问题( 来源 )。

jemalloc 并不总是最优的( 来源 ),但十分适合服务端 Node.js 程序使用。

正文

Linux
 # install
  sudo apt-get update
  sudo 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
  # install
  brew 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.js

const 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 here
  if (i < 10000) setImmediate(tick);
}

tick();

例子

个人例子:使用 jemalloc 后,在我的服务端程序上原持续占用 900 M 内存的程序,现会在 200 M900 M 之间波动,可以看到回收效率显著提高,在调用需求下降时(如半夜),内存使用大幅减少:

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

总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机录屏没有声音?让你的录屏有声有色

“有人知道手机录屏怎么录声音吗&#xff1f;今天录制了一个小时的直播视频&#xff0c;后面查看的时候发现没有声音&#xff0c;真的非常崩溃&#xff0c;想问问大家有没有办法&#xff0c;解决这个问题。” 在手机录屏的过程中&#xff0c;有时候我们可能会面临录制视频没有…

第19届楚天春晚在九省通衢大武汉闪亮登场

——中国明星后代女子歌舞团刘亦菲等兼任形象大使 2024年新年伊始&#xff0c;一场以繁荣中国传统文化为主旨的“楚天春晚”全国文旅活动在湖北武汉拉开帷幕&#xff01;以“文化强省&#xff0c;旅游大省”为神州特色的联合国世界品牌之都&#xff0c;在辞旧迎新的早春来临之…

手机摄影学习

手机摄影学习 基础知识1&#xff0c;成像基本原理2&#xff0c;什么是焦距3&#xff0c;快门&#xff08;简称s&#xff09;4&#xff0c;上面功能之间的相互影响5&#xff0c;焦点6&#xff0c;过爆、欠曝7&#xff0c;cmos&#xff08;感光芯片&#xff09;、测光、聚焦&…

考研用什么光源比较好?五款好用台灯推荐

人眼对光是非常敏感的&#xff0c;特别是儿童青少年眼睛还在发育的状态来说&#xff0c;光线是至关重要的&#xff0c;于是这次测评就不能马虎&#xff0c;必须要本着专业严谨的态度进行测评&#xff0c;这次测评呢就花了不少钱买下了现在市面上热度很高、或是较有名气的专业款…

贝锐花生壳全新功能:浏览器一键远程访问SSHRDP远程桌面

为了满足特定场景的远程访问需求&#xff0c;如&#xff1a;远程群晖NAS设备、远程SQL Server数据库/MySQL数据库、3389远程桌面&#xff08;RDP远程桌面&#xff09;、远程SSH、我的世界游戏联机…… 贝锐花生壳推出了场景映射服务&#xff0c;不仅提供满足相应场景的网络带宽…

机器人活动区域 - 华为OD统一考试

OD统一考试 题解: Java / Python / C++ 题目描述 现有一个机器人,可放置于 M x N 的网格中任意位置,每个网格包含一个非负整数编号,当相邻网格的数字编号差值的绝对值小于等于 1 时机器人可以在网格间移动。 问题: 求机器人可活动的最大范围对应的网格点数目。 说明: 网格…

剑指“CPU飙高”问题

一、什么是cpu飙高&#xff1f; 一般指程序运行时cpu占用率过高   linux系统中&#xff0c;我们使用top命令&#xff0c;会看到正在运行进程的cpu使用率等&#xff0c;同时在最上面也会看到总的cpu使用率&#xff0c;当总的cpu使用率过高&#xff0c;如果有运维监控平台&…

听GPT 讲Rust源代码--library/portable-simd

File: rust/library/portable-simd/crates/core_simd/examples/spectral_norm.rs spectral_norm.rs是一个示例程序&#xff0c;它展示了如何使用Portable SIMD库中的SIMD&#xff08;Single Instruction Multiple Data&#xff09;功能来实现频谱规范化算法。该示例程序是Rust源…

严格的老师对学生的好处

从踏入学校的大门开始&#xff0c;我们便与老师结下了不解之缘。他们不仅是传授知识的导师&#xff0c;更是陪伴我们成长的良师益友。其中&#xff0c;那些对学生要求严格的老师&#xff0c;更是让我们受益匪浅。他们以严谨的教育态度&#xff0c;为学生点亮了前行的路。 塑造良…

高可用解决方案 Keepalived 概述

概述 Keepalived 介绍 Keepalived 是 Linux 下一个轻量级别的高可用解决方案&#xff0c;通过 **VRRP 协议&#xff08;虚拟路由冗余协议&#xff09;**来实现服务或者网络的高可用&#xff0c;可以利用其来解决单点故障。 起初是为 LVS 设计的&#xff0c;一个 LVS 服务会有 …

【字典树Trie】LeetCode-139. 单词拆分

139. 单词拆分。 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s "leetcode&q…

零知识证明(zk-SNARK)- groth16(二)

From Computational Problem to zk-SNARK 本部分就是将计算难题转换为多项式&#xff0c;然后使用zk-SNARK。&#xff08;注&#xff1a;以下用 P&#xff0c;V 替代 Prover&#xff0c;Verifier&#xff09; 计算难题->R1CS R1CS(Rank-1 Constraint System)是一种能够将…

连接progressql报错Cannot load JDBC driver class ‘org.postgresql.Driver‘,亲测有效!!!

Jmeter连接progressql报错Cannot load JDBC driver class ‘org.postgresql.Driver’ 1.到官方下载驱动注意&#xff1a;根据项目的JDK版本来下载对应的驱动Download | pgJDBC 2.将postgresql-42.2.27.jar复制到lib目录下面&#xff0c; 然后重新启动 连接driver信息如下&#…

三、医学影像云平台(院内PACS叫号系统实践)

1. 业务概述 在云PACS中&#xff0c;排队和叫号系统是最灵活&#xff0c;定制化最强的业务&#xff0c;而且实时性要求高&#xff0c;否则&#xff0c;这里是容易发生医患矛盾的地方&#xff0c;所以&#xff0c;需要慎重。但是&#xff0c;这个系统又有个低要求特点&#xff…

数据库SQL ,零基础入门到精通,看完这一篇就够了!

目录 &#x1f4da; 前言&#x1f334; SQL 介绍 &#x1f33c; 什么是 SQL&#x1f300; SQL 的类型&#x1f335; 学习 SQL 的作用&#x1f344; 数据库是什么 &#x1f425; SQL 基础语言学习 &#x1f424; CREATE TABLE – 创建表&#x1f411; INSERT – 插入数据&#…

aspose通过开始和结束位置关键词截取word另存为新文件

关键词匹配实体类&#xff1a; Data EqualsAndHashCode(callSuper false) public class TextConfig implements Serializable {private static final long serialVersionUID 1L;/*** 开始关键词&#xff0c;多个逗号分隔*/private String textStart ;/*** 结束关键词&#x…

第 6 章 统计量及其抽样分布

统计量 卡方分布&#xff0c;t分布&#xff0c;f分布 样本均值的抽样分布 中心极限定理 样本比例的的抽样分布 两个均值之差的抽样分布 样本方差的分布&#xff08;重要&#xff09; 两个样本方差比的分布 注意理解下面这个图里面的定义&#xff08;比较重要&#xff09…

从公司代码仓库更新代码出现错误

错误&#xff1a; 解决&#xff1a;点击idea右上角&#xff0c;将远程代码和本地合并

RDS快速入门

目录 实例创建 设置白名单 RDS&#xff08;Relational Database Service&#xff09;是一种托管式的关系型数据库服务&#xff0c;它为用户提供了一种简单、可靠、安全的方式来部署、操作和扩展数据库。具有安全可靠、解决运维烦恼、有效降低成本和自研增加等四大特性&#x…

都2024年了!你还不知道在Docker中安装jdk?

目录 前言&#xff1a; Docker安装JDK(8) 查看以及安装的镜像 拉取JDK&#xff08;8&#xff09;的镜像文件 ​编辑 运行容器 进入容器 检查安装 如果我的博客帮助到你&#xff0c;麻烦点个小小的赞即可 前言&#xff1a; 在2024年&#xff0c;Docker已经成为了容器化…