linux open系统调用的O_DIRECT标记
前言
open
系统调用中针对打开的文件描述符,可以增加一个O_DIRECT标记,该标记能够使得针对该文件描述符的写操作绕过操作系统page cache,直接进入通用块设备层,从而减少页缓存对IO效率的影响。
但是针对O_DIRECT标记有一个问题,数据及其元数据尝试落盘但是无法保证完整落盘,如果保证落盘,则需要O_SYNC的标记支持,即IO到达块设备才会返回,来确保用户态的数据安全性。
代码测试
测试代码如下:
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <pwd.h>/*打印当前时间*/
void printDatetime()
{while(1) {time_t now;struct tm *tm_now;time(&now);tm_now = localtime(&now);printf("now datetime: %d-%d-%d %d:%d:%d\n", tm_now->tm_year, tm_now->tm_mon, tm_now->tm_mday, tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec);fflush(stdout);sleep(1);}
}int main(int argc, char* argv[])
{char *file_path;char *file_path_new;if ((argc > 1 && argv[1]) || argv[2] ) {file_path = argv[1];file_path_new = argv[2];} else {printf("no file path\n");_exit(1);}printf("%s\n",argv[1]);pthread_t t1;int err = pthread_create(&t1,NULL,printDatetime,NULL);if (err) {printf("create thread error \n");_exit(-1);}int fd;fd = open(file_path,O_WRONLY |O_CREAT |O_APPEND | O_DIRECT);if (fd == -1) {printf("open failed\n");_exit(-1);}int fd2;fd2 = open(file_path_new,O_RDWR |O_CREAT |O_APPEND | O_DIRECT);if (fd2 == -1) {printf("open failed\n");_exit(-1);}while(1) {int len = write(fd,"something\n",sizeof("something\n"));if (len == -1) {printf("write failed\n");}printf("write_old success\n");int len_new = write(fd2,"write to new file something\n",sizeof("write to new file something\n"));if (len_new == -1) {printf("write failed\n");}printf("write_new success\n");sleep(1);}close(fd);close(fd2);return 0;
}
注意,关于O_DIRECT
系统调用除了包含头文件fcntl.h
之外,编译时需加入-D_GNU_SOURCE
参数
以上代码编译如下:gcc test_write.c -o write -lpthread -D_GNU_SOURCE
用于传递数据的缓冲区,其内存边界必须对齐为逻辑块大小的整数倍
man 2 open
原文描述如下
Under Linux 2.4, transfer sizes, and the alignment of the user buffer and the file offset must all be multiples of the logical block size of the file system. Under Linux 2.6, alignment to 512-byte boundaries suffices
在2.4版本及以下 4096B对齐,而2.6以后都是512B
关于查看逻辑块大小使用如下命令[root@node1 ~]# dumpe2fs /dev/hda5|grep -i "block size" dumpe2fs 1.42.9 (28-Dec-2013) Block size: 4096
如果要写入裸盘文件可以使用如下命令查看逻辑块大小,
[root@node1 ~]# parted /dev/sdb GNU Parted 3.1 Using /dev/sdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) p Model: ATA WDC WD121PURX-78 (scsi) Disk /dev/sdb: 12.0TB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags:
数据传输的开始点,即文件和设备的偏移量,必须是逻辑块大小的整数倍
待传递数据的长度必须是逻辑块大小的整数倍。
以上代码写入的数据存储引擎已经封装好了4K的边界对齐和块对齐,所以未设置4k边界对齐和写入数据块对齐
dd测试
使用dd对direct
标记进行测试
[root@node1 ~]# dd if=/dev/zero of=/nas/cephfs/n1/test_dd bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 0.284967 s, 1.9 GB/s
[root@node1 ~]# dd if=/dev/zero of=/nas/cephfs/n1/test_dd bs=1M count=512 oflag=direct
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 11.519 s, 46.6 MB/s
以上数据可见,如果不加direct标记,则数据会经过页缓存cat /proc/meminfo |grep -i dirty
来检测是否写入,因为操作系统页缓存处理速度肯定快,所以dd消耗的时间就少
而使用direct标记之后,会绕过操作系统缓存,数据直接交由磁盘处理,此时磁盘数据速度肯定会慢,所以耗费的时间就久
相关文章:

计算机专业每年都有国企招老吗,这十大专业在国企中最受欢迎,待遇高、前景好,有你的专业吗?...
古语说“三百六十行,行行出状元”这句话一点没错,但是当你报考传说中的“铁饭碗”、“金饭碗”的时候,你会发现,想入对行,首先你得选对专业,不管是对于报考还是以后的职业发展来说,选对专业和嫁…

实现一个基于 SharePoint 2013 的 Timecard 应用(下)
现在,基于 Timecard 数据来一点儿数据分析。 应用需求 对于 Timecard,分析下面 2 个方面: 对于单个项目,分析其中每个成员的工时占比,以此了解工作量分配,为组间人员调度提供参考。对于整个公司,…

新书来了!《ActionScript 3.0游戏设计基础(第2版)》
已经开始预售:猛戳这里!多谢支持!文后附件为译者序。转载于:https://blog.51cto.com/58script/1202944

springcloud-spring cloud config统一配置中心
统一配置中心 为什么需要统一配置中心? 统一配置中心顾名思义,就是将配置统一管理,配置统一管理的好处是在日后大规模集群部署服务应用时相同的服务配置一致,日后再修改配置只需要统一修改全部同步,不需要一个一个服务手动维护 统一配置中心的架构图: 服务者消费者集群&#x…

a-awk外部变量传入,内部变量传出,同时过滤空格及其他字符
变量传递 外部变量传入 lsblk|awk -v A$A -v B$B {print A,B}lsblk | awk {print A,B} A$A B$B 内部变量传出 eval $(lsblk|awk {print "A$1"})eval $(lsblk|awk printf("A%s\n",$1)) 同时过滤空格及其他字符 df -Th|grep ceph- 2>/dev/null|awk -F…

UVa12096.The SetStack Computer
题目链接:http://uva.onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&pageshow_problem&problem3248 1391605812096The SetStack ComputerAcceptedC0.3022014-07-21 03:43:15The SetStack Computer Background from Wikipedia: \Set theory…

网络设置计算机,怎么重置电脑网络设置
现如今网络已经融入了我们的生活,我们对网络的要求也越来越过了,那么你知道怎么重置电脑网络设置吗?下面是学习啦小编整理的一些关于怎么重置电脑网络设置的相关资料,供你参考。重置电脑网络设置的方法开始→运行→输入:CMD 点击…

centos 学习日记 文件默认权限:umaks
使用方法: [rootkin /]# umask 0022 [rootkin /]# umask -S urwx,grx,orx上面显示的是本机上面文件默认的权限。 第二个好理解。 第一个要注意的是: umask的分值是指"该默认值需要减掉的权限" 第一个数字可以不管他 第二,三&…

linux 基础命令一
linux命令基础 hash:hash操做 shell搜寻到的外部命令的路径结果会缓存至kv(key-value)存储中history:查看历史 history命令:管理命令历史。登录shell时,会读取命令历史文件中记录下的命令:~/.bash_history,而且新执行的命令只会记录在缓存中:…

ceph pool 相关命令
文章目录Pool创建ec pool创建副本pool创建Pool参数创建根故障域及添加osd其他命令Tier相关Pool创建 ec pool创建 创建profile ceph osd erasure-code-profile set $profile_name k$k m$m crush-failure-domainhost crush-root$group_name 创建规则 ceph osd crush rule creat…

临平职高计算机专业高职考大学,临平职高高考再传捷报 本科连续四年蝉联杭州市第一...
又到一年放榜时,几家欢喜几家愁。然而,2018年的高考成绩出来后,可把临平市职业高级中学(以下简称“临平职高”)的师生们乐坏了。正所谓三年寒窗,开出芬芳;三年磨剑,努力未变;三年坚守࿰…

音频编辑大师 3.3 注冊名 注冊码
username:cae3_user000注冊码:beslbFVpFEhxvxA0F23xW7heAeWoWjuWhvBIMN0Je1o我试过了,绝对能够用。转载于:https://www.cnblogs.com/mfrbuaa/p/3858221.html

兰戈 —— Rango
2019独角兽企业重金招聘Python工程师标准>>> 一部西部卡通片,据说恶搞了《正午》这部著名的西部片,可惜我没有看过《正午》。非常喜欢这部片子里的音乐,恢宏大气。 剧情: 兰戈(约翰尼德普 Johnny Depp 配…

C#/.Net判断是否为周末/节假日
判断节假日请求的Api:http://tool.bitefu.net/jiari/ /// <summary>/// 判断是不是周末/节假日/// </summary>/// <param name"date">日期</param>/// <returns>周末和节假日返回true,工作日返回false</retu…

ceph 部署单机集群
文章目录ceph-deploy部署集群ceph-deploy 部署单机ceph-deploy 创建osdceph osd创建资源池ceph创建rbd块设备ceph创建fs文件系统本文档主要参考ceph官方命令进行部署,使用的时侯ceph-deploy原生命令方式进行集群各个组件的创建,删除,后续会增…

hdu-4302-Holedox Eating-线段树-单点更新,有策略的单点查询
一開始实在是不知道怎么做,后来经过指导,猛然发现,仅仅须要记录某个区间内是否有值就可以。 flag[i]:代表i区间内,共同拥有的蛋糕数量。 放置蛋糕的时候非常好操作,单点更新。 ip:老鼠当前的位置 寻找吃哪一…

华南理工计算机基础知识题,华南理工_计算机应用基础_随堂练习答案(2017年)
华南理工_计算机应用基础_随堂练习答案(2017年) (18页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!19.9 积分. . . .华南理工-计算机应用基础-随堂练习答案(2017年)第一章 计算机基础知…

python 添加进度条
安装: pip install tqdm使用: from tqdm import tqdm import time for i in tqdm(rang(10)):time.sleep(0.1)转载于:https://www.cnblogs.com/royfans/p/10271496.html

ceph osd 相关命令
混合osd的部署 先部署所有的ssd 在/etc/ceph.conf中最后添加ssd做osd的block大小如下: 比如部署中有两个ssd,则添加 [osd.0] bluestore_block_size xxxx [osd.1] bluestore_block_size xxx 如上的size大小计算如下,如ssd容量为800G&#x…

一万年太久,只争朝夕
好久没有写了,很多东西都已经忘记,不是因为别的,仅仅是觉得经历太多,没有地方装载那么多,想想以前的愿望,想过要当作家、想过要开个小店,但是看看现在,一切都变得遥不可及࿰…

上海职称英语和计算机考试时间,上海职称英语考试时间
上海2015年职称英语考试时间为12月25日到2015年1月15日,报名网站为:上海职业能力考试院。2015年如何短时间攻破职称英语考试关键点一:调整好备考心态,树立信心,切记懂乱、随便放弃总的来说,职称英语考生以中…

Caliburn.Micro 资源随时添加
Caliburn.Micro – Hello World http://buksbaum.us/2010/08/01/caliburn-micro-hello-world/ http://blog.csdn.net/xbgzs2010/article/details/18447625 转载于:https://www.cnblogs.com/ifendou/p/3870256.html

ros-kinetic install error: sudo rosdep init ImportError: No module named 'rosdep2'
refer to: https://blog.csdn.net/yueyueniaolzp/article/details/85070093 方法一 将Ubuntu默认python版本设置为2.7方法二 终端输入命令sudo apt-get install python3-rosdep转载于:https://www.cnblogs.com/xbit/p/10275218.html

Android:项目关联Library
为什么80%的码农都做不了架构师?>>> 近日,在做一个人人的第三方小项目。打算直接使用renren 的sdk 进行开发。因为renren的sdk是以android library project 形式发布的(关于这种project的内容可以参考android library project&…

winxp运行html代码,关于WinXP系统实现自动化运行的操作技巧
关于WinXP系统实现自动化运行的操作技巧发布时间:2014-06-16 10:00:29 作者:佚名 我要评论与其他系统相比,WinXP系统的自动化运行已经大大改进,根据经验为大家总结了一份关于实现自动化运行的操作技巧,希望对大家…

ACM1881 01背包问题应用
01背包问题动态规划应用 acm1881毕业bg 将必须离开的时间限制看作背包容量,先将他们由小到大排序,然后在排完序的数组中对每个实例都从它的时间限制开始(背包容量)到它的延长时间进行遍历; 1 #include<iostream>2 #include&…

解决MVC返回Json中日期格式问题
问题:MVC中使用控制器返回JsonResult,如果带有日期字段的对象,浏览器接收到的json中会变成形如/Date(123123123)/格式。如何在easyui等中直接使用是个麻烦事。 解决方法:从源头开始。既然Controller控制器的Json()方法会自动转化&…
eclipse 出现user operation is waiting
project->properties->Builders 将带有 validator的选项全部去掉,然后保存一切就ok了。 转载于:https://www.cnblogs.com/fengnan/p/10276162.html

SHELL 技能树(持续更新)
相关xmind的原始文件已上传至mind-Mapping github,如有需要可自行下载,欢迎批评指正。 关于分布式存储的整体技能的学习历程 可以参考,分布式存储技能图谱