[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. Salesforce Sales Cloud 零基础学习(一) Product 和 Price Book

    以前的博客大部分都是基于force.com以及lightning展开的自定义开发,其实salesforce提供了很多的标准的功能以及平台, Sales Cloud便是作为Salesforce核心的平台 ...

  2. 【网页加速】lua redis的二次升级

    之前发过openresty的相关文章,也是用于加速网页速度的,但是上次没有优化好代码,这次整理了下,优化了nginx的配置和lua的代码,感兴趣的话可以看看上篇的文章: https://www.cnb ...

  3. Java并发编程-AbstractQueuedSynchronizer源码分析

    简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...

  4. Go语言如何判断一个chan被关闭

    当一个chanel被关闭后,再取出不会阻塞,而是返回零值 package main import "fmt" func main() { c := make(chan int, 5 ...

  5. TCP/IP协议学习(一)

    一.网络模型 OSI七层模型:自上至下依次是 应用层,表示层,会话层,传输层,网络层,数据链路层,物理层 应用层:具体的应用协议如HTTP.SMTP.FTP.TELNET.DNS等 表示层:针对数据格 ...

  6. 自定义Appium

    改造appium-android-driver 这个driver是UIAutomator1的driver,负责UIAutomator1的服务启动.停止.命令接收和执行. 工程结构 appium-and ...

  7. MySQL中间件之ProxySQL(7):详述ProxySQL的路由规则

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.关于ProxySQL路由的简述 当ProxySQL收到前端app发 ...

  8. Perl中的自增、自减

    自增和自减 perl也支持数值类型的自增和自减操作.不仅如此,还支持字符.字符串的自增.自减. 如果自增(++)和自减(--)符号放在数值的前面,则先增减,再返回: 如果自增(++)和自减(--)符号 ...

  9. HBase简介及原理

    HBase简介 1.HBase是一个万亿行,百万列大表(Big Table),数据存放在hdfs集群中: 写操作使用MapReduce处理,将(增删改)处理结果放入HBase中,读就直接读HBase: ...

  10. js实现带上传进度的文件上传

    //获取文件筐的文件集合 var files = document.getElementById("file1").files; //创建FormData对象 相当于参数集合 存储 ...