本文涉及到的内核源码版本为: 5.4 ,JVM 源码为:OpenJDK17,RocketMQ 源码版本为:5.1.1在之前的文章《一步一图带你深入剖析 JDK NIO ByteBuffer 在不同字节序下的设计与实现》 中,笔者为大家详细剖析了 JDK Buffer 的整个设计体系,从总体上来讲,JDK NIO 为每一种 Java 根本类型定义了对应的 Buffer 类(boolean 类型除外)。
以下相关图片以及数据来源于:https://docs.pmem.io/persistent-memory/getting-started-guide/introduction
MAP_SYNC 只支持映射 dax 模式下挂载的 filesystem 上的文件当我们通过 mmap 系统调用映射普通磁盘(Non-Volatile Storage)上的文件到历程空间中的 MappedByteBuffer 的时间,MappedByteBuffer 背后其实映射的是磁盘文件的 page cache 。
关于 force_page_cache_readahead 的详细内容,感爱好的读者可以回看之前的文章 《从 Linux 内核角度探秘 JDK NIO 文件读写本质》但这里需要注意的是预读大概会失败,内核这里会忽略掉预读失败的错误,我们在应用层面调用 madvise 的时间是感知不到预读失败的。
关于缺页中断的处理惩罚细节,感爱好的读者可以回看下《一文聊透 Linux 缺页异常的处理惩罚 —— 图解 Page Faults》
测试代码:https://github.com/huibinliupush/benchmark , 大家也可以在自己的测试环境中运行一下,然后将跑出的结果提交到这个仓库中。这样方便大家在不同的测试环境下对比两者的文件读写性能差异 —— 众人拾柴火焰高。5.1 文件数据在 page cache 中
想更多了解缺页中断细节的读者可以看下之前的文章——而 FileChannel 并不会涉及上面的这些开销,所以 MappedByteBuffer 的缺页中断要比 FileChannel 的系统调用开销要大,这一点我们可以在上小节和本小节的读写性能对比中看得出来。
《一文聊透 Linux 缺页异常的处理惩罚 —— 图解 Page Faults》
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |