您的位置: 首页 > 老体工作 > 工作动态

尊龙凯时公司官网:大数据开发最火技术Kafka背后的“黑科技”


本文摘要:Kafka是由Apache软件基金会研发的一个进源流处置平台,被普遍地应用于在数据缓冲器、异步通信、汇聚日志、系统解法耦等方面。

Kafka是由Apache软件基金会研发的一个进源流处置平台,被普遍地应用于在数据缓冲器、异步通信、汇聚日志、系统解法耦等方面。相比较于其他少见消息系统,Kafka在确保了大部分功能特性的同时,还在低陡然、较低延后等方面有很引人注目的展现出。

这篇文章不同于其他讲解Kafka用于或构建的文章,只是谈谈Kafka用了什么“白科技”使他在性能方面有这么引人注目的展现出。消息顺序载入磁盘磁盘大多数都还是机械结构(SSD不出辩论的范围内),如果将消息以随机写出的方式现金磁盘,就必须按柱面、磁头、扇区的方式传输速率,传输速率是一个“机械动作”也最耗时。

为了提升读取硬盘的速度,Kafka就是用于顺序I/O。图1Kafka顺序IO上图中,每个partition就是一个文件,每条消息都被append到该partition中,归属于顺序写出磁盘,因此效率十分低。这种方法有一个缺失——没办法移除数据,所以Kafka是会移除数据的,它不会把所有的数据都保有下来,每个消费者(Consumer)对每个Topic都有一个offset用来回应加载到了第几条数据。关于磁盘顺序读取和随机读取的性能,提到一组Kafka官方得出的测试数据(Raid-5,7200rpm):SequenceI/O:600MB/sRandomI/O:100KB/s所以通过只做到SequenceI/O,给Kafka带给了性能的很大提高。

ZeroCopy考虑到一个web程序加载文件内容并传输到网络的场景,构建的核心代码如下:图2普通read方法虽然只是两个调用,但却经过了4次copy,其中有2次cpucopy,还有多次用户态与内核态的上下文转换,这不会减轻cpu的开销,而零拷贝就是为了解决问题这种陈旧。#mmap:增加拷贝次数的一种方法是调用mmap()来替换read()调用:应用程序调用mmap(),磁盘上的数据不会通过DMA被拷贝到内核缓冲区,接着操作系统不会把这段内核缓冲区与应用程序分享,这样就不必须把内核缓冲区的内容往用户空间拷贝。应用程序再行调用write(),操作系统必要将内核缓冲区的内容拷贝到socket缓冲区中,最后再行把数据零担网卡去。

图3mmap方法用于mmap可以增加一次cpucopy,但也不会遇上一些陷阱,当你的程序map了一个文件,但是当这个文件被另一个进程切断(truncate)时,write系统调用不会因为采访非法地址而被SIGBUS信号中止。一般来说可以通过,为SIGBUS信号创建信号处理程序或用于文件租凭(fileleasing)的方式去解决问题,这里就仍然赘述了。#sendfile:从2.1版内核开始,Linux引进了sendfile来修改操作者图4sendfile方法sendfile()方法引起DMA引擎将文件内容拷贝到一个加载缓冲区(DMAcopy)然后由内核将数据拷贝到socketbuffer(cpucopy)最后再行拷贝到网卡(DMAcopy)用于sendfile不仅增加了数据拷贝的次数,还增加了上下文转换,数据传输一直只再次发生在kernelspace聊到这里,sendfile最少还必须一次cpucopy,那么这一步能无法省却呢?为了避免内核已完成的所有数据拷贝,我们必须一个反对搜集(gather)操作者的网络接口。同时,在内核版本2.4中,也改动了套接字缓冲区描述符以适应环境零拷贝拒绝。

这种方法不仅增加了多个上下文转换,还几乎中止了cpucopy。图5sendfile方法(DMAgather)sendfile系统调用利用DMA引擎将文件内容拷贝到内核缓冲区去,然后将具有文件方位和长度信息的缓冲区描述符加到socket缓冲区去,这一步会将内核中的数据拷贝到socket缓冲区中,DMA引擎不会将内核缓冲区的数据拷贝到协议引擎中去,防止了最后一次CPU拷贝。零拷贝技术十分广泛,JAVA的transferTo、transferFrom方法就是ZeroCopy。


本文关键词:尊龙凯时公司官网

本文来源:尊龙凯时公司官网-www.xhjek.com