zRAM内存压缩技术:原理与实践初探
zRAM内存压缩技术:原理与实践指南
1. 技术背景与原理
zRAM是Linux内核中的一项内存压缩技术,于2014年进入Linux 3.14内核主线。它的核心思想是利用CPU压缩算法压缩内存数据,在不增加物理内存的情况下扩展系统有效内存容量。
当系统内存紧张时,传统方法是将数据交换到磁盘(swap)或杀死进程,这往往导致系统性能下降或用户体验变差。zRAM提供了一种优雅的解决方案:它在RAM中创建一个压缩区域,将不常用的内存页面压缩存储,既避免了慢速的磁盘I/O操作,又保留了数据的快速访问能力。
简单来说,zRAM是"以时间换空间"的典型应用——牺牲少量CPU资源用于压缩/解压缩操作,换取更多的可用内存空间。例如,在Android设备上,一个占用100MB的应用在压缩后可能只占用40MB,节省60%的空间。
2. zRAM软件架构
zRAM的软件架构主要由三部分组成:
- 驱动模块:
- 本质是一个块设备驱动
- 负责创建和管理zRAM设备
- 处理所有I/O请求
图片出处:https://www.jianshu.com/p/24120d43933c
-
数据流模块:
- 管理压缩和解压缩操作流
- 支持多CPU并行压缩处理
- 为每个在线CPU分配独立的压缩流
-
压缩算法模块:
- 提供多种压缩算法(如LZO、LZ4、ZSTD)
- 不同算法在压缩率和速度上有所权衡
- 可根据系统需求动态切换
图片来源:https://cloud.tencent.com/developer/article/2335437
zRAM驱动维护一个数据块表,记录原始内存数据对应的压缩数据。当内存页被压缩后,原始内存页会被释放,并解除映射关系。此机制允许系统有效管理内存,在需要时能快速恢复数据。
3. zRAM配置与使用指令
以下是在Linux系统上配置和使用zRAM的完整命令集,使用sudo命令处理权限问题:
3.1 加载和验证zRAM模块
# 加载zRAM模块
sudo modprobe zram# 验证zRAM设备是否创建
ls /dev/zram*
3.2 查看和设置压缩算法
# 查看支持的压缩算法 (当前使用的算法会显示在方括号中)
cat /sys/block/zram0/comp_algorithm# 设置压缩算法 (例如设置为zstd,它通常有更高的压缩率)
echo zstd | sudo tee /sys/block/zram0/comp_algorithm
3.3 配置zRAM设备
# 检查当前swap状态
free -h
swapon --show# 如果zRAM已经在使用,先重置设备
echo 1 | sudo tee /sys/block/zram0/reset# 设置zRAM大小 (例如设置为2GB)
echo 2147483648 | sudo tee /sys/block/zram0/disksize
# 或使用更简洁的方式
echo 2G | sudo tee /sys/block/zram0/disksize# 验证大小设置是否成功
cat /sys/block/zram0/disksize
3.4 创建并启用swap
# 在zRAM设备上创建swap分区
sudo mkswap /dev/zram0# 启用swap (设置优先级为100,高于普通swap分区)
sudo swapon /dev/zram0 -p 100# 验证swap是否成功启用
free -h
swapon --show
3.5 优化swap行为
# 调整swappiness参数 (增加使用swap的倾向)
echo 100 | sudo tee /proc/sys/vm/swappiness# 对于使用zRAM的系统,可以设置更高的值 (Linux 5.8+支持)
echo 180 | sudo tee /proc/sys/vm/swappiness# 设置vm预读而非传统簇预读 (更适合zRAM)
echo 1 | sudo tee /sys/kernel/mm/swap/vma_ra_enabled
3.6 监控zRAM性能和效果
# 查看zRAM统计信息
cat /sys/block/zram0/mm_stat# 查看原始数据大小和压缩后大小
cat /sys/block/zram0/orig_data_size
cat /sys/block/zram0/compr_data_size# 计算压缩比
echo "压缩比 = $(cat /sys/block/zram0/orig_data_size) / $(cat /sys/block/zram0/compr_data_size)"# 查看读写统计
cat /sys/block/zram0/stat
3.7 禁用和清理zRAM
# 禁用zRAM swap
sudo swapoff /dev/zram0# 重置zRAM设备
echo 1 | sudo tee /sys/block/zram0/reset# 卸载zRAM模块 (如果不再需要)
sudo rmmod zram
4. 实际使用示例
下面是一个完整的配置和启用zRAM的示例流程:
# 1. 检查当前swap状态
free -h
swapon --show# 2. 重置zRAM设备 (如果已经存在)
echo 1 | sudo tee /sys/block/zram0/reset# 3. 设置压缩算法
echo zstd | sudo tee /sys/block/zram0/comp_algorithm# 4. 设置大小 (例如2GB)
echo 2147483648 | sudo tee /sys/block/zram0/disksize# 5. 验证大小设置
cat /sys/block/zram0/disksize# 6. 创建swap分区
sudo mkswap /dev/zram0# 7. 启用swap
sudo swapon /dev/zram0 -p 100# 8. 验证是否成功
free -h
通过这些命令,您可以在Linux系统上快速配置和启用zRAM,享受内存压缩带来的性能提升。zRAM特别适合内存受限的系统,能显著改善多任务处理能力和系统响应性。
相关文章:

zRAM内存压缩技术:原理与实践初探
zRAM内存压缩技术:原理与实践指南 1. 技术背景与原理 zRAM是Linux内核中的一项内存压缩技术,于2014年进入Linux 3.14内核主线。它的核心思想是利用CPU压缩算法压缩内存数据,在不增加物理内存的情况下扩展系统有效内存容量。 当系统内存紧张…...
Hive 3.1 在 metastore 运行的 remote threads
Remote threads 是仅当 Hive metastore 作为单独的服务运行是启动,请求需要开启 compactor。 有以下几种: 1. AcidOpenTxnsCounterService 统计当前 open 的事务数 从表 TXNS 中统计状态为 open 的事务。此事务数量可以再 hive metrics 中。 2. Acid…...

大语言模型揭秘:从诞生到智能
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)无疑是技术领域最耀眼的明星之一。它们不仅能够理解人类的自然语言,还能生成流畅的文本,甚至在对话、翻译、创作等任务中表现出接近人类的智能…...

基于模糊PID控制的供热控制系统设计Simulink仿真
1.模型简介 本仿真模型基于MATLAB/Simulink(版本MATLAB 2017Ra)软件。建议采用matlab2017 Ra及以上版本打开。(若需要其他版本可联系店主代为转换) 换热站干扰因素多导致传统PID控制无法满足控制要求的问题,提出利用…...

宝塔找不到php扩展swoole,服务器编译安装
1. 在php7.4中安装swoole,但找不到这个扩展安装 2. 服务器下载源码解压安装 http://pecl.php.net/package/swoole 下载4.8.0版本 解压到/www/server/php/74/下 3. 发现报错问题; 更新一下依赖 yum update yum -y install gcc gcc-c autoconf libjpe…...
LeetCode 1745.分割回文串 IV:动态规划(用III或II能直接秒)
【LetMeFly】1745.分割回文串 IV:动态规划(用III或II能直接秒) 力扣题目链接:https://leetcode.cn/problems/palindrome-partitioning-iv/ 给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,…...

C++发展
目录 编辑C 的发展总结:编辑 1. C 的早期发展(1979-1985) 2. C 标准化过程(1985-1998) 3. C 标准演化(2003-2011) 4. C11(2011年) 5. C14(2014年&a…...

Python:函数,return返回值与形参实参
函数: 如: def login():print("这是登陆函数") login() #调用几次,函数里面的代码就会运行几次,每次调用的时候函数都会从头开始运行 return返回值:函数执行结束后最后给调用着的一个结果 作用:…...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序📚前言📚页面效果📚指令…...

pandas 文本数据处理
文本数据处理 获取字符串长度: 需要用到函数:str.len() 例: # 求字符串长度 # 引用 pandas import pandas as pd # 定义数据 data {"姓名":["张三","李四","王五","赵六"],"…...
GCC RISCV 后端 -- GCC 后端框架的一些理解
GCC 已经提供了一整套的编译框架,从前端(Frontend / GENERIC-Tree)对编程语言的语法语义处理,到中端(Middle-End / GIMPLE-Tree)的目标机器无关(Target Indepndent)的优化处理&#…...
FastGPT 源码:如何实现 “问题优化“
文章目录 FastGPT 源码:如何实现 "问题优化"一、前言二、源码分析2.1 queryExtension.ts 提示词2.2 queryExtension.ts 核心逻辑2.3 queryExtension 引用位置 三、流程总结 FastGPT 源码:如何实现 “问题优化” 一、前言 问题优化的背景和目…...

CSS—flex布局、过渡transition属性、2D转换transform属性、3D转换transform属性
1.flex布局 也叫弹性布局,是浏览器提倡的布局模型,非常适合结构化布局,提供了强大的空间分布和对齐能力,不会产生浮动布局中脱标现象,布局网页更简单,更灵活。 flex容器属性: 属性描述d…...
Spring Boot Gradle 项目中使用 @Slf4j 注解
Spring Boot Gradle 项目中,如果想使用 Slf4j 注解来启用日志记录,首先需要添加 Lombok 和 SLF4J 的依赖。可以通过以下步骤来添加它们: 1. 添加 Lombok 依赖 在 build.gradle 文件中添加以下 Lombok 依赖: dependencies {impl…...

FreeRTOS系列---程序正常,但任务无法创建
实验环境 stm32F103RCT6核心板 keil5 vscode stm32cubemx 使用stm32cubemx 问题现场 void my_task_init(void) {xTaskCreate(LED1_Task, "LED1_Task", configMINIMAL_STACK_SIZE, NULL, 1, NULL);xTaskCreate(LED2_Task, "LED2_Task", configMINIMA…...
linux应用:errno、perror、open、fopen
errno errno 是一个全局变量,定义在 头文件中。当系统调用(如 open、read、write 等)或库函数执行失败时,会将一个错误码赋值给 errno。不同的错误码代表不同的错误类型,通过检查 errno 的值,可以判断具体…...
物联网中的气象监测设备具备顶级功能
物联网中的气象监测设备具备顶级功能时,通常集成GPS、数据上报和预警系统,以确保精准监测和及时响应。以下是这些功能的详细说明: 1. GPS定位 精准定位:GPS模块提供设备的精确地理位置,确保数据与具体位置关联&#…...

15-YOLOV8OBB损失函数详解
一、YOLO OBB支持的OBB 在Ultralytics YOLO 模型中,OBB 由YOLO OBB 格式中的四个角点表示。这样可以更准确地检测到物体,因为边界框可以旋转以更好地适应物体。其坐标在 0 和 1 之间归一化: class_index x1 y1 x2 y2 x3 y3 x4 y4 YOLO 在内部处理损失和输出是xywhr 格式,x…...
WHAT - 前端异步事件流处理场景梳理
目录 一、典型场景二、解决方案与技术选型1. 基础异步控制2. 状态管理方案3. 复杂任务调度4. 任务取消机制5. 微任务队列优化 三、最佳实践建议四、工具链推荐 前端异步任务流处理是现代Web开发中常见的需求,尤其在复杂业务逻辑、高交互性应用中不可或缺。以下是常见…...

计算机网络软考
1.物理层 1.两个主机之间发送数据的过程 自上而下的封装数据,自下而上的解封装数据,实现数据的传输 2.数据、信号、码元 码元就是数字通信里用来表示信息的基本信号单元。比如在二进制中,用高电平代表 “1”、低电平代表 “0”,…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...