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操作。