kafka是一个高吞吐速度的消息中间件,可以部署在廉价的主机上。
速度快的原因有两个:
1.从写数据方面:写入的数据按顺序写入到磁盘;memory mapped files
磁盘读写的快慢取决于你怎么使用它,写入的时候可以选择顺序写入和随机写入,kafka选择的时顺序写入机制,该机制的读写速度和内存的速度基本持平
使用顺序写入的好处:
1.磁盘顺序写入的速度比内存随机速度快
2.在内存中操作时,jvm的堆中数据量大,GC时的效率低,使用磁盘可以避免这个问题
3.顺序写入系统冷启动后,磁盘缓存依然可以使用。
memory mapped files
kafka写入数据时不是实时写入磁盘的,它利用了现代操作系统分页存储来利用内存提高I/O效率,先写在内存中,在一定的时间flush到磁盘中。
Kafka提供了一个参数——producer.type来控制是不是主动flush,如果Kafka写入到mmap之后就立即flush然后再返回Producer叫 同步 (sync);写入mmap之后立即返回Producer不调用flush叫异步 (async)
memory mapped files(mmap)即内存映射文件,在64位系统中一般可以表示20G的数据文件,它的工作原理使用操作系统的page来实现文件到物理内存的直接映射。映射之后
对物理内存的操作也可以同步到硬盘上。这种方式可以获取很大的I/O提升,省去了用户空间到内核空间的开销(read会把数据先放在内核空间,然后复制到用户空间的内存中)
2.从读数据方面
基于sendfile实现zero copy
传统read/write方式进行网络文件传输的方式,在这个过程当中,文件数据经过四个copy过程
硬盘---内核buf--用户buf----socket相关缓冲区---协议引擎
sendfile系统调用可以提供一种减少以上多次copy,提升文件传输性能的方法。
硬盘---内核buf----socket相关缓存----协议引擎
在内核版本2.4之后,文件描述符结果被改变,sendfile实现了更简单的方式,再次减少了一次copy操作。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。