[20181214]open file using O_DIRECT.txt
2018-12-17 10:46:05来源:博客园 阅读 ()
[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就能找到.
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:CentOS7环境搭建
- 在已经编译安装好php7场景下 安装php openssl扩展 2020-06-06
- 容器技术之Dockerfile(二) 2020-06-04
- 容器技术之Dockerfile (一) 2020-05-31
- CentOS挂载mount: unknown filesystem type 'ext4'错误 2020-05-27
- 私有云技术 2020-05-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash