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) 详解相关推荐

  1. Linux下Nginx编译安装过程详解

    Linux下Nginx编译安装过程详解 一.Nginx介绍 二.Nginx源码下载 1.打开Nginx官网 2.下载官网的源码包 三.Nginx源码安装 1.解压源码包 2.安装开发包组及环境 3.编 ...

  2. 网络IO和磁盘IO详解

    网络IO和磁盘IO详解 1. 缓存IO 缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O.在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓 ...

  3. mysql innodb 设置详解_【mysql】mysql innodb 配置详解

    MySQLinnodb 配置详解 innodb_buffer_pool_size:这是InnoDB最重要的设置,对InnoDB性能有决定性的影响.默认的设置只有8M,所以默认的数据库设置下面InnoD ...

  4. Nginx服务器搭建和基本配置详解

    nginx Nginx(engine X) 是一个高性能的 HTTP 服务器和反向代理服务器,这款软件开发的目的是为了解决 C10k 问题. Nginx 的架构利用了许多现代操作系统的特性,以实现一个 ...

  5. Linux串口编程详解

    Linux串口编程详解(阻塞模式.非阻塞模式.select函数) 之前一直觉得串口编程很简单,这两天仔细研究后发现串口里的各种参数还挺复杂,稍不注意就容易出错,这里总结一下网上的各种文章及自己的理解与 ...

  6. 大型网站架构系列:负载均衡详解(3)

    本次分享大纲 软件负载均衡概述 Ngnix负载均衡 Lvs负载均衡 Haproxy负载均衡 本次分享总结 一.软件负载均衡概述 硬件负载均衡性能优越,功能全面,但是价格昂贵,一般适合初期或者土豪级公司 ...

  7. MySQL8.0二进制免编译部署过程详解(二)

    一.背景介绍 本文主要介绍MySQL二进制免编译软件包的安装过程详解,之所以选择二进制安装包部署MySQL8.0,是因为官方版本已经内置所有功能,在安装的时候可以指定数据库安装路径. 目前官网MySQ ...

  8. java 测试磁盘io,详解三种Linux测试磁盘IO性能的方法总结,值得收藏

    概述 在磁盘测试中我们一般最关心的几个指标分别为:iops(每秒执行的IO次数).bw(带宽,每秒的吞吐量).lat(每次IO操作的延迟). 当每次IO操作的block较小时,如512bytes/4k ...

  9. 详解Linux内核IO技术栈

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 在开始正式的讨论 ...

最新文章

  1. OSChina 技术周刊第十六期 —— 每周技术精粹
  2. API Gateway
  3. 一個傳統的C2C網站的用戶充值的过程
  4. 【Android 逆向】使用 DB Browser 查看并修改 SQLite 数据库 ( 下载 DB Browser 安装包 | 安装 DB Browser 工具 )
  5. python 四数之和
  6. JavaScript-使用WeakMap创建对象的私有属性
  7. python选择题题库for、if_Python题目1:猜年龄(for、if else和where)
  8. java管道流文件的复制_JavaIO 总结笔记三 基本字节字符输入输出流和文件复制...
  9. QQ2007 Beta2 下载地址泄露
  10. Bootstrap 排版和链接
  11. 打造一个实际的全系统污点分析系统--Towards Practical Taint Tracking
  12. Javascript - 面向对象
  13. 【matlab】元胞数组(使用celldisp显示元胞数组)
  14. spring framwork解析
  15. HDFS文件系统的操作
  16. 读取json本地js处理输出html,JavaScript 通过浏览器导出和读取本地 JSON 文件
  17. 【Python游戏】Python实现一个推箱子小游戏 | 附带源码
  18. 推荐几款好的小程序UI库组件
  19. Flutter 2.0 发布 | 针对 Web,移动端和桌面端构建的下一代 Flutter
  20. python中的for语句涉及的序列可以是( )-Python for循环语句

热门文章

  1. 手把手教你如何把小程序装进自己的APP
  2. 使用gcc编译和链接C语言程序,用GCC编译链接程序--编译链接器GCC常用功能(菜鸟级)...
  3. 小陈学习JS if-else语句
  4. 山海演武传·黄道·第一卷 雏龙惊蛰 第十五 ~ 十七章 紫气凌霄再生龙
  5. java调用大漠插件一键搞定!!!!!!!!!!
  6. Python遥感图像处理应用篇(十)(续):使用EVI指数批量计算叶面积指数LAI
  7. 如何将一个软件程序设置为开机启动项(win10系统)
  8. 大一计算机重修不过怎么办,挂科了怎么办
  9. python解决系列问题:AttributeError: module ‘tensorflow‘ has no attribute ‘AUTO_REUSE‘、‘get_variable‘等等
  10. 浙江大学python编程csdn_怎样学 Python?