马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
媒介
kafka 作为一个高吞吐量的分布式消息体系,广泛应用与实时应用场景中。为了实现高效的数据传输,kafka利用了零拷贝技能(zero-copy)显着进步了性能。本文将详细解说 Kafka 怎样利用零拷贝技能优化数据传输。
什么是零拷贝
零拷贝技能目的是淘汰数据传输的服从。在传统的数据传输过程中,数据在内核态和用户态之间举行多次拷贝,而零拷贝技能在内核态直接处理处罚数据传输,制止了冗余的拷贝操纵。
传统的传输过程,在没有零拷贝技能的条件下。流程如下:
- 数据从磁盘读取到内核缓冲区(pageCache)。数据起首从磁盘读取到内核态的页面缓存(Page Cache)中。这一步由操纵体系负责,通过磁盘驱动步伐完成。
- 数据从内核缓冲区复制到用户缓冲区.应用步伐发起读取哀求后,数据从内核态的页面缓存(Page Cache)复制到用户态的缓冲区。这一步通常由 read 体系调用完成。
- 数据从用户缓冲区复制到内核缓冲区举行传输。应用步伐在准备发送数据时,数据从用户态的缓冲区再次复制到内核态的网络缓冲区。这一步通常由 write 体系调用或其他类似的体系调用完成。
- 数据通过网络发送。内核态的网络缓冲区中的数据终极通过网络接口发送到目的呆板。
通过这种方式你会发现举行了多次数据复制,占用了大量的CPU和内存资源,那怎么办呢?
零拷贝技能
为了进步数据传输服从,可以采取零拷贝技能,制止数据在用户态和内核态之间多次拷贝。Linux体系提供了多种零拷贝技能mmap,sendfile和splice等。
sendfile
sendfile 体系调用是一种常见的零拷贝技能,可以在内核态直接将数据从文件形貌符传输到网络套接字,而无需在用户态举行数据拷贝。 sendfile接口界说如下
- ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
复制代码 利用sendfile时,数据传输过程如下:
1.数据从磁盘读取到内核缓冲区(Page Cache)
与传统方法类似,数据从磁盘读取到内核态的页面缓存(Page Cache)。
2.数据直接从内核缓冲区发送到网络
利用 sendfile 体系调用,数据直接从内核态的页面缓存(Page Cache)传输到网络套接字,制止了从内核态到用户态的多次拷贝。
sendfile示例代码如下:
- #include <sys/sendfile.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <stdio.h>
- int main() {
- int source_fd = open("source_file", O_RDONLY);
- int dest_fd
复制代码 |