[20181214]open file using O_DIRECT.txt

--//因为一个测试需要,需要写一个测试小例子,验证使用O_DIRECT打开文件每次都是从磁盘读取.
--//没想到浪费1个上午时间,C语言不是自己的擅长.

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
//#define __USE_GNU 1
#include <fcntl.h>

int main(void)
{
    void *realbuff ;
    int handle;
    int bytes ;
    int pagesize;
    int nTemp ;

pagesize = getpagesize();
    // printf("%d\n",pagesize);
    realbuff = valloc( 1024000 );
    nTemp = posix_memalign(&realbuff, pagesize, 1024000);

if (0!=nTemp)
    {
        perror("posix_memalign error");
        return 1;
    }

handle=open("test.bin",O_RDONLY|O_DIRECT);
    if(handle==-1)
    {
        printf("ErrorOpeningFile\n");
        exit(1);
    }
    while ( (bytes=read(handle,realbuff,1024000))>0 )
    {
        sleep(1);
        printf("Read:%d bytes read.\n",bytes);
    }
    return 0 ;
}

--//自己的问题在于不能使用malloc分配缓存.而应该使用valloc分配,不然在posix_memalign这步就报错,使用valloc才能对齐pagesize.
--//顺便说一下getpagesize()我的测试返回是4096.我使用gcc版本:
$ gcc -v
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --disable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-54)

$ dd if=/dev/zero of=test.bin bs=1024000 count=10
10+0 records in
10+0 records out
10240000 bytes (10 MB) copied, 0.0343163 seconds, 298 MB/s

$ gcc -D_GNU_SOURCE direct_test.c -o direct_test

--//第2个问题就是使用O_DIRECT打开文件句柄,必须定义__USE_GNU 1.或者编译时加-D_GNU_SOURCE参数,否则找不到O_DIRECT的宏定义.
--//实际上这个应该是最先遇到的问题.

$ ./direct_test
Read:1024000 bytes read.
Read:1024000 bytes read.
Read:1024000 bytes read.
Read:1024000 bytes read.
Read:1024000 bytes read.
Read:1024000 bytes read.
Read:1024000 bytes read.
Read:1024000 bytes read.
Read:1024000 bytes read.
Read:1024000 bytes read.

# dstat -t -d -D cciss/c0d0p2,cciss/c0d0p6,total
-----time----- dsk/cciss/c-dsk/cciss/c--dsk/total-
  date/time   | read  writ: read  writ: read  writ
14-12 15:45:13|1213B 7936B:  11k   65k:  24k  146k
....
14-12 15:45:16|  36k    0 :   0     0 :  72k    0
14-12 15:45:17|1000k    0 :   0     0 :2000k    0
14-12 15:45:18|1000k    0 :   0     0 :2000k    0
14-12 15:45:19|1004k    0 :   0     0 :2008k    0
14-12 15:45:20|1000k    0 :   0     0 :2000k    0
14-12 15:45:21|1000k    0 :   0     0 :2000k    0
14-12 15:45:22|1016k 2564k:   0     0 :2032k 5128k
14-12 15:45:23|1000k    0 :   0     0 :2000k    0
14-12 15:45:24|1000k    0 :   0     0 :2000k    0
14-12 15:45:25|1000k    0 :   0     0 :2000k    0
14-12 15:45:26|1000k    0 :   0     0 :2000k    0
14-12 15:45:27|   0     0 :   0     0 :   0     0

--//注:可以发现每秒从磁盘/dev/cciss/c0d0p2读取1000K.绕过os文件缓存.另外这个dstat版本有问题,total的记数会加倍.

# man open
...
  O_DIRECT
      Try to minimize cache effects of the I/O to and from this file.  In general this will degrade performance,
      but it is useful in special situations, such as when applications do their own caching.  File I/O is done
      directly to/from  user  space  buffers.   The I/O is synchronous, i.e., at the completion of a read(2) or
      write(2), data is guaranteed to have been transferred.  Under Linux 2.4 transfer sizes, and the alignment
      of user buffer and file offset must all be multiples of the logical block size of the file system. Under
      Linux 2.6 alignment must fit the block size of the device.

--//也就是这样读取效率低下,每次都是从磁盘读取.除非applications do their own caching.
--//顺便说一下国内开发有许多相关讨论的帖子,查询open O_DIRECT就能找到.

[20181214]open file using O_DIRECT.txt的更多相关文章

  1. unity3d首次倒入工程文件出错Opening file Library/FailedAssetImports.txt failed解决方法

    打开unity3d,首次倒入工程到unity编辑器,但是频繁弹出“Opening file Library/FailedAssetImports.txt failed”的错误对话框,很麻烦. 解决方法 ...

  2. [20181130]control file sequential read.txt

    [20181130]control file sequential read.txt --//昨天上午探究了大量控制文件读的情况,链接:http://blog.itpub.net/267265/vie ...

  3. System.IO.File.WriteAllText("log.txt", "dddd");

    System.IO.File.WriteAllText("log.txt", "dddd");

  4. 关于Java里面File类创建txt文件重复???

    private JButton getOpenButton() { if (openButton == null) { openButton = new JButton(); openButton.s ...

  5. File操作-将txt里的内容写入到数据库表

    package com.Cristin.File;//将txt里的内容写入到数据库表 import com.Cristin.MySQL.AddDataToDB;import org.testng.an ...

  6. Python3基础 file read 读取txt文件的前几个字符

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. Python3基础 file open 打开txt文件并打印出全文

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  8. java中File类的使用

    public class FileLei {    public static void main(String[] args) throws IOException {        //..表示上 ...

  9. c# 保存数据到txt (追加)

    StringBuilder sb = new StringBuilder(); sb.AppendLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:s ...

随机推荐

  1. 数据量你造吗-JAVA分页

    原创地址:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks 学习的心态第一,解行要相应.其实<弟子规>在“余力 ...

  2. ④品茶看<Servlet&JSP>-EL表达式

    前言 今早,概率课偷了下小懒写的: 泡一杯红茶,ACM集训前,写篇博客记录记录EL表达式. #EL介绍 ①EL 语法 ②访问JavaBean等 ③EL隐式对象 ④EL运算符 EL介绍 EL 全名为Ex ...

  3. [java]类初始化挺有意思的题目

    public class Base { private String baseName = "base"; public Base() { callName(); } public ...

  4. Ubuntu 安装网卡驱动

    搭建Linux平台的无线热点,需要无线网卡和驱动都要支持 AP. 试了下Ubuntu平台默认驱动并不支持AP模式,所以需要更换驱动,具体操作步骤如下: 1.找到自己网卡芯片的型号,由于我的环境是搭建在 ...

  5. JavaScript之函数(上)

    在编程语言中,无论是面向过程的C,兼备面过程和对象的c++,还是面向对象的编程语言,如java,.net,php等,函数均扮演着重要的角色.当然,在面向对象编程语言JavaScript中(严格来说,J ...

  6. 南大算法设计与分析课程复习笔记(1) L1 - Model of computation

    一.计算模型 1.1 定义: 我们在思考和处理算法的时候是机器无关.实现语言无关的.所有的算法运行在一种“抽象的机器”之上,这就是计算模型. 1.2 种类 图灵机是最有名的计算模型,本课使用更简单更合 ...

  7. linux的文档和目录结构

    在Linux底下,所有的文件与目录都是由根目录开始,是目录与文件的源头,然后一个个的分支下来,如同树枝状,因此称为这种目录配置为:目录树. 目录树的特点是什么呢? 目录树的起始点是根目录(/,root ...

  8. NSOperation讲解

    本篇博客转自https://www.jianshu.com/p/4b1d77054b35 1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperat ...

  9. “每日一道面试题”.Net中所有类的基类是以及包含的方法

    闲来无事,每日一贴.水平有限,大牛勿喷. .Net中所有内建类型的基类是System.Object毋庸置疑 Puclic Class A{}和 Public Class A:System.Object ...

  10. php 设计模式之单例模式

    单例模式的关键点 1.//私有构造函数,防止直接new 创建实例 2.//设置静态成员变量 作保存实例 3.//公有访问实例的静态方法 4.//防止克隆对象的方法 上代码: //单例模式 class ...