[20181214]open file using O_DIRECT.txt
[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的更多相关文章
- unity3d首次倒入工程文件出错Opening file Library/FailedAssetImports.txt failed解决方法
打开unity3d,首次倒入工程到unity编辑器,但是频繁弹出“Opening file Library/FailedAssetImports.txt failed”的错误对话框,很麻烦. 解决方法 ...
- [20181130]control file sequential read.txt
[20181130]control file sequential read.txt --//昨天上午探究了大量控制文件读的情况,链接:http://blog.itpub.net/267265/vie ...
- System.IO.File.WriteAllText("log.txt", "dddd");
System.IO.File.WriteAllText("log.txt", "dddd");
- 关于Java里面File类创建txt文件重复???
private JButton getOpenButton() { if (openButton == null) { openButton = new JButton(); openButton.s ...
- File操作-将txt里的内容写入到数据库表
package com.Cristin.File;//将txt里的内容写入到数据库表 import com.Cristin.MySQL.AddDataToDB;import org.testng.an ...
- Python3基础 file read 读取txt文件的前几个字符
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Python3基础 file open 打开txt文件并打印出全文
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- java中File类的使用
public class FileLei { public static void main(String[] args) throws IOException { //..表示上 ...
- c# 保存数据到txt (追加)
StringBuilder sb = new StringBuilder(); sb.AppendLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:s ...
随机推荐
- JVM中垃圾收集算法总结
通过前面的介绍我们了解了对象创建和销毁的过程.那么JVM中垃圾收集器具体对对象回收采用的是什么算法呢?本文主要记录下JVM中垃圾收集的几种算法. JVM的垃圾回收的算法 标记-清除算法(Mark- ...
- 第3章 Linux上文件的权限管理
3.1 文件/目录的权限 3.1.1 文件的权限 每个文件都有其所有者(u:user).所属组(g:group)和其他人(o:other)对它的操作权限,a:all则同时代表这3者.权限包括读(r:r ...
- Perl的子程序
子程序(subroutine) perl中的子程序其实就是自定义函数.它使用sub关键字开头,表示声明一个子程序 子程序名称有独立的名称空间,不会和其它名称冲突 Perl中的子程序中可以定义.引用.修 ...
- Perl包相关
名称冲突问题 假如在sum2.pm中使用require导入了一个代码文件sum1.pm: #!/usr/bin/env perl use strict; use warnings; use 5.010 ...
- Go基础系列:指定goroutine的执行顺序
Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 当关闭一个channel时,会 ...
- java当中的强引用,软引用,弱引用,虚引用
强引用,软引用,弱引用,虚引用:不同的引用类型主要体现在GC上 强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收.即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryEr ...
- mybatis是如何防止SQL注入的
mybatis是如何防止SQL注入的 1.首先看一下下面两个sql语句的区别: <select id="selectByNameAndPassword" parameterT ...
- 机器学习笔记(5) KNN算法
这篇其实应该作为机器学习的第一篇笔记的,但是在刚开始学习的时候,我还没有用博客记录笔记的打算.所以也就想到哪写到哪了. 你在网上搜索机器学习系列文章的话,大部分都是以KNN(k nearest nei ...
- [转]VirtualBox centos7扩容
本文转自:https://www.cnblogs.com/xd502djj/p/7367704.html 有时候扩容还真不如重新建立一个大硬盘的系统,但是如果你安装了好多东西的话,那还是来扩容一下吧. ...
- c#使用js上传图片
前几天朋友说用js上传图片过去遇到点问题,于是自己也想写一个demo这里就把自己挖的坑填了. 话不多说上代码 前台就一个file控件加按钮 <!DOCTYPE html> <html ...