当前位置: 首页 > news >正文

zRAM内存压缩技术:原理与实践初探

zRAM内存压缩技术:原理与实践指南

1. 技术背景与原理

zRAM是Linux内核中的一项内存压缩技术,于2014年进入Linux 3.14内核主线。它的核心思想是利用CPU压缩算法压缩内存数据,在不增加物理内存的情况下扩展系统有效内存容量。

当系统内存紧张时,传统方法是将数据交换到磁盘(swap)或杀死进程,这往往导致系统性能下降或用户体验变差。zRAM提供了一种优雅的解决方案:它在RAM中创建一个压缩区域,将不常用的内存页面压缩存储,既避免了慢速的磁盘I/O操作,又保留了数据的快速访问能力。

简单来说,zRAM是"以时间换空间"的典型应用——牺牲少量CPU资源用于压缩/解压缩操作,换取更多的可用内存空间。例如,在Android设备上,一个占用100MB的应用在压缩后可能只占用40MB,节省60%的空间。

2. zRAM软件架构

zRAM的软件架构主要由三部分组成:

  1. 驱动模块
    • 本质是一个块设备驱动
    • 负责创建和管理zRAM设备
    • 处理所有I/O请求
      在这里插入图片描述

图片出处:https://www.jianshu.com/p/24120d43933c

  1. 数据流模块

    • 管理压缩和解压缩操作流
    • 支持多CPU并行压缩处理
    • 为每个在线CPU分配独立的压缩流
  2. 压缩算法模块

    • 提供多种压缩算法(如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返回值:函数执行结束后最后给调用着的一个结果 作用&#xff1a…...

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”&#xff0c…...

Artichoke 未来展望:这个创新 Ruby 实现的路线图和愿景 [特殊字符]

Artichoke 未来展望:这个创新 Ruby 实现的路线图和愿景 🚀 【免费下载链接】artichoke 💎 Artichoke is a Ruby made with Rust 项目地址: https://gitcode.com/gh_mirrors/ar/artichoke Artichoke 是一个用 Rust 编写的创新 Ruby 实现…...

别再只防SSH了!给OpenWRT的Web管理后台LuCI也加上fail2ban防护(附日志配置避坑指南)

OpenWRT安全加固:为LuCI管理界面部署fail2ban防护的完整方案 路由器作为家庭网络的入口,其安全性往往被严重低估。大多数用户会记得给SSH服务配置fail2ban防护,却忽略了同样暴露在公网的Web管理界面——LuCI。这种安全防护的"偏科"…...

PingFangSC跨平台字体解决方案:企业级部署与性能优化指南

PingFangSC跨平台字体解决方案:企业级部署与性能优化指南 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件,包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 在数字化转型浪潮中,企业…...

从Tcl脚本到实战:用Innovus自动化完成数字IC后端设计的5个高效技巧

从Tcl脚本到实战:用Innovus自动化完成数字IC后端设计的5个高效技巧 在数字IC后端设计领域,效率提升往往意味着项目周期的缩短和设计质量的提高。对于已经掌握Innovus基础操作的中级工程师而言,如何从手动点击界面过渡到自动化脚本驱动的工作流…...

LeetCode 98. Validate Binary Search Tree 题解

LeetCode 98. Validate Binary Search Tree 题解 题目描述 给你一个二叉树的根节点 root,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子…...

基于深度学习的CT肺部分割技术:在医学影像分析中实现95% Dice系数的精准自动化方案

基于深度学习的CT肺部分割技术:在医学影像分析中实现95% Dice系数的精准自动化方案 【免费下载链接】lungmask Automated lung segmentation in CT 项目地址: https://gitcode.com/gh_mirrors/lu/lungmask 在医学影像分析领域,CT肺部分割一直是临…...

生物信息学入门:手把手教你用Java实现Needleman-Wunsch序列比对算法

生物信息学实战:用Java构建Needleman-Wunsch全局序列比对工具 第一次接触DNA序列比对时,看着两条看似杂乱无章的碱基序列在算法处理后突然呈现出惊人的相似性,那种发现隐藏规律的震撼感至今难忘。作为生物信息学领域最经典的算法之一&#xf…...

机械原理课程设计 洗瓶机机构设计(设计说明书+3张CAD图纸+连杆机构设计软件)

洗瓶机作为工业清洗领域的核心设备,其机构设计的合理性直接影响清洗效率与质量。机械原理课程设计中的洗瓶机机构设计,聚焦于通过连杆机构实现瓶体的连续输送、定位与翻转,确保清洗液均匀覆盖瓶内壁。设计核心在于构建多自由度运动系统&#…...

Windows 10/11防火墙设置:如何快速开启ICMP协议实现Ping功能(详细图文)

Windows系统ICMP协议配置全指南:从基础原理到高阶应用 在IT运维和开发工作中,网络连通性测试是最基础却又最频繁的需求之一。想象一下这样的场景:你正在部署一个关键服务,却发现客户端无法连接到服务器;或是远程协助同…...

Qt6 QML自定义控件实战:手把手教你做一个Material Design风格的Switch开关

Qt6 QML实战:打造Material Design风格Switch开关的完整指南 在移动端和桌面端应用开发中,开关控件(Switch)是最常用的交互元素之一。一个精致的开关不仅能提升用户体验,还能体现应用的整体设计水准。本文将带你从零开始,用Qt6 QML…...