零拷贝应用场景

零拷贝技术是一种优化数据传输和处理的技术,通过减少数据在内核空间和用户空间之间的拷贝次数,提高系统性能。许多现代的高性能网络框架和系统也采用了零拷贝技术来提升性能。

例如Netty、Kafka、gRPC、Redis、HTTP/2/3

Netty

在Netty中,通过直接使用DirectBuffer,可以避免从用户空间复制到内核空间的过程,从而提高性能。此外,Netty提供了CompositeByteBuf类,支持将多个消息组合在一起进行传输,减少系统调用次数,这也是零拷贝的一种形式。

ByteBuf :是 Netty 中用于存储二进制数据的主要容器,ByteBuf 可以直接在内部缓冲区中操作数据,减少了不必要的内存拷贝。它提供了多种方法来访问和操作缓冲区数据,如读写操作、切片等。ByteBuf 会在不再需要时自动释放内存,减少内存泄漏的风险。Direct ByteBuf基于直接内存的 ByteBuf 实现,它直接在堆外内存中操作数据。这种实现方式适用于需要大量数据传输的场景

Pooled ByteBuf:预先分配一定数量的缓冲区,然后复用这些缓冲区,减少内存分配和释放的开销。

Kafka、RocketMQ

主要通过Page Cache、MMap和Sendfile

Kafka 利用 Linux 的页面缓存(Page Cache)来减少磁盘 I/O,当数据写入磁盘时,操作系统会自动将其缓存到内存中,从而减少了后续读取时的磁盘 I/O。Kafka 使用文件映射(MMap)技术,将pagecache的数据直接映射到用户空间,无需将数据从内核复制到用户空间。(rocketmq,一次mmap调用,一次write调用。一次磁盘到内核,一次内核到socket,一次socket到网卡)。Sendfile是直接将pagecache的数据发送给socket。无需经过用户空间。零cpu拷贝(kafka,一次sendfile调用和返回,一次磁盘到内核,(一次内核到socket),一次socket到网卡)。

零拷贝主要用在broker向消费者发送消息的过程。传统的做法是先从磁盘读到内核,再从内核拷贝到用户空间,然后从用户空间拷贝到网络缓冲区。过程涉及多次数据拷贝和上下文切换。Kafka利用sendfile系统调用,直接将pagecache的数据发送到网络缓冲区。避免了数据在用户空间和内核空间之间的拷贝。

gRPC

gRPC 是一个高性能、开源的远程过程调用(RPC)框架,支持多种语言。gRPC 在内部使用了零拷贝技术来提高性能。

主要使用缓冲池(Buffer Pool)来复用缓冲区,池化技术,减少内存分配和垃圾回收的压力。 

支持使用 DirectBuffer,缓冲区直接在堆外分配,减少数据在用户空间和内核空间之间的拷贝。

HTTP/2、HTTP/3

在传输大文件的时候,可以使用sendfile技术减少数据在内核空间和用户空间之间的拷贝次数。

Redis

在处理大对象时,可以使用Direct Buffer来减少数据拷贝。并使用缓冲池(Buffer Pool)来复用缓冲区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值