玩转Kafka—Kafka高性能原因分析
玩转Kafka—Kafka高性能原因分析
Kafka最大的特点:高吞吐,即使在普通的机械硬盘下也可以达到每秒几百万的处理量
对比RocketMQ:
那么Kafka为什么能实现如此高的吞吐量呢?
主要以下四个方面:
- 磁盘的顺序读写
- 页缓存
- 零拷贝技术
- 批量处理
下面我们来分别解释下
1 磁盘的顺序读写
图片来自《The Pathologies of Big Data》
由上到下三个橙色的进度条分别表示机械硬盘、固态硬盘和内容的随机访问速度
由上到下三个橙色的进度条分别表示机械硬盘、固态硬盘和内容的顺序访问速度
可见,在顺序读写下无论是固态硬盘还是机械硬盘都是和内存差不多的。
2 页缓存
操作系统本身的页缓存(Page Cache),存储紧凑的数据
想要了解页缓存,就必须先要了解什么是“页”,这个在操作系统课程中有比较多的涉及。
页是操作系统存储的一个基本单位,在分页式的存储中,分页存储管理将进程的逻辑地址空间分成若干个页,并为各页加以编号,从0开始。把内存的物理空间分成若干个块,同样加以编号从0开始。为进程分配内存时,以块为单位,将进程的若干个页分别装入到多个可以不相邻接的物理块中。由于进程最后一页通常装不满一块,则剩余页面叫做“页内碎片”。
页面大小: 页面大小应选择适中,并且应该是2的N次幂,通常为1KB~8KB
而页缓存
是一个相对独立的概念,其根本目的是为了加速对后端设备的IO效率,比如文件的读写。
3 零拷贝技术
借鉴了Linux操作系统下的零拷贝技术,在页缓存和Socket缓冲区之间进行切换,而避免了用户态到内核态之前的切换。
那么,什么是用户态和内核态:
- 用户态:指非特权状态。在此状态下,执行的代码被硬件限定,不能进行某些操作,比如写入其他进程的存储空间,以防止给操作系统带来安全隐患。
- 内核态:操作系统内核所运行的模式,运行在该模式的代码,可以无限制地对系统存储、外部设备进行访问。
用户态与内核态之间的切换:
-
系统调用
-
异常:当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
-
外围设备的中断:当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序
非零拷贝
零拷贝
零拷贝
:避免用户态和内核态之间的拷贝
4 批量处理
高效利用网络带宽,批量压缩和处理
- 点赞
- 收藏
- 关注作者
评论(0)