linux 的直接direct io

目录

什么是 Direct IO

java 支持

使用场景

数据库

反思


在之前的文章零拷贝基础上,有一个针对那些不需要在操作系统的 page cache 里保存的情况,即绕过 page cache,对于 linux 提供了 direct io 的功能。

https://blog.csdn.net/zlpzlpzyd/article/details/135317834

什么是 Direct IO

Direct IO也叫无缓冲IO,裸IO(rawIO),意思是使用无缓冲IO对文件进行读写,不会经过page cache。

通常,我们使用的文件流读取、内存映射都属于 Cache IO,因为将数据写入文件,首先会写入cache,最终再落盘到 IO device 或者称为 disk上。

cache IO 使得我们在写入、读取(预读取、顺序读取等特性)文件数据的时候,性能得以提升,能够从cache(内存)中读取数据。

直接 IO,则是直接将数据写入文件、或者从文件中读取出来,绕过了cache,这使得看起来性能没那么好,但是,仔细分析,无论哪种IO方式,最终数据都必须落盘,而两种的区别在于有无 page cache。

参照图片,即是直接走最后的红色方式,直接访问操作系统的 block io layer 来实现 direct io。

这样的话针对那种不经常使用的文件尤其是大文件可以使用这种方式来处理了。

那 java 里是否提供了这个功能?在网上搜了一下,发现了如下

https://bugs.openjdk.org/browse/JDK-8189192

从 jdk 10 开始原生支持

java 支持

主要添加了3个地方

java.nio.file.FileStore

/*** Returns the number of bytes per block in this file store.** <p> File storage is typically organized into discrete sequences of bytes* called <i>blocks</i>. A block is the smallest storage unit of a file store.* Every read and write operation is performed on a multiple of blocks.** @implSpec The implementation in this class throws*           {@code UnsupportedOperationException}.** @return  a positive value representing the block size of this file store,*          in bytes** @throws  IOException*          if an I/O error occurs** @throws  UnsupportedOperationException*          if the operation is not supported** @since 10*/
public long getBlockSize() throws IOException {throw new UnsupportedOperationException();
}

com.sun.nio.file.ExtendedOpenOption

/*** Requires that direct I/O be used for read or write access.* Attempting to open a file with this option set will result in* an {@code UnsupportedOperationException} if the operating system or* file system does not support Direct I/O or a sufficient equivalent.** @apiNote* The DIRECT option enables performing file I/O directly between user* buffers and the file thereby circumventing the operating system page* cache and possibly avoiding the thrashing which could otherwise occur* in I/O-intensive applications. This option may be of benefit to* applications which do their own caching or do random I/O operations* on large data sets. It is likely to provide the most benefit when* the file is stored on a device which has high I/O throughput capacity.* The option should be used with caution however as in general it is* likely to degrade performance. The performance effects of using it* should be evaluated in each particular circumstance.** @since 10*/
DIRECT(FileSystemOption.DIRECT);

ByteBuffer#alignedSlice

从 java 9 开始支持

Path p; // initialization omitted
int blockSize = Math.toIntExact(Files.getFileStore(p).getBlockSize());
int capacity = Math.addExact(blockSize, blockSize - 1);
ByteBuffer block = ByteBuffer.allocateDirect(capacity).alignedSlice(blockSize);
try (FileChannel fc = FileChannel.open(p, StandardOpenOption.READ, ExtendedOpenOption.DIRECT)) {int result = fc.read(block);
}

使用场景

针对那种不经常使用的文件尤其是大文件可以使用 direct io 来处理了。

数据库

mysql 的 innodb 引擎就用了这个,绕过 page cache

https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_flush_method

反思

让我想到了一点,很多功能底层支持,但是工具里没有,最终还是看 cpu 层次(指令集)和操作系统的 api 是否支持。例如 java 的很多功能之前不支持,后面底层支持了在 java 里也提供了对应的 api 间接使用这些底层功能。让我想到了虚拟线程的问题,在 alibaba 自研的 dragonwell jdk 之前的 jdk 里不支持,开发人员就改写了 jvm 的源码从底层上支持虚拟线程。

美团自研的 mjdk 针对现有的  java.util.zip.* 中使用的底层 zlib 改写使用 Intel 开源的 ISA-L 进行改造优化 

https://mp.weixin.qq.com/s/etzzmbOsAzzLU13BsrXxTA

鉴于 java 的使用人员多,市场份额大,现在不像之前更新那么快了。对于底层 api 的支持也没有那么快了,自己要想使用那些底层操作系统的功能,需要自己编写 api 后面打包到 jdk 里去,通过 java api 来间接调用操作系统的 api,这样可以从 jdk 层面来支持这些底层的功能。

参考链接

https://blog.csdn.net/alex_xfboy/article/details/91865675

https://blog.csdn.net/weixin_39971435/article/details/114475097

https://blog.csdn.net/rekingman/article/details/109037276

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/323840.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 dbgate 在 sealos 上完美管理 mysql pgsql 等数据库

先登录 sealos 创建数据库&#xff0c;可以创建个 pgsql: 再到模版市场启动 dbgate: 配置数据库的连接信息&#xff0c;即可搞定收工 sealos 以kubernetes为内核的云操作系统发行版&#xff0c;让云原生简单普及 laf 写代码像写博客一样简单&#xff0c;什么docker kubernete…

【快速全面掌握 WAMPServer】14.各种组件的升级方法

网管小贾 / sysadm.cc WAMPServer 更新很快&#xff0c;这是件好事&#xff01; 但是 WAMPServer 更新快是因为他很勤劳吗&#xff1f; 其实这个问题的原因并不是出自 WAMPServer 自身&#xff0c;而是来自它的各个组件。 是的&#xff0c;你能想像得到&#xff0c;比如 PHP…

webrtc报文记录

tcp.port 10443 || tcp.port 6080 || udp.port 8000 https://download.csdn.net/download/dualvencsdn/88706745

Unity中Shader序列帧动画(U、V方向的走格)

文章目录 前言一、U方向的走格1、 要实现移动的效果&#xff0c;我们就会想到使用_Time2、使用floor向下取整3、把x、y缩小为原函数的 Column倍4、使用_Sequence的z控制帧动画U方向上的速度 二、U方向的走格三、最终效果1、亚丝娜2、小蓝帽3、火4、最终代码 前言 在上一篇文章…

Flink Connector 开发

Flink Streaming Connector Flink是新一代流批统一的计算引擎&#xff0c;它需要从不同的第三方存储引擎中把数据读过来&#xff0c;进行处理&#xff0c;然后再写出到另外的存储引擎中。Connector的作用就相当于一个连接器&#xff0c;连接Flink计算引擎跟外界存储系统。Flin…

03 decision tree(决策树)

一、decision tree&#xff08;决策树&#xff09; 1. classification problems&#xff08;纯度&#xff09; i . entropy &#xff08;熵&#xff09; ​ 作用&#xff1a;衡量一组数据的纯度是否很纯 &#xff0c;当五五开时他的熵都是最高的&#xff0c;当全是或者都不是…

网络调试 UDP1,开发板用静态地址-入门5

https://www.bilibili.com/video/BV1zx411d7eC?p11&vd_source109fb20ee1f39e5212cd7a443a0286c5 1, 开发板连接路由器 1.1&#xff0c;烧录无OS UDP例程 1.2&#xff0c;Mini USB连接电脑 1.3&#xff0c;开发板LAN接口连接路由器 2. Ping开发板与电脑之间通信* 2.1 根据…

工智能基础知识总结--什么是RNN

什么是RNN RNN(循环神经网络)是一种用于处理时序数据的特殊结构的神经网络。所谓时序数据,是指句子、语音、股票这类具有时间顺序或者是逻辑顺序的序列数据。 RNN的折叠图和展开图为: RNN的参数为U、W和V三个矩阵,其中U为输出到隐藏层的参数矩阵,W为上一个时刻到当前时刻…

vue3 实现关于 el-table 表格组件的封装以及调用

一、示例图&#xff1a; 二、组件 <template><div class"sn-table" :class"props.colorType 1 ? : bg-scroll"><el-table :data"tableData" :row-class-name"tableRowClassName" height"500" style"…

红外传感器深入解析

引言 宇宙间的任何物体只要其温度超过零度就能产生红外辐射&#xff0c;事实上同可见光一样&#xff0c;其辐射能够进行折射和反射&#xff0c;这样便产生了红外技术&#xff0c;利用红外光探测器因其独有的优越性而得到广泛的重视&#xff0c;并在军事和民用领域得到了广泛…

听GPT 讲Rust源代码--compiler(8)

File: rust/compiler/rustc_trait_selection/src/solve/weak_types.rs 在Rust编译器的源代码中&#xff0c;rust/compiler/rustc_trait_selection/src/solve/weak_types.rs文件的作用是处理弱类型化解决方案。 在编译器中&#xff0c;当我们在代码中使用一个未经完全指定的泛型…

为了搞项目,我差点把京东 “爬“ 了个遍。。

最近在重构我的准备 智慧校园助手2.0 &#xff0c;奈何之前的相关数据放在服务器被小黑子黑了&#xff0c;准备重新搞点数据&#xff0c;借此和大家分享一波我之前做项目没数据该咋搞 &#x1f440;。 Java面试指南 & 大厂学习导航&#xff1a;www.java2top.cn 完整源码获取…