0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用eBPF优化内存存储功能

Linux阅码场 来源:Linux阅码场 作者:Linux阅码场 2022-08-09 11:43 次阅读

1.背景

1212be9c-1793-11ed-ba43-dac502259ad0.png

随着存储设备的升级与发展,当代的存储设备性能越来越高,延迟也越来越低。对于内核而言,Linux I/O 存储栈的软件所带来的性能开销已经越来越不可忽视。同样在 512B 的随机读条件下,在采用二代 Optane SSD 作为存储设备的测试例⼦中,内核软件( Linux 存储栈)所带来的性能开销已经⾼达 50%。

2.传统方式与XRP

12273d40-1793-11ed-ba43-dac502259ad0.png

我们来看⼀个实际的例⼦,假设现在有⼀棵树⾼为 4 的 B+ tree 存储于存储设备当中。当我们从根节点出发,⼀共需要经过三次访盘才能获得最终的叶⼦节点,⽽中间的索引节点对于⽤户⽽⾔没有意义,但也需要经过⼀个完整的存储栈路径。⽽每次访盘的过程中,存储栈所花费的开销就要整个存储路径的 48.6%。

1246a842-1793-11ed-ba43-dac502259ad0.png

显然,冗⻓的存储栈路径钳制了⾼性能存储设备的发挥,那么⼀个直观的优化思路便是通过 Kernel Bypass 的⽅式,绕开内核中存储栈,以提升存储性能。⽬前在学术界中,对于这⽅⾯的⼯作有 Demikernel、Shenango、Snap 等,⽽⼯业界中最为⼴泛使⽤的则是 Intel 的 SPDK。

126e8e8e-1793-11ed-ba43-dac502259ad0.png

然⽽,Kernel Bypass 技术并⾮银弹,它虽然能够降低内核存储栈的开销,但也存在着如下缺点:

1. 没有适当粒度的访问控制

2. 需要采⽤ polling ⽅式来判断 I/O 是否完成,这会导致在 I/O 利⽤率低时,Polling 进程所在的 CPU ⼤部分情况下只是在空转,浪费 CPU 周期,同时 CPU 资源不能⾼效地在多进程中共享。

1284b696-1793-11ed-ba43-dac502259ad0.png

所谓 XRP 的全称是 eXpress Resubmission Path(快速重提交路径)。与 SPDK 完全绕开内核存储栈,采⽤ polling的⽅式来访问存储的⽅式不同,XRP 则是通过将中间请求直接在 NVMe 驱动层进⾏ resubmission,从⽽避免让中间请求通过冗⻓的存储栈后再提交,从⽽达到加速的⽬的。反映到上⾯的例⼦当中,可以明显地看到使⽤ XRP 存储访问⽅式中,只有第⼀次请求和最后⼀次响应会经过⼀个完整的存储栈路径。显然,在允许范围内,B+ tree的树⾼越⾼,XRP 的加速效果也就越明显。

12ae9ed4-1793-11ed-ba43-dac502259ad0.png

既然优化思路有了,那么应当如何才能将请求重提交于 NVMe 驱动层呢?这⾥可以借鉴 XDP 的实现思路。XDP 通过 eBPF 来实现对每个数据包进⾏独⽴的操作(数据包过滤、数据包转发、数据包追踪、⽹络调度)。XRP 也可以通过 BPF 程序来实现。

12c0f4ee-1793-11ed-ba43-dac502259ad0.png

12ceabb6-1793-11ed-ba43-dac502259ad0.png

XRP 是⾸个使⽤ eBPF 来降低内核存储软件开销的系统。它所⾯临的挑战主要有:

1. 如何在 NVMe 驱动层实现对⽂件偏移的翻译

2. 如何强化 eBPF verifier 以⽀持存储应⽤场景

3. 如何重新提交 NVMe 请求

4. 如何与应⽤层 Cache 进⾏交互

12db1978-1793-11ed-ba43-dac502259ad0.png

XRP 引⼊了⼀种新的 BPF 类型(BPF_PROG_TYPE_XRP),包含了 5 个字段,分别是

1. char* data:⼀个缓冲区,⽤于缓冲从磁盘中读取出来的数据

2. int done:布尔语意,表示 resubmission 逻辑是否应当返回给 user,还是应当继续 resubmitting I/O 请求

3. uint64_t next_addr[16]:逻辑地址数组,存放的是下次 resubmission 的逻辑地址

4. uint64_t size[16]:存放的是下次 resubmission 的请求的⼤⼩5. char* scratch:user 和 BPF 函数的私有空间,⽤来传递从 user 到 BPF 函数的参数。BPF 函数也可以⽤这段

空间来保存中间数据。处于简单考虑,默认 scratch 的⼤⼩是 4KB。

同时,为了避免因存在⽆限循环⽽导致 BPF Verifier 验证失败,代码中指定了 B+ tree 的最⼤扇出数为

MAX_FANOUT,其值为 16。

12f357a4-1793-11ed-ba43-dac502259ad0.png

1302c298-1793-11ed-ba43-dac502259ad0.png

⽬前,最常⻅链式读请求主要有 B-Tree 和 LSM Tree 两种,⽽ XRP 分别继承了 BPF-KV(⼀个简易的基于 B+ Tree的键值存储引擎) 和 WIREDTIGER(mongoDB 的后端键值存储引擎)。

3.实验测试

13253e5e-1793-11ed-ba43-dac502259ad0.png

上图为在 512B 随机读测试中,标准 read 和 XRP 之间的性能对⽐测试。可以看到随着线程数的增加,XRP 的吞吐保持线性增⻓的态势,同时 XRP 通过降低每次 I/O 请求时的 CPU 开销,从⽽缓解了 CPU 争⽤问题。

133de4a4-1793-11ed-ba43-dac502259ad0.png

134b9856-1793-11ed-ba43-dac502259ad0.png

上⾯两幅图中,同样表示了在 512B 随机读测试中(CPU 核⼼数为 6),标准 read、XRP 和 SPDK 之间的吞吐量以及尾延迟的对⽐。在线程数⼩于等于 CPU 核⼼数时,三者性能变化稳定,从⾼到低依次为 SPDK > XRP >read。⽽当线程数超过了核⼼数时,SPDK 性能开始出现严重的下跌,标准 read 性能轻微下滑,⽽ XRP 依然保持着稳定的线性增⻓。这主要是因为 SPDK 采⽤ polling 的⽅式访问存储设备的完成队列,当线程数超过核⼼数,线程之间对 CPU 的争夺加上缺乏同步性,会导致所有线程都经历尾部延迟显著提升和整体吞吐量的显著下降。

4.总结

137f2edc-1793-11ed-ba43-dac502259ad0.png

XRP 是⾸个将 BPF 应⽤来通⽤存储函数的加速上的系统,它既能享受到 kernel bypass 的性能优势,同时⼜⽆须牺牲 CPU 的使⽤率和访问控制。⽬前,XRP 团队依然在积极地将 XRP 与其他⼀些流⾏的键值存储引擎,如 RocksDB进⾏集成。

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10412

    浏览量

    206466
  • 存储
    +关注

    关注

    12

    文章

    3847

    浏览量

    84639
  • 内存
    +关注

    关注

    8

    文章

    2760

    浏览量

    72694

原文标题:XRP:用eBPF优化内存存储功能

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于ebpf的性能工具-bpftrace脚本语法

    bpftrace 通过高度抽象的封装来使用 eBPF,大多数功能只需要寥寥几笔就可以运行起来,可以很快让我们搞清楚 eBPF 是什么样的,而暂时不关心 eBPF 复杂的内部机理。由于
    的头像 发表于 09-04 16:04 540次阅读
    基于<b class='flag-5'>ebpf</b>的性能工具-bpftrace脚本语法

    内存优化

    软件简介:      内存优化王 能够有效释放应用程序在运行时未能及时释放的内存资源,并提供给需要使用大量内存的程序使用。它在
    发表于 09-05 14:57

    内存分配及Cache优化

    内存分配及Cache优化   与PC机相比,DSP的程序数据存储空间非常有限。因此,对于视频编码这种需要处理大量数据的程序而言,必须合理安排数据和程序的存储方式,实现对
    发表于 08-10 14:54

    嵌入式系统内存优化使用

    嵌入式系统功能的提高,占用了较大内存空间,继而时常出现运行无响应。基于用户方面看,由于系统内存问题影响运行,针对系统内存与进程应用状态研究,可以调整系统数值与执行文件elf分析,进行系
    发表于 11-04 06:23

    关于 eBPF 安全可观测性,你需要知道的那些事儿

    离不开安全模式的 eBPF Verifier(其中最重要的是边界检查):拥有加载 eBPF 程序的流程所需的特权无 crash 或其他异常导致系统崩溃的情况程序可以正常结束,无死循环检查内存越界检查
    发表于 09-08 15:31

    openEuler 倡议建立 eBPF 软件发布标准

    扩展到了网络、内核、安全、跟踪等,而且它的功能特性还在快速发展中,早期的 BPF 被称为经典 BPF,简称 cBPF,正是这种功能扩展,使得现在的 BPF 被称为扩展 BPF,简称 eBPF。如今
    发表于 12-23 16:21

    何用全波段测试法优化光器件性能

    何用全波段测试法优化光器件性能 通信界的最近进展主要集中于城域网和接入网,因为它们可以解决存储局域网络(SAN)、视频
    发表于 03-17 11:26 669次阅读

    基于小文件的内存存储优化策略

    由于内存云RAMCloud采用日志段的方式存储数据,因此当大量小文件存储于RAMCloud集群时,每个小文件独占整个段,会产生较多的段内碎片,从而导致内存的有效利用率较低以及大量的
    发表于 01-24 13:55 0次下载
    基于小文件的<b class='flag-5'>内存</b>云<b class='flag-5'>存储</b><b class='flag-5'>优化</b>策略

    eBPF是什么以及eBPF能干什么

    规则使用基于寄存器的虚拟机来描述包过滤的行为。比较常用的功能是通过过滤来统计流量,tcpdump工具就是基于BPF实现的。而eBPF对它进行了扩展来实现更多的功能。 主要区别如下: 1)允许使用C 语言编写
    的头像 发表于 07-05 15:17 9520次阅读
    <b class='flag-5'>eBPF</b>是什么以及<b class='flag-5'>eBPF</b>能干什么

    美光推出一系列优化解决方案应对智能边缘复杂内存存储需求

    内存存储解决方案领先供应商 Micron Technology, Inc.(美光科技股份有限公司,纳斯达克代码:MU)近日宣布扩展旗下嵌入式产品组合与生态系统合作伙伴阵容,推出一系列功能强大的
    的头像 发表于 06-27 15:31 1077次阅读
    美光推出一系列<b class='flag-5'>优化</b>解决方案应对智能边缘复杂<b class='flag-5'>内存</b>与<b class='flag-5'>存储</b>需求

    openEuler倡议建立eBPF软件发布标准

    扩展到了网络、内核、安全、跟踪等,而且它的功能特性还在快速发展中,早期的 BPF 被称为经典 BPF,简称 cBPF,正是这种功能扩展,使得现在的 BPF 被称为扩展 BPF,简称 eBPF
    的头像 发表于 12-06 10:29 381次阅读

    eBPF的前世今生?eBPF在使用中遇到的问题有哪些?

    在介绍eBPF (Extended Berkeley Packet Filter)之前,我们先来了解一下它的前身-BPF (Berkeley Packet Filter)伯克利数据包过滤器。
    的头像 发表于 08-12 15:10 1118次阅读
    <b class='flag-5'>eBPF</b>的前世今生?<b class='flag-5'>eBPF</b>在使用中遇到的问题有哪些?

    基于ebpf的性能工具-bpftrace

    运行情况对于诊断问题、优化性能以及进行安全监控至关重要。bpftrace作为一款强大的跟踪工具,为开发人员和系统管理员提供了一种独特的方式来监视和分析Linux系统的内部运行。本文描述bpftrace的原理和使用。 bpftrace 「bpftrace是基于eBPF和BB
    的头像 发表于 09-04 16:02 334次阅读
    基于<b class='flag-5'>ebpf</b>的性能工具-bpftrace

    ebpf的快速开发工具--libbpf-bootstrap

    基于ubuntu22.04-深入浅出 eBPF 基于ebpf的性能工具-bpftrace 基于ebpf的性能工具-bpftrace脚本语法 基于ebpf的性能工具-bpftrace实战
    的头像 发表于 09-25 09:04 360次阅读
    <b class='flag-5'>ebpf</b>的快速开发工具--libbpf-bootstrap

    eBPF动手实践系列三:基于原生libbpf库的eBPF编程改进方案简析

    在上一篇文章《eBPF动手实践系列二:构建基于纯C语言的eBPF项目》中,我们初步实现了脱离内核源码进行纯C语言eBPF项目的构建。libbpf库在早期和内核源码结合的比较紧密,如今的libbpf库更加成熟,已经完全脱离内核源码
    的头像 发表于 03-19 14:19 208次阅读
    <b class='flag-5'>eBPF</b>动手实践系列三:基于原生libbpf库的<b class='flag-5'>eBPF</b>编程改进方案简析