主流内存压缩技术 目前linux内核主流的内存压缩技术主要有3种:zSwap, zRAM, zCache。 2.1 zSwap zSwap是在memory与flash之间的一层“cache”,当内存需要swap出去磁盘的时候,先通过压缩放到zSwap中去,zSwap空间按需增长。 zswap本身存在一些缺陷或问题: 如果开启当zswap满交换出backing store的功能, 由于需要将zswap里的内存按LRU顺序解压再swap out, 这就要求内存分配器支持LRU功能。 2.3 zCache zCache是oracle提出的一种实现文件页压缩技术,也是memory与block dev之间的一层“cache”,与zswap比较接近,但zcache目前压缩的是文件页,而zSwap zsmalloc zbud z3fold zSwap(有实际swap device) ×(不可用) √(可用) √(最佳) zSwap(无实际swap device) √(最佳) √(可用) √(可用
问题二:zswap 的困境 这种设计也给zswap子系统¹⁷的用户带来麻烦。zswap 的工作原理是:在换出流程中拦截页面,不将其写入磁盘,而是将其压缩后存回内存。 这也就导致,zswap无法在没有真实物理设备时使用,且zswap可压缩内存的量完全限制于物理块设备的大小:页面首次进入 zswap 时,必须立即在后备设备上预分配一个槽位。 这意味着,即使从不打算真正将页面写入磁盘,每次 zswap 使用都必须在后备设备上占用空间,造成大量存储空间浪费,甚至使 zswap 在没有可用后备存储的系统上无法使用。 :指向 zswap 子系统中的一个槽位(由 zswap_entry 指向) VSWAP_FOLIO :对应一个当前仍驻留于 RAM 的页面(由 swap_cache 指示) Chris Li 也同样担忧开销问题¹⁹,并指出该设计过于注重改进 zswap,而忽略了其他方面。
上图展示的是linux系统用到的zswap内存压缩技术,如上图所示,zswap延迟了内存换入换出的频率,为换页过程提供了缓存区,从而可以通过批量操作磁盘来降低单次读写磁盘的低效问题。
zswap:可以带来相似的益处(和相似的代价)。两者不同的是 zswap 将页面压缩后换入交换空间,而 zram 则换入内存。 因此,相较于 zswap,zram 的响应是更快的。
内存超分技术通过三层机制实现物理内存复用:•气球驱动(Ballooning):动态回收空闲内存•内存压缩:zSwap技术实现5:1压缩比•页共享:KSM内核同页合并减少30%内存占用性能影响测试数据:超分比例
Ubuntu 22.04 的性能应该会有所提高,尤其是在引入 zswap 之后。 火狐作为 Snap 默认情况下,Firefox 现在将作为 Snap 包包含在内。
在内存紧急的路径上(比如不想睡眠,要求低延迟;或者要求内存吃紧的情况下,仍然可以从min水位以下申请内存),哪怕是进程上下文,我们也建议可以考虑使用GFP_ATOMIC 比如田涛童鞋最近在mm/zswap.c
2m_entry(vma,address);returntrue;}//优势:减少TLB压力,提升性能//2MB页:一个TLB条目覆盖2MB内存//4KB页:需要512个TLB条目覆盖相同范围内存压缩(Zswap /Zram)展开代码语言:CAI代码解释//传统交换vs内存压缩交换voidhandle_memory_pressure(void){if(zswap_enabled){//1.选择候选页进行压缩page
这个 swap 分区在 Jetson 刷机教程中磁盘格式化中已经设置过; 首先,Zram 是 linux 内存子系统(mm)中,内存支持的压缩三个组件之一;其他的两个分别是 zcache 和 zswap
就有大量的案例 在内存紧急的路径上(比如不想睡眠,要求低延迟;或者要求内存吃紧的情况下,仍然可以从min水位以下申请内存),哪怕是进程上下文,我们也建议可以考虑使用GFP_ATOMIC 比如田涛童鞋最近在mm/zswap.c
memory.swap.peak cgroup.threads memory.events memory.zswap.current cgroup.type memory.events.local memory.zswap.max cpu.idle memory.high
目前swap的最大问题就是传统磁盘的延迟问题,很容易造成系统无响应,这也是为什么有zswap这样的技术出现。 PMEM的低延迟特性完全可以消除swap的延迟问题。
Linux 中叫 KSM(Kernel Same-page Merging) 内存压缩:当内存不足时,还会触发压缩的机制,Linux 中的 zswap,将数据压缩后节省资源,避免频繁的磁盘操作 透明大页
procrank :获取所有进程的内存使用情况,排序是按照 Pss 大小,详细输出每个 PID 对应的 Vss 、 Rss Pss 、Uss 、 Swap 、 PSwap 、 USwap 、 ZSwap
3.2.4 Slub实现 3.3 Kmalloc 3.4 Vmalloc 3.5 CMA 4.1 内存规整 4.2 页帧回收 4.3 交换区 4.4 OOM Killer 5.1 ZRAM 5.2 ZSwap 内核还有三个内存压缩技术zram、zswap、zcache,图里并没有画出来。 它们产生的原因并不相同,zram和zswap产生的原因是因为把匿名页写入swap区是IO操作,是非常耗时的,使用zram和zswap可以达到用空间换时间的效果。 五、物理内存压缩 暂略 5.1 ZRAM 5.2 ZSwap 5.3 ZCache 六、虚拟内存映射 开启分页内存机制之后,CPU访问一切内存都要通过虚拟内存地址访问,CPU把虚拟内存地址发送给MMU
memory.swap.peak cgroup.threads memory.events memory.zswap.current cgroup.type memory.events.local memory.zswap.max cpu.idle memory.high