zero copy

zero copy

10个消费者订阅了同一个topic

1、在零拷贝的情况下,是10+1次copy,因为第1次是从磁盘到pagecache,其余10次是从pagecache到socket

2、那没有零拷贝的情况下,也是有pagecache的,按理来说,应该是10+4次copy呀,为什么是40次呢,为什么每个消费者都要从磁盘重新开始,而不是直接利用pagecache呢

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
PandaCazz 2021-03-28 21:21:21

后面【内核空间缓冲区 -> Socket缓冲区】这次copy不见了,不知道是不是内核空间缓冲区取代Socket缓冲区,直接copy给了网卡。我是这么理解的,不知道理解错了没有。所以是41次和11次。老师快来答疑一下

快乐撸猫少年 2020-04-28 12:06:44

pagecache 和 bufferpache 都是属于内核缓冲区缓存。其实kafka的空中接力,实际上是数据仅写入pagecache,然后pagecache数据会随着内核中flusher线程的调度以及对sync()/fsync()的调用写回到磁盘。另外,如果consumer要消费的消息不在pagecache里,才会去磁盘读取,并且会顺便预读出一些相邻的块放入page cache,以方便下一次读取。所以整个生产-消费过程里,磁盘访问非常少。如果Kafka producer的生产速率与consumer的消费速率相差不大的情况下,读写完全就靠pagecache就可以完成整个生产-消费过程而不经过磁盘。所以这就是空中接力的缘故。而rabbitmq不一样,它在自身维护一个Buffer作为自己的一个缓存,数据在写入文件时,首先会写入到这个Buffer,然后经过一定的机制直接写入磁盘。rabbitmq官方链接-消息写入磁盘。而且rabbitmq需要有ack机制。

一般来讲,在用户空间的写入数据到磁盘,在内核空间里,都直接写进磁盘而不会经过内核缓冲区的pagecache,读的时候,会先从内核空间的内核缓冲区的pagecache或buffercache读取数据,读不到才到磁盘里去读。所以我认为kafka用pagecache实现高性能,并不是kafka就是因为使用pagecache就很快,而是它读和写(关键是写)都是使用pagecache。

课程里面的拷贝次数不是关键,而是理解使用pagecache 和零拷贝机制。

  • 提问者 慕移动2268350 #1
    还是没有正面回答我的问题,我关心的就是次数,次数如果没有意义,那如何看出零拷贝优化了多少呢
    2020-04-28 12:34:39
  • 快乐撸猫少年 回复 提问者 慕移动2268350 #2
    次数是真没意义,课程举得例子是极端的情况下,正常情况下,只有一条数据从磁盘里面取出来是会放在内核缓冲区的,因为磁盘的读速度是比内存慢很多的。除非采取directIO。零拷贝能优化多少也不这样看的,最重要的就是零拷贝的是减少数据在用户空间和内核空间的流转。
    2020-04-28 12:48:42
  • 快乐撸猫少年 回复 提问者 慕移动2268350 #3
    课程具的例子也不太好。一个消费者读取一个消息。一般情况下从本地磁盘读取数据,到通过网络发送出去,用户态和内核态之间,要发生4次切换,这是其一;其二,数据从磁盘拿出来过后,一共要经过4次拷贝;所以说,要经过4次切换和4次拷贝。用了零拷贝技术,只要2次切换,2次拷贝,就可以了。但是不能说零拷贝技术就提升了2倍读取速度。这个在实际生产情况下是没法确定的。所以这个拷贝次数在其他情况下具体是多少是没用的。只要明确知道零拷贝的确能减少拷贝次数以及在单次读取的能减少哪个拷贝步骤即可。
    2020-04-28 13:31:25
Java架构师讲师团 2020-04-04 23:33:09

我的意思是 每个消费者都要经历四次过程 :

  1. 磁盘->OS内核

  2. OS内核->JVM(用户态)

  3. 用户态->OS内核

  4. OS内核->网卡接口

  • 提问者 慕移动2268350 #1
    那我是不是可以理解为40次里面不包含使用pagecache。而11次里面不仅使用了零拷贝,还使用了pagecache
    2020-04-04 23:47:35
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师