美文网首页
kafka高性能io的秘密

kafka高性能io的秘密

作者: 谁没有做过白日梦呢 | 来源:发表于2020-07-08 19:43 被阅读0次

    之前在项目中用到了kafka做消息传递,一直听说过kafka的性能非常高,这里总结下kafka为了实现高性能io的做了哪些设计用了什么方式。以对自己今后进行高性能服务设计作参考。

    1.批量消息处理

    kafka服务端在处理消息的时候,并不是生产者发送一条消息它处理一条,而是先攒一批消息然后一并进行处理,而且在之后的消息刷盘和发送给消费者,消息都是以一批的形式进行处理。这样的好处就是可以明显降低请求数,缓解broker的压力,提高处理效率,但是也存在消息发送不及时的缺点,即这种方式适用于对实时性要求不是特别高的系统

    2.顺序磁盘io

    众所周知磁盘io涉及到磁盘机械臂的机械运动,性能本身就不算特别高,如果还是随机磁盘io操作的话,性能就会大大降低,但是为了持久化消息以保证消息不丢失,又必须将消息写入磁盘,所以这里kafka在往磁盘上写消息时都是顺序写,一个文件写满了再开启一个新的文件继续写,这样顺序io就避免了随机io需要先寻址再进行读写导致的性能低下,消费的时候读消息也是从某个位置开始顺序读出来。

    3.利用PageCache缓存

    上面提到了磁盘io的性能很低,而才内存中进行读写则非常快,而kafka就利用了操作系统中的PageCache技术来利用内存加速消息的读写。PageCache是大部分操作系统都有的特性,即我们在平时程序中对磁盘里的文件进行读写时,并不是直接对磁盘进行操作,操作系统会将文件的一部分拷贝到内存中,我们则是对内存中的缓存进行读写,然后PageCache再一批一批将内存中的修改写入磁盘。

    而在PageCache中进行读写有两种情况,一种是PageCache中有数据,则可以直接进行读写,第二种是没有数据,则此时会发生一次缺页中断,操作系统会进行一次磁盘io将文件内容读到PageCache中,一般来说应用程序用过的PageCache不会立刻被操作系统清理,而是会使用LRU算法后续慢慢清理。而kafka由于一般刚写入的消息基本上会立刻被消费,所以PageCache的命中率非常高,非常好的利用到了PageCache的特性。

    4.零拷贝技术

    一般来说一条消息从文件读出来发送到消费者是这样一个流程:

    a.读取文件中的消息到内存

    b.将内存中的消息发送到网络端

    而在这个过程中2-3次数据拷贝,比如从文件读到PageCache中(如果命中PageCache则不用这步操作),从PageCache拷贝到应用程序内存空间,从内存空间拷贝到socket缓冲区,而kakfa利用系统中的一个系统调用,直接将消息从PageCache拷贝到socket中,减少一次数据拷贝,而且这种方式不用拷贝到应用程序的内存空间,dma控制器可以直接完成数据复制,速度更快

    相关文章

      网友评论

          本文标题:kafka高性能io的秘密

          本文链接:https://www.haomeiwen.com/subject/fhstcktx.html