DirectIO(O_DIRECT) 详解
DirectIO(O_DIRECT) 详解
文章目录
- DirectIO(O_DIRECT) 详解
- 什么是DirectIO
- 如何使用DirectIO
- DirectIO的性能
- DirectIO的应用
什么是DirectIO
DirectIO也叫无缓冲IO,裸IO(rawIO),意思是使用无缓冲IO对文件进行读写,不会经过OS Cache。
通常,我们使用的文件流读取、内存映射都属于Cache IO,因为将数据写入文件,首先会写入cache,最终再落盘到IO device 或者称为 disk上。cache IO使得我们在写入、读取(预读取、顺序读取等特性)文件数据的时候,性能得以提升,能够从cache(内存)中读取数据。
直接IO,则是直接将数据写入文件、或者从文件中读取出来,绕过了cache,这使得看起来性能没那么好,但是,仔细分析,无论哪种IO方式,最终数据都必须落盘,而两种的区别在于有无OS cache。
OS cache提供的预读取、顺序读取等特性,这些特性并不适用于所有的场景,比如数据库,数据库通常都有自己的一套缓存机制,就像mysql的innodb存储引擎,它有自己的缓存页,有自己的落盘机制,如果不使用directIO,这明显就会存在双重的cache,一个是OS设计的,一个是DB设计的,而通常,DB需要更加符合自己使用的cache机制,而非OS提供的通用化的缓存机制。
如何使用DirectIO
使用直接IO进行数据的写入
//d io
#include <fcntl.h>
#include <malloc.h>
#include <iostream>
#define _GNU_SOURCE //测试宏void rawIO() {int fd;size_t length;char *buf;length = getpagesize() * 1024*16;cout << "page size:" << getpagesize() << endl;fd = open("/home/out.log", O_RDWR | O_APPEND | O_DIRECT);//选用了centos系统作为实验平台if (fd == -1) {printf("%s", strerror(errno));exit(-1);}//函数:void * memalign (size_t boundary, size_t size)//函数memalign将分配一个由size指定大小,地址是boundary的倍数的内存块。参数boundary必须是2的幂!// 函数memalign可以分配较大的内存块,并且可以为返回的地址指定粒度。//函数:void * valloc (size_t size)//使用函数valloc与使用函数memalign类似,函数valloc的内部实现里,使用页的大小作为对齐长度,使用memalign来分配内存。它的实现如下所示://void *//valloc (size_t size)//{//return memalign (getpagesize (), size);//}buf = (char *) memalign(getpagesize(), length);if (buf == nullptr) {printf("%s", strerror(errno));exit(1);}for (int i = 0; i < length; i++) {buf[i] = 'a';}int ret = write(fd, (void *) buf, length);if (ret == -1) {std::cout << "write fail" << std::endl;printf("%s \n", strerror(errno));}free(buf);
}
由于直接IO绕过了cache,因此,申请读写的buffer不能够使用malloc等函数,因为这些函数并不能够实现地址对齐,因此要使用memalign,这里注意,第一个参数必须对齐页大小,是页大小的幂次。
如果使用DIRECT IO进行读取,和写差不多,也要申请对齐的buf。
DirectIO的性能
为了测试直接IO的性能,这里使用常规的写(不手动落盘)、手动落盘、自动落盘、直接IO的耗时比较,测试变量:
写入:4096* 1024*16 字节的耗时如下:
raw IO elapse ms:862
raw IO elapse us:862723
cache IO 手动 elapse ms:908
cache IO 手动 elapse us:908871
cache IO 自动 elapse ms:885
cache IO 自动 elapse us:885480
cache IO elapse ms:297
cache IO elapse us:297153
可以看出,实际落盘的时间都是差不多的,而写OS Cache,在不立即落盘的情况下,是最快的。
DirectIO的应用
- 数据库
DirectIO(O_DIRECT) 详解相关推荐
- Linux下Nginx编译安装过程详解
Linux下Nginx编译安装过程详解 一.Nginx介绍 二.Nginx源码下载 1.打开Nginx官网 2.下载官网的源码包 三.Nginx源码安装 1.解压源码包 2.安装开发包组及环境 3.编 ...
- 网络IO和磁盘IO详解
网络IO和磁盘IO详解 1. 缓存IO 缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O.在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓 ...
- mysql innodb 设置详解_【mysql】mysql innodb 配置详解
MySQLinnodb 配置详解 innodb_buffer_pool_size:这是InnoDB最重要的设置,对InnoDB性能有决定性的影响.默认的设置只有8M,所以默认的数据库设置下面InnoD ...
- Nginx服务器搭建和基本配置详解
nginx Nginx(engine X) 是一个高性能的 HTTP 服务器和反向代理服务器,这款软件开发的目的是为了解决 C10k 问题. Nginx 的架构利用了许多现代操作系统的特性,以实现一个 ...
- Linux串口编程详解
Linux串口编程详解(阻塞模式.非阻塞模式.select函数) 之前一直觉得串口编程很简单,这两天仔细研究后发现串口里的各种参数还挺复杂,稍不注意就容易出错,这里总结一下网上的各种文章及自己的理解与 ...
- 大型网站架构系列:负载均衡详解(3)
本次分享大纲 软件负载均衡概述 Ngnix负载均衡 Lvs负载均衡 Haproxy负载均衡 本次分享总结 一.软件负载均衡概述 硬件负载均衡性能优越,功能全面,但是价格昂贵,一般适合初期或者土豪级公司 ...
- MySQL8.0二进制免编译部署过程详解(二)
一.背景介绍 本文主要介绍MySQL二进制免编译软件包的安装过程详解,之所以选择二进制安装包部署MySQL8.0,是因为官方版本已经内置所有功能,在安装的时候可以指定数据库安装路径. 目前官网MySQ ...
- java 测试磁盘io,详解三种Linux测试磁盘IO性能的方法总结,值得收藏
概述 在磁盘测试中我们一般最关心的几个指标分别为:iops(每秒执行的IO次数).bw(带宽,每秒的吞吐量).lat(每次IO操作的延迟). 当每次IO操作的block较小时,如512bytes/4k ...
- 详解Linux内核IO技术栈
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 在开始正式的讨论 ...
最新文章
- OSChina 技术周刊第十六期 —— 每周技术精粹
- API Gateway
- 一個傳統的C2C網站的用戶充值的过程
- 【Android 逆向】使用 DB Browser 查看并修改 SQLite 数据库 ( 下载 DB Browser 安装包 | 安装 DB Browser 工具 )
- python 四数之和
- JavaScript-使用WeakMap创建对象的私有属性
- python选择题题库for、if_Python题目1:猜年龄(for、if else和where)
- java管道流文件的复制_JavaIO 总结笔记三 基本字节字符输入输出流和文件复制...
- QQ2007 Beta2 下载地址泄露
- Bootstrap 排版和链接
- 打造一个实际的全系统污点分析系统--Towards Practical Taint Tracking
- Javascript - 面向对象
- 【matlab】元胞数组(使用celldisp显示元胞数组)
- spring framwork解析
- HDFS文件系统的操作
- 读取json本地js处理输出html,JavaScript 通过浏览器导出和读取本地 JSON 文件
- 【Python游戏】Python实现一个推箱子小游戏 | 附带源码
- 推荐几款好的小程序UI库组件
- Flutter 2.0 发布 | 针对 Web,移动端和桌面端构建的下一代 Flutter
- python中的for语句涉及的序列可以是( )-Python for循环语句
热门文章
- 手把手教你如何把小程序装进自己的APP
- 使用gcc编译和链接C语言程序,用GCC编译链接程序--编译链接器GCC常用功能(菜鸟级)...
- 小陈学习JS if-else语句
- 山海演武传·黄道·第一卷 雏龙惊蛰 第十五 ~ 十七章 紫气凌霄再生龙
- java调用大漠插件一键搞定!!!!!!!!!!
- Python遥感图像处理应用篇(十)(续):使用EVI指数批量计算叶面积指数LAI
- 如何将一个软件程序设置为开机启动项(win10系统)
- 大一计算机重修不过怎么办,挂科了怎么办
- python解决系列问题:AttributeError: module ‘tensorflow‘ has no attribute ‘AUTO_REUSE‘、‘get_variable‘等等
- 浙江大学python编程csdn_怎样学 Python?