首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

大数据开发最火技术Kafka背后的“黑科技”

2020-01-21

Kafka是由Apache软件基金会开发的一个开源流处理渠道,被广泛地应用在数据缓冲、异步通讯、聚集日志、体系解耦等方面。相比较于其他常见音讯体系,Kafka在保证了大部分功用特性的一起,还在高吞吐、低推迟等方面有很杰出的体现。这篇文章不同于其他介绍Kafka运用或完结的文章,仅仅谈谈Kafka用了什么 黑科技 使他在功能方面有这么杰出的体现。

磁盘大多数都仍是机械结构,假如将音讯以随机写的办法存入磁盘,就需求按柱面、磁头、扇区的办法寻址,寻址是一个 机械动作 也最耗时。为了进步读写硬盘的速度,Kafka便是运用次序I/O。 

图 1 Kafka次序IO

上图中,每个partition便是一个文件,每条音讯都被append 到该 partition 中,归于次序写磁盘,因而功率十分高。这种办法有一个缺点 没有办法删去数据 ,所以Kafka是不会删去数据的,它会把一切的数据都保存下来,每个顾客对每个Topic都有一个offset用来表明读取到了第几条数据 。

关于磁盘次序读写和随机读写的功能,引证一组Kafka官方给出的测试数据:

所以经过只做Sequence I/O,给Kafka带来了功能的极大提高。

考虑一个web程序读取文件内容并传输到网络的场景,完结的中心代码如下:


图 2 一般read办法

尽管仅仅两个调用,但却经过了4次copy,其中有2次cpu copy,还有屡次用户态与内核态的上下文切换,这会加剧cpu的担负,而零仿制便是为了处理这种低效。

# mmap:

削减仿制次数的一种办法是调用mmap来替代read调用:


应用程序调用mmap,磁盘上的数据会经过DMA被仿制到内核缓冲区,接着操作体系会把这段内核缓冲区与应用程序同享,这样就不需求把内核缓冲区的内容往用户空间仿制。应用程序再调用write,操作体系直接将内核缓冲区的内容仿制到socket缓冲区中,最终再把数据发到网卡去。

图 3 mmap办法

运用mmap能够削减一次cpu copy,但也会遇到一些圈套,当你的程序map了一个文件,可是当这个文件被另一个进程切断时, write体系调用会由于拜访不合法地址而被SIGBUS信号停止。一般能够经过,为SIGBUS信号树立信号处理程序或运用文件租凭的办法去处理,这儿就不再赘述了。

# sendfile:

从2.1版内核开端,Linux引入了sendfile来简化操作


图 4 sendfile办法

sendfile 办法引发 DMA 引擎将文件内容仿制到一个读取缓冲区然后由内核将数据仿制到socket buffer最终再仿制到网卡运用sendfile不只削减了数据仿制的次数,还削减了上下文切换,数据传送一直只发生在kernel space

聊到这儿,sendfile至少还需求一次cpu copy,那么这一步能不能省去呢?为了消除内核完结的一切数据仿制,咱们需求一个支撑搜集操作的网络接口。一起,在内核版别2.4中,也修改了套接字缓冲区描述符以习惯零仿制要求。 这种办法不只削减了多个上下文切换,还彻底取消了cpu copy。

图 5 sendfile办法

sendfile体系调用使用DMA引擎将文件内容仿制到内核缓冲区去,然后将带有文件方位和长度信息的缓冲区描述符增加socket缓冲区去,这一步不会将内核中的数据仿制到socket缓冲区中,DMA引擎会将内核缓冲区的数据仿制到协议引擎中去,避免了最终一次CPU仿制。

零仿制技能十分遍及,JAVA的transferTo、transferFrom办法便是Zero Copy。

戳这儿,看该作者更多好文

热门文章

随机推荐

推荐文章