【翻译】 zswap 压缩交换缓存

您知道吗......?

LWN.net 是一份由订阅者支持的出版物;我们依靠订阅者来维持整个运作。 请通过订阅来帮助我们,让 LWN 继续在网络上运行。

2013年2月12日

本文由 Seth Jennings 投稿

交换是性能的最大威胁之一。即使在快速固态硬盘上,RAM 和交换之间的延迟差距也可能达到四个数量级。 吞吐量差距为两个数量级。 除了速度上的差距,交换区所在的存储也越来越多地共享和虚拟化,这可能会导致额外的 I/O 延迟和不确定的工作负载性能。 zswap 子系统的存在就是为了通过减少 I/O 活动来减轻交换带来的这些不良影响。

Zswap 是一种轻量级的交换页写后压缩缓存。 它接收正在被交换的页面,并尝试将其压缩到基于 RAM 的动态分配内存池中。 如果这一过程成功,向交换设备的回写就会推迟,在很多情况下甚至可以完全避免。 这就大大减少了 I/O,并提高了交换系统的性能。

Zswap 基础知识

Zswap 在交换回写过程中拦截页面,并使用前置交换 API 对其进行缓存。 内核自 3.5 版起就加入了前置交换功能,LWN也曾对其进行过报道。 它允许后端驱动程序(如 zswap)拦截交换页面回写和被交换页面的页面故障。Zswap 还利用 "zsmalloc "分配器(下文将讨论)来进行压缩页面存储。

Zswap 在结构和操作上力求简单,主要有两种数据结构。 第一个是zswap_entry结构,它包含了存储在 zswap 中的单个压缩页面的信息:

    struct zswap_entry { struct rb_node rbnode; int refcount; pgoff_t offset; unsigned long handle; /* zsmalloc allocation */ unsigned int length; /* ...*/ };

第二个是zswap_tree结构,它包含一棵由偏移值索引的 zswap 条目组成的红黑树:

    struct zswap_tree { struct rb_root rbroot; struct list_head lru; spinlock_t lock; struct zs_pool *pool; };

在最高层,有一个以交换设备编号为索引的zswap_tree结构数组。

每个zswap_tree有一个锁,用于在查找和修改时保护树结构。 上层交换代码提供了某些保护措施,从而简化了 zswap 的实现,无需对同一交换条目进行并发存储、加载和失效操作。 虽然这种单锁设计看似可能会引起争用,但实际执行情况表明,交换路径的瓶颈主要来自更高层次的其他锁,如anon_vmamutex 或swap_lock。 相比之下,zswap_tree锁的竞争程度很低。 下一节将介绍的回写支持也促成了这种单锁设计。

在页面压缩方面,zswap 使用内核加密 API 提供的压缩器模块。 这允许用户在启动时动态选择压缩器,并方便访问硬件压缩加速器或其他未来的压缩引擎。

当一个页面被回收系统选中进行交换,并且 frontswap 在swap_writepage()中截获该页面时,zswap 存储操作就会发生。 操作开始时,会将页面压缩到每个 CPU 的临时缓冲区中。 之所以需要将页面压缩到临时缓冲区,是因为在实际压缩之前,无法知道压缩后的页面大小,也就无法知道保存页面所需的永久分配大小。 一旦知道压缩后的大小,就会分配一个对象,并将临时缓冲区复制到该对象中。 最后,一个zswap_entry结构会被分配、填充并插入

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值