【博客369】kafka的零拷贝

tech2022-08-03  157

内容: 记录kafka快的其中一个原因:零拷贝、

不使用零拷贝技术时:一个进程读取磁盘内容并发送出去的过程如下

1、操作系统从磁盘读取数据到内核空间的 pagecache 2、应用程序读取内核空间的数据到用户空间的缓冲区 3、应用程序将数据(用户空间的缓冲区)写回内核空间到套接字缓冲区(内核空间) 4、操作系统将数据从套接字缓冲区(内核空间)复制到通过网络发送的网卡缓冲区 实际调用函数内容是 1:调用read函数,文件数据copy到内核缓冲区 2:read函数返回,文件数据从内核缓冲区copy到用户缓冲区 3:write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区 4:数据从socket缓冲区copy到相关协议引擎。 原始方法显然是低效的,有四次 copy 操作和两次系统调用。如果使用零拷贝技术就可以减少 不必要的拷贝。

零拷贝技术:

使用sendfile方法,可以允许操作系统将数据从 pagecache 直接发送到网络,这样避免重新复制 数据。所以这种优化方式,只需要最后一步的copy操作,将数据复制到网卡缓冲区。如下图

“零拷贝技术”只用将磁盘文件的数据复制到页面缓存中一次,然后将数据从页面缓存直接发送到 网络中(发送给不同的订阅者时,都可以使用同一个页面缓存),避免了重复复制操作。

性能提升:

如果有100个消费者: 1、不使用零拷贝技术,数据复制次数为4*100=402、使用“零拷贝技术”只需要1+100=101次,其中一次为从磁盘复制到页面缓存,100次表示100个 消费者各自读取一次页面缓存。

适用场景:不是所有的都可以使用零拷贝

读取磁盘文件后,不需要做其他处理,直接用网络发送出去。如果读取磁盘的数据需要用程序进一步 处理的话,必须要经过第二次和第三次数据copy,让应用程序在内存缓冲区处理。
最新回复(0)