48 | DMA:为什么Kafka这么快?
该思维导图由 AI 生成,仅供参考
理解 DMA,一个协处理器
- 深入了解
- 翻译
- 解释
- 总结
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-2035 - yhh如果我们的应用程序需要对数据做进一步的加工,那还能使用零拷贝吗
作者回复: yhh同学, 你好,那就不能了,我们需要把数据复制到内存里面来,在用户态用程序进行处理。
2019-08-20523 - soimage看到最后,也没看出kafka快跟dma有关系,倒是跟zero-copy关系大一些,通过砍掉两次内核空间和用户空间的数据拷贝,以及内核态和用户态的切换成本来优化
作者回复: soimage, 这样说也对,不过砍完之后数据传输其实都是DMA的过程了。
2019-09-16319 - 前端西瓜哥我记得 Nginx 的静态服务器貌似也是零拷贝。市面上常见的web服务器的静态服务器应该都实现了零拷贝吧?
作者回复: Fstar同学, 你好,我不是一个Web服务器的专家,所以其他Web服务器我不太清楚。不过Nginx的确是可以通过配置sendfile的开关on/off来控制是不是zero copy的
2019-10-025 - coder超算里面核与核之间的数据拷贝,一般会通过基于IB总线的RDMA来完成,可以避免过cpu内核的开销,希望徐老师能讲一下rDMA
作者回复: coder同学, 你好,超算里面的rDMA我还真没有了解过。等我抽空先自己学习一下。
2019-08-195 - 纵横四海1949从C盘复制数据到D盘是怎么个过程呢?
作者回复: 看这个程序怎么写啊,可以走DMA也可以不走DMA。 不走DMA就是要通过user space在内存里面复制中转。
2019-09-0423 - 安排C语言可以直接调Linux系统api实现零拷贝吗?有哪些api?
作者回复: 安排同学, 你好,Linux Kernel里有sendfile函数来实现零拷贝
2019-08-1933 - fcb的鱼cpu处理的是用户内存中的数据,访问不到操作系统中的数据。DMA处理的是操作系统内核中的数据,访问不到用户内存。可以这也理解吧?要不然为啥不让DMAC直接将数据从硬盘读到用户的内存呢?
作者回复: fcb的鱼同学, 你好,我觉得你在这里把软件和硬件的各个概念混在一起了。 1. CPU是硬件,操作系统是软件。内存也是硬件,数据都是加载到内存里面的。 2. “操作系统内核中的数据”存放在哪里?也是存放在内存里呀。 3. DMAC也是一个硬件,我们这里写的过程,就是直接从硬盘读数据到内存呀。
2020-02-0732 - 袭如果不是由硬盘而是要从程序到网卡,可以省略socket buffer这一步吗?
作者回复: 袭同学, 你好,什么叫做“程序到网卡”呢?其实从硬件的角度,只有内存、硬盘、网卡这些设备并没有“程序”这个东西。 需要把软件代码和硬件设备分离开来想这个问题。
2019-08-2321 - 一步>第一次,是通过 DMA,从硬盘直接读到操作系统内核的读缓冲区里面。第二次,则是根据 Socket 的描述符信息,直接从读缓冲区里面,写入到网卡的缓冲区里面。 这个实现过程是硬盘向DMAC发出控制信号,由DMAC拉取数据,然后又因为目标地址是网卡,地址固定?所以不用经过寻址的过程吗?
作者回复: 不是,是总线交给了DMA控制器,不需要CPU参与。地址空间还是需要的。
2021-09-29