zero copy
10个消费者订阅了同一个topic
1、在零拷贝的情况下,是10+1次copy,因为第1次是从磁盘到pagecache,其余10次是从pagecache到socket
2、那没有零拷贝的情况下,也是有pagecache的,按理来说,应该是10+4次copy呀,为什么是40次呢,为什么每个消费者都要从磁盘重新开始,而不是直接利用pagecache呢
正在回答 回答被采纳积分+1
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 和零拷贝机制。
我的意思是 每个消费者都要经历四次过程 :
磁盘->OS内核
OS内核->JVM(用户态)
用户态->OS内核
OS内核->网卡接口
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星