kafka快速读取解析
kafka作为消息中间件,虽然是基于磁盘做数据存储。但是有高性能、高吞吐、低延迟等特点。
顺序读写
磁盘顺序读写性能高于内存的随机读写
kafka将消息记录持久化到磁盘,有新消息时,通过不断追加的方式将message追加到文件磁盘末尾
页缓存(Page Cache)
kafka利用了操作系统本身的 page cache,即利用的是操作系统自身的内存而不是JVM空间内存,这样做主要有以下两点好处
- 避免GC问题:随着JVM中数据不断增多,垃圾回收会变的缓慢而复杂,利用操作系统本身的缓存不会存在GC问题
- 避免Object消耗:使用java堆,java对象的内存消耗比较大,通常是所存储数据的两倍甚者更多
零拷贝(sendfile)
零拷贝只减少不必要的拷贝次数。通常是减少IO读写过程中的拷贝次数。
零拷贝主要减少两部分的开销:
- 数据不再拷贝至用户态,直接在核心态之间传递
- 数据不在通过CPU调度,通过DMA让子系统直接访问主内存,从而减少内存太直接的拷贝次数
详情可以参考以下衍变过程:
常规数据文件传输
比如:读取文件,再用socket发送出去
传统方式实现