linux 的直接direct io

news2024/11/26 10:22:16

目录

什么是 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.coloradmin.cn/o/1349729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年第一天,先送一波福利!

▼最近直播超级多&#xff0c;预约保你有收获 近期直播&#xff1a;《LLM在电商搜索系统的应用案例实战》 —1— 2024 AIGC 技术体系领取福利 2023年是当之无愧的生成式 AI 元年&#xff0c;AIGC 的崛起深刻改变了我们的工作和生活&#xff0c;让我们看到了未来无限的可能性&am…

TDD-LTE 寻呼流程

目录 1. 寻呼成功流程 1.1 空闲态寻呼 1.2 连接态寻呼 2. 寻呼失败流程 2.1 Paging消息不可达 2.2 RRC建立失败 2.3 eNodeB未上发Initial UE message或达到超时 1. 寻呼成功流程 1.1 空闲态寻呼 寻呼成功&#xff1a;MME发起寻呼&#xff08;S1 接口发送Paing 消息&…

【漏洞复现】冰峰VPN存在敏感信息泄露漏洞

漏洞描述 冰峰VPN log/system.log模块日志信息泄露漏洞 免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff0c;未经授权请勿利…

大数据背景下基于联邦学习的小微企业信用风险评估研究

摘要&#xff1a; 小微企业信用风险评估难是制约其融资和发展的一个主要障碍。基于大数据的小微企业信用风险评估依然面临着单机构数据片面、跨机构数据共享难、模型不稳定等诸多挑战。针对相关问题和挑战&#xff0c;本项目拟在多主体所有权数据隐私保护与安全共享的背景下&am…

RainBond 构建组件 rbd-chaos 故障解决 【真实案例】

文章目录 背景分析官方排查说明尝试进一步分析解决参考背景 在 RainBond 中把所有组件都部署了至少 2 个实例后,开始出现构建/滚动更新直接报错,且没有日志(查看日志按钮点击后,里面啥也没有)。 然后再平台管理主界面,可以看到提示 rbd-chaos 组件故障: 分析 官方排…

【HarmonyOS开发】分布式应用的开发实践(元旦快乐)

元旦快乐&#xff0c;再见2023&#xff0c;加油2024&#xff0c;未来可期&#xff0c;愿新的一年带来健康、幸福和成功&#xff01;&#x1f4aa; &#x1f4aa;&#x1f4aa; 多种设备之间能够实现硬件互助、资源共享&#xff0c;依赖的关键技术包括分布式软总线、分布式设备虚…

c++对c的加强

目录 提出了命名空间的概念 实用性增强 register关键字增强 变量检测增强 struct类型加强 C中所有的变量和函数都必须有类型 新增bool数据类型 提出了命名空间的概念 命名空间将全局作用域分成不同的部分 不同命名空间中的标识符可以同名而不会发生冲突 命名空间可以相互…

buildadmin实现多级关联下拉效果

文章目录 最终效果开始重新渲染组件编辑渲染完结 最终效果 开始 popupForm.vue代码 <FormItem :label"t(interior.interiorApply.interior_index_id)" type"remoteSelect"v-model"baTable.form.items!.interior_index_id" prop"interi…

Friedman检验及后续Nemenyi检验可视化

文章目录 Friedman 检验Nemeny检验 合作推广&#xff0c;分享一个人工智能学习网站。计划系统性学习的同学可以了解下&#xff0c;点击助力博主脱贫( •̀ ω •́ )✧ Friedman 检验 弗里德曼检验&#xff08;Friedman test&#xff09;是一种非参数统计检验方法&#xff0c;用…

VMware15安装Linux,CentOS-7x86_64

最近面试遇到很多Linux&#xff0c;咱就是实在糊弄不过去了&#xff0c;学一下吧 下载网站&#xff0c;官网&#xff1a;https://www.centos.org/download/ 第一步&#xff1a;点击x86_64 第二步&#xff1a;随便选个国内源&#xff0c;我选的清华 第三步&#xff1a;等待下…

【LeetCode每日一题】1599. 经营摩天轮的最大利润(模拟)—2024新年快乐!

2024-1-1 文章目录 [1599. 经营摩天轮的最大利润](https://leetcode.cn/problems/maximum-profit-of-operating-a-centennial-wheel/)思路&#xff1a; 1599. 经营摩天轮的最大利润 思路&#xff1a; 1.对摩天轮的运转情况进行模拟&#xff0c; 2.遍历数组&#xff0c;分别计…

SpringBoot灵活集成多数据源(定制版)

如来说世界&#xff0c;非世界&#xff0c;是名世界 如来说目录&#xff0c;非目录&#xff0c;是名目录 前言前期准备代码实现演示扩展 前言 本篇博客基于SpringBoot整合MyBatis-plus&#xff0c;如果有不懂这个的&#xff0c; 可以查看我的这篇博客&#xff1a;快速CRUD的秘诀…

云计算复习提纲

第一章 大数据的概念&#xff1a;海量数据的规模巨大到无法通过目前主流的计算机系统在合理时间内获取、存储、管理、处理并提炼以帮助使用者决策 大数据的特点&#xff1a;①数据量大&#xff0c;存储的数据量巨大&#xff0c;PB级别是常态&#xff1b;②多样&#xff0c;数…

SpringBoot自动配置原理和自定义启动器

1、自动配置的原理 项目在加载上下文时&#xff0c;会根据SpringBootApplication注解运行。该注解中有一个CompoentScan注解&#xff0c;会扫描和加载当前启动类所在的目录&#xff0c;以及所有的子目录&#xff1b;还有一个是EnableAutoConfiguration注解&#xff0c;这个注解…

nginx 多端口部署多站点

目录 1.进行nginx.conf 2.复制粘贴 3.修改端口及站点根目录 4. 网站上传 1.进行nginx.conf 在 nginx 主要配置文件 nginx.conf 中&#xff0c;server 是负责一个网站配置的&#xff0c;我们想要多个端口访问的话&#xff0c;可以复制多个 server 先进入到 nginx.conf 中 …

鸿蒙 DevEco Studio 3.1 入门指南

本文主要记录开发者入门&#xff0c;从软件安装到项目运行&#xff0c;以及后续的学习 1&#xff0c;配置开发环境 1.1 下载安装包 官网下载链接 点击立即下载找到对应版版本 下载完成&#xff0c;按照提示默认安装即可 1.2 下载SDK及工具链 运行已安装的DevEco Studio&…

Rust学习笔记005:结构体 struct

在 Rust 中&#xff0c;struct 是一种用于创建自定义数据类型的关键字&#xff0c;它允许你定义和组织数据的结构。struct 可以包含多个不同类型的字段&#xff08;fields&#xff09;&#xff0c;每个字段都有一个名称和一个类型。 定义结构体 下面是一个简单的例子&#xff…

【我与CSDN的128天】相识相知相守

目录: 相识相知相守 相识 为什么选择写博客? 写博客的目的,我觉得是因为想要记录。记录学习的过程,整理学过的知识,方便今后的复习。 更重要的是热爱分享,分享给别人知识也是一种快乐。 在某一瞬间教会某一个你不认识的人,难道不是一个很酷的事情吗? 为什么选择CSDN? 作…

系列四、Eureka自我保护

一、Eureka自我保护 1.1、故障现象 保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式&#xff0c;Eureka Server将会尝试保护其服务注册表中的信息&#xff0c;不再删除服务注册表中的数据&#xff0c;也就是不会注销任何微服务。如…

PACC:数据中心网络的主动 CNP 生成方案

PACC&#xff1a;数据中心网络的主动 CNP 生成方案 文章目录 PACC&#xff1a;数据中心网络的主动 CNP 生成方案PACC算法CNP数据结构PACC参数仿真结果参考文献 PACC算法 CNP数据结构 PACC参数 仿真结果 PACC Hadoop Load0.2 的情况&#xff1a; PACC Hadoop Load0.4 的情况&a…