Kafka的性能
Kafka单个节点的极限处理能力达到每秒钟2000万条消息,吞吐量达到每秒钟600MB
揭秘一:使用批处理消息提升服务端处理能力
Kafka处理消息是一批一批处理的,因为客户端发送消息到服务端之间是有传输时延的,如果能够将消息批量发送,并且消息的大小不会太大,这样极大的较少了发送时延
在Producer生产者,Kafka的客户端SDK中,Producer只提供了单条消息发送的Send()方法,但是,实际上Kafka的SDK客户端在实现消息发送逻辑的时候,采用了异步批量发送的机制
在调用send()方法后,无论你是同步发送还是异步发送,Kafka会把这条消息缓存在内存中,,然后选择合适的时机把缓存中的所有消息组成一批,一次性发送给Broker,你也可以理解成就是先“蓄力”再发送
这合适的时机主要有两种:一种是批量消息大小达到限定的程度(默认是1M),另一种是“蓄力”的时间达到一定的上限(默认是0ms,也就是有消息就立即发送)
- 批量消息发送有个很重要的一点:批量的消息都是属于同一分区的,批量的消息都是属于同一分区的,批量的消息都是属于同一分区的
在Broker服务端,Kafka不会把收到的这批消息拆解出一条一条再处理,无论是写入磁盘、复制、从磁盘中读取,批消息都不会解开,一直是作为“批消息”来处理
在Consumer端,消息也是批量拉取的,因为同一批消息都是属于同一个分区,拉到消息后再一条一条解开交给用户处理
揭秘二:使用顺序读写提升磁盘IO性能
磁盘的顺序读写性能远远好于随机读写,Kafka充分利用了磁盘的这个特性,对于每个分区,从Producer收到的消息,顺序地写入对应的log文件,一个文件写满了,就开启一个新的文件这样顺序写下去;消费的时候,也是从某个全局的位置开始,是某个log文件中的某个位置开始,顺序地把消息读出来
揭秘三:利用PageCache加速消息读写
Kafka利用操作系统的PageCache加速消息读写。PageCache就是操作系统在内存中给磁盘上的文件建立的缓存。无论我们使用什么语言编写的程序,在调用系统的API读写文件的时候,并不会直接去读写磁盘上的文件,应用程序实际操作的都是PageChace,也就是文件在内存中的缓存副本
应用程序写入文件的时候都是写入到内存的PageCache,然后再由操作系统一批一批地写入到磁盘上。读取文件时,如果PageCache有数据则直接从中读取,如果没有就产生一个缺页中断,将数据从磁盘文件中复制到PageCache中,注意这个过程是阻塞而且很慢
揭秘四:ZeroCopy零拷贝
传统发送数据的方式是这样的,调用操作系统接口将数据从磁盘中读取出来,将在操作系统内核空间的数据拷贝到用户应用程序内存空间,然后应用程序处理后,将应用空间的数据发送到Socket通道,最后Socket发送到网卡,再通过网卡发送到外面
所以这种传统的数据读取方式需要经过多次数据拷贝,如果能将减少那么多的数据拷贝,将对数据读取的性能有极大的提升,在Linux 2.4版本中,引入了零拷贝,磁盘文件先拷贝到操作系统内核缓冲区,再从内核缓冲区拷贝到网卡,这样相对于传统的读取发送消息的方式, 减少了两次拷贝操作
- 其他:使用零拷贝,不仅能减少复制拷贝次数,还能减少上下文切换,缓存行污染
资料: https://www.jianshu.com/p/275602182f39