深入浅出计算机组成原理
徐文浩
bothub 创始人
70433 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
深入浅出计算机组成原理
15
15
1.0x
00:00/00:00
登录|注册

48 | DMA:为什么Kafka这么快?

自行编写零拷贝和非零拷贝传输数据的代码
阅读Kafka的论文
Kafka利用DMA的性能提升
DMA在系统开发中的作用
性能提升
FileChannel的transferTo方法
通过DMA实现零拷贝
DMAC作为协处理器
DMA控制数据传输
减少CPU等待时间
HDD换成SSD,PCI Express接口的SSD替代SATA接口的SSD,傲腾(Optane)技术的出现
课后思考
推荐阅读
总结延伸
Kafka的实现原理
DMA技术的作用
CPU的主频远快于IOPS
过去几年里,计算机产业一直在提升I/O设备的速度
为什么Kafka是目前实时数据传输管道的标准解决方案

该思维导图由 AI 生成,仅供参考

过去几年里,整个计算机产业界,都在尝试不停地提升 I/O 设备的速度。把 HDD 硬盘换成 SSD 硬盘,我们仍然觉得不够快;用 PCI Express 接口的 SSD 硬盘替代 SATA 接口的 SSD 硬盘,我们还是觉得不够快,所以,现在就有了傲腾(Optane)这样的技术。
但是,无论 I/O 速度如何提升,比起 CPU,总还是太慢。SSD 硬盘的 IOPS 可以到 2 万、4 万,但是我们 CPU 的主频有 2GHz 以上,也就意味着每秒会有 20 亿次的操作。
如果我们对于 I/O 的操作,都是由 CPU 发出对应的指令,然后等待 I/O 设备完成操作之后返回,那 CPU 有大量的时间其实都是在等待 I/O 设备完成操作。
但是,这个 CPU 的等待,在很多时候,其实并没有太多的实际意义。我们对于 I/O 设备的大量操作,其实都只是把内存里面的数据,传输到 I/O 设备而已。在这种情况下,其实 CPU 只是在傻等而已。特别是当传输的数据量比较大的时候,比如进行大文件复制,如果所有数据都要经过 CPU,实在是有点儿太浪费时间了。
因此,计算机工程师们,就发明了 DMA 技术,也就是直接内存访问(Direct Memory Access)技术,来减少 CPU 等待的时间。

理解 DMA,一个协处理器

确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kafka作为实时数据传输管道的标准解决方案,充分利用DMA技术实现了零拷贝,大幅提升了数据传输效率。DMA技术通过减少CPU参与,实现内存和I/O设备的数据传输,从而加速数据传输过程。Kafka利用DMA技术,通过Java NIO库的transferTo方法,实现了从硬盘直接读取数据到网络设备的传输,避免了数据在内存中的多次复制,从而将数据传输次数从四次减少到两次,并且全部通过DMA进行传输,实现了零拷贝。这种零拷贝方式大幅提升了数据传输的吞吐量,使得Kafka成为实时数据传输管道的标准解决方案。文章通过介绍DMA技术的原理、作用和效果,以及Kafka如何利用DMA实现零拷贝,深入阐述了DMA技术在实时数据传输中的重要性和应用价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入浅出计算机组成原理》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(51)

  • 最新
  • 精选
  • 免费的人
    从kafka论文里摘的: In addition we optimize the network access for consumers. Kafka is a multi-subscriber system and a single message may be consumed multiple times by different consumer applications. A typical approach to sending bytes from a local file to a remote socket involves the following steps: (1) read data from the storage media to the page cache in an OS, (2) copy data in the page cache to an application buffer, (3) copy application buffer to another kernel buffer, (4) send the kernel buffer to the socket. This includes 4 data copying and 2 system calls. On Linux and other Unix operating systems, there exists a sendfile API [5] that can directly transfer bytes from a file channel to a socket channel. This typically avoids 2 of the copies and 1 system call introduced in steps (2) and (3). Kafka exploits the sendfile API to efficiently deliver bytes in a log segment file from a broker to a consumer.

    作者回复: 👍

    2019-08-20
    35
  • yhh
    如果我们的应用程序需要对数据做进一步的加工,那还能使用零拷贝吗

    作者回复: yhh同学, 你好,那就不能了,我们需要把数据复制到内存里面来,在用户态用程序进行处理。

    2019-08-20
    5
    23
  • soimage
    看到最后,也没看出kafka快跟dma有关系,倒是跟zero-copy关系大一些,通过砍掉两次内核空间和用户空间的数据拷贝,以及内核态和用户态的切换成本来优化

    作者回复: soimage, 这样说也对,不过砍完之后数据传输其实都是DMA的过程了。

    2019-09-16
    3
    19
  • 前端西瓜哥
    我记得 Nginx 的静态服务器貌似也是零拷贝。市面上常见的web服务器的静态服务器应该都实现了零拷贝吧?

    作者回复: Fstar同学, 你好,我不是一个Web服务器的专家,所以其他Web服务器我不太清楚。不过Nginx的确是可以通过配置sendfile的开关on/off来控制是不是zero copy的

    2019-10-02
    5
  • coder
    超算里面核与核之间的数据拷贝,一般会通过基于IB总线的RDMA来完成,可以避免过cpu内核的开销,希望徐老师能讲一下rDMA

    作者回复: coder同学, 你好,超算里面的rDMA我还真没有了解过。等我抽空先自己学习一下。

    2019-08-19
    5
  • 纵横四海1949
    从C盘复制数据到D盘是怎么个过程呢?

    作者回复: 看这个程序怎么写啊,可以走DMA也可以不走DMA。 不走DMA就是要通过user space在内存里面复制中转。

    2019-09-04
    2
    3
  • 安排
    C语言可以直接调Linux系统api实现零拷贝吗?有哪些api?

    作者回复: 安排同学, 你好,Linux Kernel里有sendfile函数来实现零拷贝

    2019-08-19
    3
    3
  • fcb的鱼
    cpu处理的是用户内存中的数据,访问不到操作系统中的数据。DMA处理的是操作系统内核中的数据,访问不到用户内存。可以这也理解吧?要不然为啥不让DMAC直接将数据从硬盘读到用户的内存呢?

    作者回复: fcb的鱼同学, 你好,我觉得你在这里把软件和硬件的各个概念混在一起了。 1. CPU是硬件,操作系统是软件。内存也是硬件,数据都是加载到内存里面的。 2. “操作系统内核中的数据”存放在哪里?也是存放在内存里呀。 3. DMAC也是一个硬件,我们这里写的过程,就是直接从硬盘读数据到内存呀。

    2020-02-07
    3
    2
  • 如果不是由硬盘而是要从程序到网卡,可以省略socket buffer这一步吗?

    作者回复: 袭同学, 你好,什么叫做“程序到网卡”呢?其实从硬件的角度,只有内存、硬盘、网卡这些设备并没有“程序”这个东西。 需要把软件代码和硬件设备分离开来想这个问题。

    2019-08-23
    2
    1
  • 一步
    >第一次,是通过 DMA,从硬盘直接读到操作系统内核的读缓冲区里面。第二次,则是根据 Socket 的描述符信息,直接从读缓冲区里面,写入到网卡的缓冲区里面。 这个实现过程是硬盘向DMAC发出控制信号,由DMAC拉取数据,然后又因为目标地址是网卡,地址固定?所以不用经过寻址的过程吗?

    作者回复: 不是,是总线交给了DMA控制器,不需要CPU参与。地址空间还是需要的。

    2021-09-29
收起评论
显示
设置
留言
51
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部