通俗解释:在应用程序读取磁盘文件时,操作系统内核在读取磁盘时会经过一层Cache,利用这个Cache可以更快速读取数据(毕竟磁盘速度和内存速度还是差了很多)。那么这个Cache就是PageCache
01. Pagecache(页缓存)的作用和原理
在磁盘进行标准IO操作时,操作系统内核会先把数据写入到PageCache,这样我读取数据时会直接从Cache中读取同时减少了IO的次数,达到了提升读写效率。
文件读取流程:
DMA 控制器将数据从主存或硬盘拷贝到内核空间(kernel space)的缓冲区(read buffer);
4. DMA 磁盘控制器向 CPU 发出数据读完的信号,由 CPU 负责将数据从内核缓冲区拷贝到用户缓冲区
5. 用户进程由内核态切换回用户态,获得文件数据
写入流程
02. PageCache在大数据组件中的应用
在大数据组件中,基本上涉及到文件层级的读写操作的底层都会用到pagecache的技术,比如Kafka、HDFS。
比如大数据高性能消息队列组件Kafka之所以高性能其中之一的因素就在于它将Cache技术用到了极致,
Kafka 使用Page Cache作为缓存而不是用JVM缓存,包含以下原因:
首先我们在往kafka producer发送数据之后,producer端内部会调用pwrite函数(对应Java NIO中的FileChannel.write() 函数)
producer生产消息时,会使用pwrite()系统调用【对应到Java NIO中是FileChannel.write() API】按偏移量写入数据,并且都会先写入page cache里。consumer消费消息时,会使用sendfile()系统调用【对应FileChannel.transferTo() API】,零拷贝地将数据从page cache传输到broker的Socket buffer,再通过网络传输。
FileChannel(Java.NIO) 在将ByteBuffer中的数据写入磁盘之前,中间会现将数据存入pagecache这一层。一般我们认为 filechannel.write 写入 PageCache 便是完成了落盘操作,但实际上,操作系统最终帮我们完成了 PageCache 到磁盘的最终写入,理解了这个概念,你就应该能够理解 FileChannel 为什么提供了一个 force() 方法,用于通知操作系统进行及时的刷盘。
那么如果kafka producer的生产速率和consumer的消费速率基本一致的话,那么整个过程对于磁盘的访问非常少,基本都是走的缓存层进行处理的数据,所以生产和消费的性能会非常的高
本文参考 :
https://cloud.tencent.com/developer/article/1807349
https://www.infoq.cn/article/7VQD5xiz2l6P1yjucMvu