为Linux服务器开启ZRAM来节约内存

前言
最近在折腾几台小内存的VPS,发现内存经常不够用,交换分区又会拖慢系统性能。偶然发现了ZRAM这个好东西,可以在内存中创建压缩的交换空间,既能缓解内存压力,又不会有传统swap的IO瓶颈。今天就来分享一下如何在Linux服务器上配置ZRAM。
什么是ZRAM
ZRAM(压缩RAM)是Linux内核的一个模块,它可以在内存中创建压缩的块设备。简单来说,就是把一部分内存拿出来做压缩存储,当系统内存不足时,可以将不常用的数据压缩后存储在ZRAM中,而不是写入硬盘的swap分区。
ZRAM的优势
- 性能好:比传统硬盘swap快得多,因为都在内存中
- 节省内存:通过压缩可以获得2-3倍的有效内存空间
- 减少磨损:减少对SSD的写入,延长硬盘寿命
- 低延迟:访问速度远超传统swap
ZRAM的工作原理
ZRAM的原理是划分一块内存区域作为虚拟的块设备(支持透明压缩的内存文件系统),当系统内存不足出现页面交换时,将原本应该交换到硬盘的页面压缩后存放在内存中。
核心机制:
- 利用Swap优先级:ZRAM作为高优先级Swap设备
- 透明压缩:自动压缩和解压缩数据
- 内存分层:形成 RAM -> ZRAM -> 硬盘Swap 的多层存储
- 压缩算法选择:支持lzo、lz4、zstd等多种压缩算法
由于ZRAM没有改变Linux内存模型的基本结构,因此可以与现有的Swap机制完美集成,这也是为什么它能在Android等内存受限的环境中得到广泛应用。
检查系统支持
首先检查你的系统是否支持ZRAM:
1 | # 检查内核版本(ZRAM需要3.14+) |
注意事项:
- ZRAM从Linux 3.14开始正式进入主线内核
- 部分VPS使用Xen、OpenVZ等虚拟化技术,内核版本可能较老
- 使用
modinfo zram
是最可靠的检查方法 - CentOS 7虽然内核版本是3.10,但也支持ZRAM
大部分现代Linux发行版都内置了ZRAM支持,如果上面的命令有输出就说明系统支持。
手动配置ZRAM
基本配置步骤
1 | # 1. 加载zram模块 |
查看ZRAM状态
1 | # 查看swap状态 |
一键脚本安装
如果觉得手动配置比较麻烦,可以使用GitHub上的一键脚本来快速部署ZRAM。这里推荐使用spiritLHLS大佬开源的addzram脚本:
1 | curl -L https://raw.githubusercontent.com/spiritLHLS/addzram/main/addzram.sh -o addzram.sh && chmod +x addzram.sh && bash addzram.sh |
这个脚本会自动:
- 检测系统环境和内核支持
- 自动配置合适的ZRAM大小
- 设置开机自启动
- 选择最优的压缩算法
脚本执行后会提示配置结果,非常方便快捷。感谢 spiritLHLS 提供的优秀脚本!
对于新手或者想要快速部署的用户,强烈推荐使用这个一键脚本。如果你想要更精细的控制或者学习具体的配置过程,可以继续看下面的手动配置方法。
自动化配置
如果选择手动配置,重启后会失效,我们需要设置开机自动启用。
方法一:使用systemd服务
创建一个systemd服务文件:
1 | sudo nano /etc/systemd/system/zram.service |
写入以下内容:
1 | [Unit] |
创建启动脚本:
1 | sudo nano /usr/local/bin/zram-start.sh |
1 |
|
创建停止脚本:
1 | sudo nano /usr/local/bin/zram-stop.sh |
1 |
|
设置脚本权限并启用服务:
1 | sudo chmod +x /usr/local/bin/zram-start.sh |
方法二:使用zram-tools包
对于Ubuntu/Debian系统,可以直接使用官方包:
1 | # 安装zram-tools |
配置文件内容:
1 | # 启用ZRAM |
启用服务:
1 | sudo systemctl enable zramswap |
优化配置
选择合适的压缩算法
不同的压缩算法有不同的特点:
1 | # 查看支持的压缩算法 |
个人推荐使用lz4,在速度和压缩率之间取得了很好的平衡。
设置合适的大小
ZRAM大小建议:
- 小内存系统(1-2GB):设置为物理内存的50-100%
- 中等内存系统(4-8GB):设置为物理内存的25-50%
- 大内存系统(16GB+):设置为固定大小如2-4GB
调整swappiness
1 | # 查看当前值 |
关于swappiness的重要说明:
很多人对swappiness参数存在误解,认为它是一个简单的百分比。实际上,swappiness控制的是内核在内存回收时选择回收匿名页(需要swap)还是文件页(直接丢弃或写回)的倾向性。
- 默认值60:倾向于优先回收文件页
- 设置为100:平等对待匿名页和文件页
- 大于100:更倾向于回收匿名页(使用swap)
对于ZRAM环境,由于ZRAM的访问速度远快于硬盘swap(约30倍差距 vs 传统swap的300+倍差距),我们可以更激进地使用swap,建议设置为80-100之间。
什么时候ZRAM才会被使用?
ZRAM只有在系统内存压力达到一定程度时才会被使用。Linux使用内存水位线(Watermark)机制:
- 高水位线:内存充足,无需回收
- 低水位线:开始内存回收,kswapd0线程激活
- 最小水位线:内存严重不足,开始同步回收
只有当可用内存低于低水位线时,系统才会根据swappiness设置决定是否使用ZRAM。
监控和维护
查看ZRAM状态
使用zramctl工具(推荐):
1 | # 安装util-linux(如果没有zramctl命令) |
直接查看系统文件:
1 | # 查看基本统计信息 |
监控ZRAM使用情况
创建一个简单的监控脚本:
1 | sudo nano /usr/local/bin/zram-monitor.sh |
1 |
|
1 | sudo chmod +x /usr/local/bin/zram-monitor.sh |
高级优化配置
压缩算法选择
不同压缩算法的特点对比:
1 | # 查看支持的压缩算法 |
建议选择策略:
- 内存紧张环境:选择zstd获得最高压缩率
- 性能敏感环境:选择lz4获得最佳速度
- 平衡需求:选择lz4hc(综合推荐)
双层Swap配置
为了避免ZRAM耗尽导致OOM,建议配置双层Swap:
1 | # 查看当前swap优先级 |
内存碎片整理优化
1 | # 配置内存碎片整理参数 |
性能调优参数
1 | # 在/etc/sysctl.conf中添加ZRAM优化参数 |
常见问题与性能分析
1. ZRAM设备创建失败
1 | # 检查内核是否支持 |
2. ZRAM不被使用的问题
最常见原因:内存压力不够
ZRAM只有在系统内存压力达到一定程度时才会被使用。可以通过以下方式验证:
1 | # 查看内存水位线 |
3. 压缩率不理想
1 | # 查看当前压缩率 |
4. 系统性能下降
可能原因分析:
1 | # 检查CPU使用率(压缩解压消耗CPU) |
性能基准对比
根据实际测试,不同存储层级的性能对比:
存储类型 | 平均延迟 | 相对倍数 |
---|---|---|
直接内存访问 | ~100ns | 1× |
ZRAM (lz4) | ~3000ns | 30× |
SSD Swap | ~50ms | 500,000× |
机械硬盘 Swap | ~10ms | 100,000× |
从表格可以看出,ZRAM虽然比直接内存访问慢30倍,但比传统swap快数千倍,这就是ZRAM能够有效改善系统性能的原因。
总结与最佳实践
ZRAM是一个非常实用的技术,特别适合内存受限的服务器环境。通过合理配置,可以有效提升系统的内存利用率,改善整体性能。
核心要点回顾
- 适用场景:内存不足但有一定压缩空间的环境
- 性能特点:比直接内存慢30倍,但比硬盘swap快数千倍
- 配置原则:ZRAM大小不超过物理内存的50%
- 算法选择:lz4平衡性最好,zstd压缩率最高
最佳实践建议
配置方面:
- 使用一键脚本快速部署,手动配置深度定制
- 设置合理的swappiness值(80-100)
- 配置双层swap作为兜底机制
- 选择适合工作负载的压缩算法
监控方面:
- 定期检查压缩率和使用情况
- 监控系统内存水位线变化
- 关注CPU使用率变化
注意事项:
- ZRAM并不能完全替代传统swap
- 不同工作负载效果差异很大
- 配置过大可能适得其反
- 建议先在测试环境验证
现代操作系统对比
值得一提的是,内存压缩已经成为现代操作系统的标配:
- macOS:从OS X 10.9开始默认开启
- Windows:从Win10 TH2开始默认开启
- Android:广泛使用ZRAM技术
- Linux:需要手动配置,但支持最灵活
Linux的ZRAM虽然需要手动配置,但提供了最强的可定制性和透明度,这也是它在服务器环境中的优势所在。
希望这篇文章能帮到同样在为服务器内存发愁的朋友们!如果你有任何使用经验或改进建议,欢迎交流分享。
参考资料
- 标题: 为Linux服务器开启ZRAM来节约内存
- 作者: Kaku
- 创建于 : 2025-08-13 21:52:58
- 更新于 : 2025-08-13 22:03:07
- 链接: https://www.kakunet.top/2025/08/13/为Linux服务器开启ZRAM来节约内存/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。