ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

kafka高性能之道

2022-01-27 23:35:44  阅读:192  来源: 互联网

标签:DMA Kafka 之道 高性能 内核 IO 缓冲区 kafka 数据


1.概述

Kafka的特性之一就是高吞吐率,但是Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,但是Kafka即使是运行在普通的服务器上,Kafka也可以轻松支持每秒百万级的写入请求,超过了大部分的消息中间件,这种特性也使得Kafka在日志处理等海量数据场景广泛应用。Kafka会把收到的消息都写入到硬盘中,防止丢失数据。为了优化写入速度Kafka采用了两个技术顺序写入和Memory Mapped Files。

2.顺序写

因为硬盘是机械结构,每次读写都会寻址->写入,其中寻址是一个“机械动作”,它是最耗时的。所以硬盘最讨厌随机I/O,最喜欢顺序I/O。为了提高读写硬盘的速度,Kafka使用顺序I/O。这样省去了大量的内存开销以及节省了IO寻址的时间。但是单纯的使用顺序写入,Kafka的写入性能也不可能和内存进行对比,因此Kafka的数据并不是实时的写入硬盘中 。

3.Memory Mapped Files

Kafka充分利用了现代操作系统的分页存储,来利用内存提高I/O效率。Memory Mapped Files(后面简称mmap)也称为内存映射文件,在64位操作系统中一般可以表示20G的数据文件,它的工作原理是直接利用操作系统的PageCache实现文件到物理内存的直接映射。完成映射后,用户对内存的所有操作会被操作系统自动的刷新到磁盘上,极大地降低了IO使用率。

image

4.Zero Copy

  • 传统IO操作

    1.用户进程调用操作系统的read方法向操作系统发起IO请求,请求读取数据到自己的内存缓冲区,自己进入阻塞状态等待数据返回

    2.操作系统收到请求后,进一步将IO请求发送给磁盘

    3.磁盘驱动器收到操作系统(内核)的IO请求,把数据从磁盘读取到驱动器的缓冲中,此时不占用CPU。当驱动器的缓存区被读满后,向内核发起中断信号告知自己缓冲区已满。

    4.内核收到中断,使用CPU将磁盘驱动器的缓存中的数据拷贝到内核缓冲区中。

    5.如果内核缓冲区的数据少于用户申请的读的数据,重复步骤3跟步骤4,直到内核缓冲区的数据足够多为止。

    6.将数据从内核缓冲区拷贝到用户缓冲区,同时从系统调用中返回。完成任务

    image

  • DMA读取

    1.用户进程调用操作系统的read方法向操作系统发起IO请求,请求读取数据到自己的内存缓冲区,自己进入阻塞状态等待数据返回

    2.操作系统收到请求后,进一步将IO请求发送DMA。然后让CPU干别的活去。

    3.DMA进一步将IO请求发送给磁盘。

    4.磁盘驱动器收到DMA的IO请求,把数据从磁盘读取到驱动器的缓冲中。当驱动器的缓冲区被读满后,向DMA发起中断信号告知自己缓冲区已满。

    5.DMA收到磁盘驱动器的信号,将磁盘驱动器的缓存中的数据拷贝到内核缓冲区中。此时不占用CPU。这个时候只要内核缓冲区的数据少于用户申请的读的数据,内核就会一直重复步骤3跟步骤4,直到内核缓冲区的数据足够多为止。

    6.当DMA读取了足够多的数据,就会发送中断信号给CPU。

    7.CPU收到DMA的信号,知道数据已经准备好,于是将数据从内核拷贝到用户空间,系统调用返回。

    跟IO中断模式相比,DMA模式下,DMA就是CPU的一个代理,它负责了一部分的拷贝工作,从而减轻了CPU的负担。DMA的优点就是:中断少,CPU负担低。

    image

  • ZeroCopy

    Kafka服务器在响应客户端读取的时候,底层使用ZeroCopy技术,直接将数据通过内核空间传递输出,数据并没有抵达用户空间。

    1.一般方案

    1.文件在磁盘中数据被copy到内核缓冲区
    2.从内核缓冲区copy到用户缓冲区
    3.用户缓冲区copy到内核与socket相关的缓冲区。
    4.数据从socket缓冲区copy到相关协议引擎发送出去

    image

    2.ZeroCpy

    1.文件在磁盘中数据被copy到内核缓冲区
    2.从内核缓冲区copy到内核与socket相关的缓冲区。
    3.数据从socket缓冲区copy到相关协议引擎发送出去

    image

标签:DMA,Kafka,之道,高性能,内核,IO,缓冲区,kafka,数据
来源: https://www.cnblogs.com/ZT-666/p/15851604.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有