放荡的人生|面试题详解:Kafka为什么能那么快的6个原因( 三 )
- data = http://kandian.youth.cn/index/socket.read()// 读取网络数据
- File file = new File()
- file.write(data)// 持久化到磁盘
- file.flush()
- 首先通过 DMA copy 将网络数据拷贝到内核态 Socket Buffer
- 然后应用程序将内核态 Buffer 数据读入用户态(CPU copy)
- 接着用户程序将用户态 Buffer 再拷贝到内核态(CPU copy)
- 最后通过 DMA copy 将数据拷贝到磁盘文件
同时 , 还伴随着四次上下文切换 , 如下图所示
对于 kafka 来说 , Producer 生产的数据存到 broker , 这个过程读取到 socket buffer 的网络数据 , 其实可以直接在内核空间完成落盘 。 并没有必要将 socket buffer 的网络数据 , 读取到应用进程缓冲区;在这里应用进程缓冲区其实就是 broker , broker 收到生产者的数据 , 就是为了持久化 。
在此特殊场景下:接收来自 socket buffer 的网络数据 , 应用进程不需要中间处理、直接进行持久化时 。 可以使用 mmap 内存文件映射 。
“Memory Mapped Files:简称 mmap , 也有叫 MMFile 的 , 使用 mmap 的目的是将内核中读缓冲区(read buffer)的地址与用户空间的缓冲区(user buffer)进行映射 。 从而实现内核缓冲区与应用程序内存的共享 , 省去了将数据从内核读缓冲区(read buffer)拷贝到用户缓冲区(user buffer)的过程 。 它的工作原理是直接利用操作系统的 Page 来实现文件到物理内存的直接映射 。 完成映射之后你对物理内存的操作会被同步到硬盘上 。
使用这种方式可以获取很大的 I/O 提升 , 省去了用户空间到内核空间复制的开销 。
mmap 也有一个很明显的缺陷——不可靠 , 写到 mmap 中的数据并没有被真正的写到硬盘 , 操作系统会在程序主动调用 flush 的时候才把数据真正的写到硬盘 。 Kafka 提供了一个参数——producer.type 来控制是不是主动flush;如果 Kafka 写入到 mmap 之后就立即 flush 然后再返回 Producer 叫同步(sync);写入 mmap 之后立即返回 Producer 不调用 flush 就叫异步(async) , 默认是 sync 。
它的作用是在数据报从网络设备到用户程序空间传递的过程中 , 减少数据拷贝次数 , 减少系统调用 , 实现 CPU 的零参与 , 彻底消除 CPU 在这方面的负载 。
目前零拷贝技术主要有三种类型[3]:
- 直接I/O:数据直接跨过内核 , 在用户地址空间与I/O设备之间传递 , 内核只是进行必要的虚拟存储配置等辅助工作;
- 人生若无悔|美俄只能排第二第三,第一实属难料,让日本最忌惮的四个国家
- 蓝小姐和黄小姐|清单||人生最小的奇迹就是遇上美物
- 上海交通大学|人生赢家!他25岁读上海交大博士,妻子漂亮,带娃科研两不误
- 北京大学|重磅:北京大学2020强基计划数学校测试题及答案,学子:难哭了!
- 净利润|股市乱谈:今年所有炒股的人都会成为人生赢家?
- 「高晓松」高晓松:人到中年,迈过这三道坎儿,才能晚年多福
- 嗨的人生 诺基亚将于8月4日10点发布一款新机,C3亮相
- 许某某|大批租户搬离杭州杀妻案公寓没人敢在晚上出来散步 深挖男主人生
- 吉娜|“上综艺体验不一样的人生”
- 【】多地进入“炙烤模式” 高温下他们书写劳动人生
