文件系统中的journal device和write cache

众所周知,文件系统中的journal
device主要有两个目的:

1.保证数据的一致性;

2.缩短写响应时间

要保证数据的一致性,当然避免不了和磁盘write
cache的交互,这体现在两个层次:

1.文件系统中对journal
device的写

充分利用journal
device的写速度快的特点,写操作先到journal
device设备,一次写到journal
device的事务包括要写的data和下次取它才需要的最少的meta
data。如何确保这些数据彻底落到journal
device上,有两种处理方式:

a.完全disable
disk write cache,这样保证每次对journal
device的写都已经返回;

b.利用disk
write cache flush机制,在用作journal
device的设备上的每次写在隔一段时间就flash
write cache,或者在

2. 文件系统对物理磁盘的写

对于最终落到存储设备上的写,因为有journal
device背书,可以异步也可以同步写,但要求保证对于每次写事务:写返回之前肯定能确保数据落到磁盘,而不会在write
cache里。考虑到和journal
device的配合,一般流程包括两个线程:

2.1落盘线程

a.从journal
device读取还未了落盘的写请求记录;

a.执行真正磁盘写;

b.调用对于磁盘设备的flushwrte cache操作;

c.对于已经完全落盘的操作,从journal
device中去掉对应的记录

d.返回

至此,一次彻底落盘的写才算完成。

2.2写提交线程

a.打包写请求中的data和metadata
(包括offset,起始地址等),生成对journal
device写的原始数据

b.从journal
device上寻找合适的空间,记录上面的写请求,也就上把上面的原始数据写入;

c.如果journal
device的写缓存没有关闭,刷journal
device的写缓存,确保数据落到journal
device物理存储设备上;

d.向上层返回写请求

至此,一次写请求返回。

根据上面分析,写响应时间是从写请求发出到写提交线程中的步骤d完成的时间。由于通常日志设备比普通磁盘的读写速度快很多,因此它能大大缩短写响应时间。但如果journal
device上的写请求由于没有及时下发,被撑满了,那么它就基本上只有执行落盘线程的路径了,可也遇见此时写响应时间会急剧增加很多。

综合考虑到写提交线程和落盘线程的配合,可以看到在有文件系统journal
device背书的情况下,落盘线程可以从同步写变成异步写,只要最终保证写请求能够按照先来后到的顺序落盘即可,这样理论上能够增加IO吞吐量。但是实际要达到这一效果,需要journal
device和磁盘的紧密协同才行。

3.刷写缓存的操作和关闭写缓存的方法

可以参考下面对SCSI/sas盘的刷写缓存的操作:

static
int flushSCSIwc(int fd) {

struct
sg_io_hdr io_hdr;

unsigned
char sense_b[32];

unsigned
char cmdp[10];

memset(&io_hdr,
0, sizeof(struct sg_io_hdr));

memset(sense_b,
0, sizeof(sense_b));

memset(cmdp,
0, sizeof(cmdp));

io_hdr.interface_id
= ‘S‘;

io_hdr.dxfer_direction
= SG_DXFER_NONE;

cmdp[0]
= 0x35;

cmdp[1]
= 0x00;

cmdp[2]
= 0x00;

cmdp[3]
= 0x00;

cmdp[4]
= 0x00;

cmdp[5]
= 0x00;

cmdp[6]
= 0x00;

cmdp[7]
= 0x00;

cmdp[8]
= 0x00;

cmdp[9]
= 0x00;

io_hdr.cmdp
= cmdp;

io_hdr.cmd_len
= sizeof(cmdp);

io_hdr.sbp
= sense_b;

io_hdr.mx_sb_len
= sizeof(sense_b);

io_hdr.timeout
= 60000;

if(ioctl(fd,
SG_IO, &io_hdr) == -1)

if(io_hdr.status
!= 0)

return
EIO;

return
0;

}

而关闭写缓存的办法也很简单:

hdparm
-W1  /dev/sdq

当然也可以用MegaCLI或者lsitutil等工具来控制。

时间: 2024-10-27 05:10:23

文件系统中的journal device和write cache的相关文章

深入浅出文件系统中的日志系统功能

1.日志系统出现的背景 日志系统出现在20世纪末.最早的日志文件系统出现在1990年IBM的JFS(journal file system)上.1994年,为了更好地支持高性能,SilliconGraphics引进了XFS.从20011年开始,linux系统中就开始支持ext3fs.到了今天,ext4fs.Reiser4.ceph等文件系统都支持了日志系统. 2.日志系统的功能 日志文件系统的功能主要是为了提高文件系统的一致性和性能. 2.1一致性 通过日志系统记录写操作,避免异常关机.掉电等造

Linux文件系统中的inode节点详细介绍

这篇文章主要介绍了Linux文件系统中的inode节点,详细讲解了inode是什么.inode包含的信息.inode号码的相关资料等. 一.inode是什么? 理解inode,要从文件储存说起.文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block).这种由多个扇区组成的"块&q

STAGE1能不能直接引导放在文件系统中的STAGE2.txt

使用GRUB的困惑:STAGE1能不能直接引导放在文件系统中的STAGE2? blocklist (hd0,1)/boot/grub/stage2 GRUB有几个重要的文件,STAGE1.STAGE1.5.STAGE2 STAGE1:它只有512字节,通常放在MBR中,它的作用很简单,就是在系统启动时用于装载STAGE2并将控制权交给它. STAGE2:GRUB的核心,所有的功能都是由它实现. STAGE1.5: 介于STAGE1和STAGE2之间,是它们的桥梁,因为STAGE2较大,通常都是放

Hive数据导入——数据存储在Hadoop分布式文件系统中,往Hive表里面导入数据只是简单的将数据移动到表所在的目录中!

转自:http://blog.csdn.net/lifuxiangcaohui/article/details/40588929 Hive是基于Hadoop分布式文件系统的,它的数据存储在Hadoop分布式文件系统中.Hive本身是没有专门的数据存储格式,也没有为数据建立索引,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据.所以往Hive表里面导入数据只是简单的将数据移动到表所在的目录中! Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中

显示Hadoop文件系统中一组路径的文件信息

//显示Hadoop文件系统中一组路径的文件信息 //我们可以用这个程序来显示一组路径集目录列表的并集 package com; import java.io.IOException; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.

使用seek()方法,将Hadoop文件系统中的一个文件在标准输出上显示两次

//使用seek()方法,将Hadoop文件系统中的一个文件在标准输出上显示两次 package com; import java.io.IOException; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileSystem; import org.apac

解决Android studio 中的 Android Device Monitor 中 File Explorer 无法打开data目录的方法(转载 http://www.jianshu.com/p/d8a9a2918c61)

Android Device Monitor 文件管理的常见问题  (转自http://www.jianshu.com/p/d8a9a2918c61) 作者 knightaoko 关注 2017.03.21 11:41* 字数 2750 阅读 770评论 5喜欢 9 Android Device Monitor 是 Android Studio 中用于监测模拟器或真机运行状态的一款开发者工具.但开发者在使用它的过程中往往会遇到很多问题,尤其对于新手.本文分析了实际学习中遇到的问题,包括:1. F

如何把一个数据存到文件系统中?是怎么存的?--【sky原创】

块设备文件: 表示文件系统高速缓存的设备,例如硬盘驱动器 设备文件: 表示非高速缓存的设备,例如磁带驱动器.鼠标和系统终端 那么如何把一个数据存到文件系统中?是怎么存的? 一般地,我们认为文件就是文件的数据信息,它存放在磁盘上,如果单纯的这样理解就错了 和每一个文件相关的信息都会放在索引节点上,比方说它是字符设备的话,就是字符设备文件,还有它的权限,属组,以及大小.更新时间等信息都属于文件的相关信息,如果一个文件的大小是1kb的话,那么实际拷贝文件的话,所需要的空间要大于1kb,因为它还要拷贝索

在Android Studio中打开Android Device Monitor时报错的解决方法

在Android Studio中打开Android Device Monitor时报以下错误时(Android-SDK\tools\lib\monitor-x86_64\configuration\1491536029820.log),请关闭Android Studio后以管理员的模式打开Android Studio后即可解决此问题. !SESSION 2017-04-07 11:33:49.545 -----------------------------------------------