CN103514260B - 内存日志文件系统及其实现方法 - Google Patents
内存日志文件系统及其实现方法 Download PDFInfo
- Publication number
- CN103514260B CN103514260B CN201310350603.XA CN201310350603A CN103514260B CN 103514260 B CN103514260 B CN 103514260B CN 201310350603 A CN201310350603 A CN 201310350603A CN 103514260 B CN103514260 B CN 103514260B
- Authority
- CN
- China
- Prior art keywords
- log area
- file system
- internal memory
- hard disk
- log
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F1/00—Details not covered by groups G06F3/00 - G06F13/00 and G06F21/00
- G06F1/26—Power supply means, e.g. regulation thereof
- G06F1/32—Means for saving power
- G06F1/3203—Power management, i.e. event-based initiation of a power-saving mode
- G06F1/3234—Power saving characterised by the action undertaken
- G06F1/325—Power saving in peripheral device
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/18—File system types
- G06F16/1805—Append-only file systems, e.g. using logs or journals to store data
- G06F16/1815—Journaling file systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0638—Organizing or formatting or addressing of data
- G06F3/0643—Management of files
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Human Computer Interaction (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于EXT4文件系统的内存日志文件系统,其特征在于所述内存日志文件系统包括用于在内存中构建映射硬盘分区EXT4文件系统日志区的内存日志区的内存日志区构建模块、用于当硬盘分区挂载时将硬盘分区中日志区文件读入到内存日志区,当硬盘分区卸载时将内存日志区作为日志区文件写入硬盘的日志文件刷新模块以及用于在硬盘分区卸载后将映射硬盘分区EXT4文件系统的内存日志区写入另一硬盘分区日志区的日志区回写模块。该系统既可以通过降低硬盘的访问次数来降低硬盘功耗,同时由于内存的速度远高于硬盘,因此内存日志文件系统也可以提高整个系统的性能。
Description
技术领域
本发明属于文件系统优化技术领域,具体涉及一种内存日志文件系统及其实现方法。
背景技术
降低硬盘功耗策略分为动态调速策略和睡眠唤醒策略两类。在低负载的情况下,部件采用比较低的工作频率。在高负载的情况下,部件工作在高频率下。这种根据负载的变化动态调整部件工作频率以节约功耗的方法叫动态调速技术。根据部件空闲时间的长短来使部件进入不同深度的睡眠状态可以降低部件的功耗,这种方法叫睡眠唤醒策略。
动态调速技术针在CPU中叫动态电压频率调节DVFS。CPU的功耗由静态功耗和动态功耗两部分组成。动态功耗的计算公式p=cv2f,C是电容值,V是电压,f是频率。因此降低工作电压可以使CPU的功耗平方级的下降。DVFS在具体实现时,是采用电压/频率同时调节的策略。如Intel T2400CPU在电压为0.95V主频是997.5MHz,电压为1.263V时主频是1828.7MHz。这样DVFS技术理论上就可以使CPU的动态功耗立方式的下降。但是这种动态功耗的降低只是在CPU工作时才起作用。动态速率调节技术针对计算机的其他部件目前大都处于研究阶段,并没有实际的产品问世。
当设备处于空闲状态时关闭该设备是另外一种降低设备功耗常用的方法。目前的硬盘支持多种不同的工作状态:读写、空闲、睡眠等,每个状态的功耗是不一样的。在睡眠状态下磁头停止寻道,盘片停止旋转,该状态下能够使得硬盘的功耗最低。睡眠唤醒策略就是当硬盘处于空闲状态时使硬盘睡眠,当有请求到达时再唤醒硬盘。硬盘进入睡眠状态和从睡眠状态中唤醒需要消耗额外的功耗Pdown-up,当硬盘睡眠t时间带来的功耗收益正好等于Pdown-up时,称t为临界时间。只有当硬盘睡眠时间大于临界时间时,这样该策略才有意义。睡眠唤醒策略的重点就是决定硬盘什么时候睡眠以及睡眠时间的长短。睡眠唤醒策略不可避免的会带来性能的损失,因此在对性能要求比较高的服务器领域这种策略并不实用。
带动硬盘盘片旋转的马达消耗了硬盘很大一部分功耗,当磁盘空转时,针对两块盘片的硬盘有50%的功耗消耗在马达上,针对于10盘片的服务器硬盘有81.34%的能耗消耗在马达上。为了尽可能的减少硬盘睡眠带来的性能损失,可以采用降低硬盘转速,而不是使硬盘停止旋转。降低硬盘的转速可以使硬盘功耗平方式下降。DPRM(Dynamic Rotations Per Minute)技术就是根据负载的变化动态调整硬盘马达的转速。为了支持多转速的硬盘,需要能够动态控制硬盘马达的转速以及更加复杂的算法来确定磁头的位置等。这些要求提高了硬盘固件和硬件设计的复杂性,因此多转速的硬盘在市场上并不存在。
动态调速策略通过硬盘负载的高低来调整硬盘的转速,但是支持动态调速的硬盘这种市场上并不存在。睡眠唤醒策略通过延迟或减少对硬盘的操作使硬盘的睡眠时间延长进而降低硬盘的功耗,但是睡眠唤醒策略不可避免的会降低硬盘的性能。本发明因此而来。
发明内容
本发明目的在于提供一种基于EXT4文件系统的内存日志文件系统,通过从文件系统层来降低计算机硬盘的功耗同时提升计算机的性能,所提出的方法适用于所有使用的计算机,解决了计算机硬盘功耗高、性能低的问题。
为了解决现有技术中的这些问题,本发明提供的技术方案是:
一种基于EXT4文件系统的内存日志文件系统,其特征在于所述内存日志文件系统包括在内存中构建映射硬盘分区EXT4文件系统日志区的内存日志区的内存日志区构建模块、当硬盘分区挂载时将硬盘分区中日志区文件读入到内存日志区,当硬盘分区卸载时将内存日志区作为日志区文件写入硬盘的日志文件刷新模块以及在硬盘分区卸载后将映射硬盘分区EXT4文件系统的内存日志区写入另一硬盘分区日志区的日志区回写模块。
优选的,所述内存日志区构建模块采用RamDisk构建内存日志区,并确定RamDisk的大小为硬盘分区中日志区的容量。硬盘分区中日志区的容量一般为128MB。
优选的,所述内存日志区构建模块通过RamDisk构建内存日志区后,在RamDisk上按照EXT4文件系统日志区的结构格式化内存日志区,构建内存日志区的结构。
优选的,所述内存日志区构建模块通过RamDisk构建内存日志区后,在将EXT4文件系统日志区读取到内存日志区前在内存日志区填充0。
优选的,所述日志文件刷新模块为事件驱动,包括卸载子模块和挂载子模块,所述卸载子模块用于当硬盘分区要卸载的时候执行,将内存日志区写入硬盘分区;所述挂载子模块用于当硬盘分区挂载后执行,将硬盘分区中的日志区文件从硬盘分区中读入到内存日志区。
优选的,所述挂载子模块用于执行:
1)检查硬盘分区根目录下是否有日志区文件,若有则拷贝到内存中,没有则在内存中创建;
2)删除EXT4文件系统在硬盘上的日志区;
3)将EXT4文件系统的日志区设置为内存日志区;
4)挂载EXT4文件系统。
优选的,所述卸载子模块用于执行:
1)卸载EXT4文件系统;
2)将内存日志区备份到硬盘根分区;
3)释放内存日志区的内存。
优选的,所述日志区回写模块负责在硬盘分区卸载成功后在释放内存日志区的内存前将内存日志区写入到另一硬盘分区的日志区。
本发明提供一种既可以降低硬盘功耗又可以提升系统整体性能的内存日志文件系统。在EXT4文件系统的基础上构建了内存日志文件系统。采用的日志模式是默认的预定模式。EXT4文件系统支持三种日志模式:日志(journal)、预订(ordered)以及写回(writeback)。在预订模式下,只有元数据会写入日志区。在此模式下,一个进程向硬盘写入数据的时候分三步:(1)将文件普通数据写入到硬盘普通数据区;(2)将文件元数据的修改写入到硬盘日志区;(3)将文件元数据的修改写入到文件所在硬盘的原始位置。为了尽可能的保证文件内容的一致性,EXT4文件系统会确保在元数据写入硬盘之前,先将普通数据写入硬盘。
本发明技术方案中EXT4文件系统的正常工作流程主要分为5个步骤:
(1)当操作系统需要的数据不在内存中的时候,会触发pagefault缺页异常,将需要的数据读入内存。虽然对操作系统来说需要的是普通数据,但是只有通过元数据才能找到这些普通数据。处于性能上的考虑,操作系统会将元数据跟普通数据一并读入到内存。
(2)数据的修改会在内存中进行。修改完成后,会将数据所在页的标志位设置为脏。修改普通数据之前,会先修改普通数据对应的元数据。这些修改包括文件系统块的最后修改时间、在块位图中将数据占用的文件系统块设置为已用等。
(3)内核脏数据刷新线程flush每隔5秒钟会将内存中的脏页刷新到硬盘上。EXT4是就地更新(update-in-place)文件系统,普通数据会首先被写入到硬盘本来的位置。写入硬盘的数据会使用I/O调度器进行合并,然后使用submit_bh函数写入到硬盘。
(4)EXT4日志区的预定工作模式只会将元数据写入到日志区。为了保证数据的一致性,元数据会首先写入到硬盘上的日志区。该过程是由kjournal内核线程完成的。kjournal会将内存中的元数据复制一份,然后将写入的位置修改为日志区,这样复制的元数据就可以提交给日志区。
(5)步骤(4)完成后,kjournal内核线程会向日志区写入一个提交块,表示数据已经安全写入到硬盘日志区。这时候,kjournal就需要进行checkout,将最原始的元数据写入到硬盘上原来的位置。
本发明内存日志文件系统(Memory Journal File System,MJFS)与ext4不同的主要正常工作流程变化是在步骤(4),备份的元数据不再写入硬盘而是写入到内存。文件系统将日志区作为普通文件对待,因此支持将日志区放在其他设备上。如分区I的日志区可以放在分区II上,但是需要将分区II格式化为日志区。MJFS的设计思想是,将一部分内存当做RamDisk来使用,然后将RamDisk格式化为内存日志区,最后是使用该日志区来替换EXT4原有的日志区。
为了能够保证内存日志文件系统在计算机正常重启、关机时的一致性,本文采用事件驱动日志文件的刷新机制。具体的是:当分区I要卸载的时候执行umount_MJFS.sh脚本将内存日志区写入分区II,当分区I挂载后执行mount_MJFS.sh脚本再将该日志区从分区I中读入到内存日志区。
MJFS只能保证正常关机或重启时文件系统的一致性,并不能保证突然掉电等一些异常情况下文件系统的一致性。由于mount_MJFS.sh脚本加载的内存日志区是上一次umount_MJFS.sh脚本产生的,因此日志区始终是一致的。无论突然掉电会不会破坏文件系统的一致性,使用fsck仅仅检查该内存日志区并不会发现错误。必修使用fsck对整个分区进行检查,才能发现潜在的文件系统不一致。也就是当突然掉电后,由于内存日志区中的数据没有被保存,内存日志文件系统不在具有日志文件系统快速从崩溃中恢复的特性。但是突然掉电这种情况发生的概率比较小,尤其是对数据一致性要求比较高的数据中心一般都有UPS等手段来应对突然掉电。并且目前已经有一些技术手段来保证文件系统运行时的一致性,这些技术可以进一步减少突然掉电给数据造成的破坏。
内存日志文件系统需要将一部分内存当做RamDisk来使用,然后将RamDisk格式化为内存日志区,最后是使用该日志区来替换EXT4原有的日志区。RamDisk又称为RAMdriver,它是一块内存,通过软件的方式来当硬盘使用。Ramdisk的速度要快于传统的存储介质,如SSD、硬盘等,因此可以用来做存储的加速。Linux操作系统直接支持RamDisk,但是需要配置内核的时候打开相关配置选项(如BLK_DEV_RAM等,默认是打开的)。EXT4默认日志区的大小是128MB,因此本文也需要一个128MB大小的RamDisk。调整RamDisk的大小可以通过修改Linux内核的blk_dev_ram_size参数,也可以修改Linux内核启动菜单中的参数ramdisk_size。
日志区就像一个文件系统,有自己的超级块、描述符等。日志区有自己的结构,因此必须在RamDisk上建立日志区的结构,RamDisk才能作为内存日志区来使用。Linux操作系统提供mke2fs工具来完成日志区的构建。RamDisk格式化为日志区后,还需要使用tune2fs工具将EXT4文件系统的日志区设定为RamDisk。采用这种方法构建的内存日志文件系统,不需要对分区进行格式化,因此能够保证分区已有数据的安全。
相对于现有技术中的方案,本发明的优点是:
本发明技术方案内存日志文件系统主要是使用内存来做日志区,由于日志文件系统中的日志区是访问最频繁的一块区域,常成为系统性能的瓶颈。为了减少对硬盘的访问,降低硬盘的功耗,同时提高系统的性能,本发明内存日志文件系统。将日志文件系统的日志区从硬盘迁移到内存,同时尽可能的保证内存日志文件系统的一致性。
本发明从文件系统层来研究降低硬盘功耗的方法,由于目前操作系统中常用的文件系统是日志文件系统,日志文件系统会在硬盘上开辟一个日志区,用来实现快速从崩溃中恢复过来。由于文件的任何修改都会访问日志区,导致日志区的访问次数远高于硬盘上的其他区域。本发明通过在内存中开辟日志区,这样既可以通过降低硬盘的访问次数来降低硬盘功耗,同时由于内存的速度远高于硬盘,因此内存日志文件系统也可以提高整个系统的性能。实验发现,本发明的内存日志文件系统在最理想的测试用例下,可以将硬盘的功耗降低19.32%,同时系统的性能提高55.80%。
附图说明
下面结合附图及实施例对本发明作进一步描述:
图1为日志文件系统EXT4文件系统工作流程图,其中Meta代表的是元数据,Norm代表的是普通数据。
图2是内存日志文件系统的工作流程图;其中Meta代表的是元数据,Norm代表的是普通数据。分区I是内存日志文件系统所在的分区,分区II是非内存日志文件系统所在的分区。
图3是本发明内存日志文件系统在Fdtree、Metarates、IOzone、Bonnie++和编译内核五种测试用例下的性能提升效果图;
图4是本发明内存日志文件系统在Fdtree、Metarates、IOzone、Bonnie++和编译内核五种测试用例下的节约的能耗和功耗效果图;其中IOzone、Bonnie++测试用例下功耗没有变化,能耗分别降低了0.25%和3.44%。
具体实施方式
以下结合具体实施例对上述方案做进一步说明。应理解,这些实施例是用于说明本发明而不限于限制本发明的范围。实施例中采用的实施条件可以根据具体厂家的条件做进一步调整,未注明的实施条件通常为常规实验中的条件。
实施例内存日志文件系统的开发实例
一、日志区访问频率的研究
本实施例在操作系统的block-level层统计日志区的访问频率。该层可以分析文件系统的很多特性,如区分每一个块是读还是写、根据块号确定访问是顺序还是随机的等。本文需要区分属于硬盘的日志区文件系统块。为此本实施例使用systemtap脚本语言设计实现了一个BJA(Block JournalAnalysis)工具。
systemtap是为Linux操作系统开发的内核调试工具。内核开发人员以及操作系统的管理员仅仅使用systemtap提供的命令行接口就可以跟踪和调试任何内核函数、诊断内核错误、进行操作系统的性能分析等工作,而不需要修改内核源代码、重新编译内核、重启计算机等琐碎的工作。BJA使用systemtap探测的函数是submit_bh。该函数有两个参数,一个是读写标志位,另外一个是buffer_head结构体。buffer_head中保存的是将要写入硬盘的数据,因此会包含该数据的文件系统块号。
BJA工作在block层,可以探测发向硬盘请求的每个文件系统块。BJA会区分这些块是读还是写,并将块号记录下来。有了块号使用debugfs工具提供的icheck命令便很容易确定该块是否属于8号inode的日志区。通过日志区inode的索引块号来找到属于日志区的块号,该方法需要修改Linux内核。内核的修改会带来很多不确定因素,因此本文使用BJA工具来统计日志区的访问频率。
表1是使用BJA工具统计创建目录、删除目录、创建文件以及删除文件修改的文件系统块。从表中可以看出,大约每两个文件系统块就有一个访问的是日志区。对于一个10GB的分区,若日志区的大小是默认的128MB,那么日志区的访问频率大约是硬盘其他区域的79倍((10G-128M)/128M)。程序调用fsync越频繁,日志区的压力就会越大。应用程序都会显示的调用fsync来刷新数据,iPhoto在一次任务中会调用上千次fsync。fsync的频繁调用进一步加大了日志区的压力。正因为日志区访问频繁,所以日志文件系统并不适用要求均衡读写的Nand Flash领域,如SSD、U盘等。
表1日志区访问频率
创建目录 | 删除目录 | 创建文件 | 删除文件 | |
普通数据块 | 7 | 7 | 4 | 5 |
日志区块 | 9 | 10 | 6 | 7 |
总和 | 16 | 17 | 10 | 12 |
日志区百分比 | 56% | 59% | 60% | 58% |
日志区是硬盘上最频繁访问的一块区域。日志区的频繁访问,经常成为硬盘的性能瓶颈。发现日志区的位置对硬盘的性能影响高达30%,当日志区位于分区的中间位置时性能最高。目前的日志文件系统也会尽可能的将日志区放在分区的中间位置。将日志区放在SSD固态硬盘中,由于固态硬盘的速度比普通硬盘的速度高,所以会提升硬盘的性能。同时减少了对硬盘的访问,从而降低了硬盘的功耗。
将硬盘中经常访问的数据放入内存,通过减少对硬盘的访问来使硬盘睡眠时间延长,也可以降低硬盘的功耗。将根分区常驻内存,因为根分区中保存的是系统经常访问的库函数、内核函数等。根分区进入内存后,硬盘便可以进行长时间的睡眠而不被打断,同时操作系统还可以进行一些正常的操作。试验结果发现,这样做硬盘可以节能8.1%-14.4%。
日志区中的数据只有在系统崩溃,进行数据恢复的时候才能用上。日志区大小是固定的,因此日志区会被重复使用。分析发现,当检查的事务完成后就会标示这些块可以被重新利用。因此日志区中的数据并没有硬盘上其他数据重要。将硬盘上不重要的而且又频繁访问的数据放入内存是一个很好的选择。
本实施例将日志区放入内存,来降低硬盘的功耗,提升硬盘的性能。但是设计一个内存日志文件系统面临着很多挑战,下面介绍一下这些问题:
(1)兼容性问题。在计算机的发展中,新技术的出现一般都要兼容旧技术。内存日志文件系统若不能兼容旧的日志文件系统,日志文件系统在转变为内存日志文件系统的时候,必须将分区进行格式化。这样已有分区上的数据就必须首先拷贝到其他地方,这会阻碍内存日志文件系统的普及。本文采用用户态的工具来设计内存日志文件系统,而不是修改Linux内核源码,这样便可以兼容已有的日志文件系统。
(2)一致性问题。文件系统最重要的功能便是保证数据的安全性。内存日志文件系统为了保证文件系统的一致性,采用事件驱动机制。当出现分区卸载请求时,将内存日志区刷新到硬盘。当分区挂载时,再将内存日志区从硬盘中读入到内存。
(3)内存分配与回收问题。若内存日志区占有的内存能够被LRU算法回收或交换到硬盘上的swap分区上,那么就会影响内存日志文件系统的性能甚至一致性。因此本文的内存日志区会常驻内存不会被LRU算法回收或交换到swap分区上。在分区卸载时,需要使用特殊的工具来显示的回收内存日志区占有的内存。
二、内存日志文件系统
本实施例在EXT4文件系统的基础上设计MJFS。采用的日志模式是默认的预定模式。EXT4文件系统的正常工作流程如图1所示。主要分为5个步骤:
(1)当操作系统需要的数据不在内存中的时候,会触发pagefault缺页异常,将需要的数据读入内存。虽然对操作系统来说需要的是普通数据,但是只有通过元数据才能找到这些普通数据。处于性能上的考虑,操作系统会将元数据跟普通数据一并读入到内存。
(2)数据的修改会在内存中进行。修改完成后,会将数据所在页的标志位设置为脏。修改普通数据之前,会先修改普通数据对应的元数据。这些修改包括文件系统块的最后修改时间、在块位图中将数据占用的文件系统块设置为已用等。
(3)内核脏数据刷新线程flush每隔5秒钟会将内存中的脏页刷新到硬盘上。EXT4是就地更新(update-in-place)文件系统,普通数据会首先被写入到硬盘本来的位置。写入硬盘的数据会使用I/O调度器进行合并,然后使用submit_bh函数写入到硬盘。
(4)EXT4日志区的预定工作模式只会将元数据写入到日志区。为了保证数据的一致性,元数据会首先写入到硬盘上的日志区。该过程是由kjournal内核线程完成的。kjournal会将内存中的元数据复制一份,然后将写入的位置修改为日志区,这样复制的元数据就可以提交给日志区。
(5)步骤(4)完成后,kjournal内核线程会向日志区写入一个提交块,表示数据已经安全写入到硬盘日志区。这时候,kjournal就需要进行checkout,将最原始的元数据写入到硬盘上原来的位置。
如图2所示,内存日志文件系统MJFS的主要工作流程变化是在步骤(4),备份的元数据不再写入硬盘而是写入到内存。文件系统将日志区作为普通文件对待,因此支持将日志区放在其他设备上。如分区I的日志区可以放在分区II上,但是需要将分区II格式化为日志区。MJFS的设计思想是,将一部分内存当做RamDisk来使用,然后将RamDisk格式化为内存日志区,最后是使用该日志区来替换EXT4原有的日志区。
RamDisk又称为RAMdriver,它是一块内存,通过软件的方式来当硬盘使用。Ramdisk的速度要快于传统的存储介质,如SSD、硬盘等,因此可以用来做存储的加速。Linux操作系统直接支持RamDisk,但是需要配置内核的时候打开相关配置选项(如BLK_DEV_RAM等,默认是打开的)。EXT4默认日志区的大小是128MB,因此本文也需要一个128MB大小的RamDisk。调整RamDisk的大小可以通过修改Linux内核的blk_dev_ram_size参数,也可以修改Linux内核启动菜单中的参数ramdisk_size。
日志区就像一个文件系统,有自己的超级块、描述符等。日志区有自己的结构,因此必须在RamDisk上建立日志区的结构,RamDisk才能作为日志区来使用。Linux操作系统提供mke2fs工具来完成日志区的构建。RamDisk格式化为日志区后,还需要使用tune2fs工具将EXT4文件系统的日志区设定为RamDisk。采用这种方法构建的内存日志文件系统,不需要对分区进行格式化,因此能够保证分区已有数据的安全。
为了能够保证内存日志文件系统在计算机正常重启、关机时的一致性,本实施例采用事件驱动的日志文件刷新机制。具体是:当分区I要卸载的时候执行umount_MJFS.sh脚本将内存日志区写入分区II,当分区I挂载后执行mount_MJFS.sh脚本再将该日志区从分区I中读入到内存日志区。
分区I卸载的时候会将内存中的脏数据刷新到硬盘,这会涉及到日志区的修改。分区I卸载成功后日志区便不再改变,此时再将内存中的日志区写入到分区II,便可以保证内存日志文件系统的一致性。分区I挂载的时候,加载的日志区是保存在分区II上的,由于卸载时文件系统已经处于一致性,因此加载时内存日志文件系统依然是一致的。
mount_MJFS.sh基本的工作过程:
1)检查根目录下是否有日志区文件,若有则拷贝到内存中,没有则在内存中创建。
2)删除EXT4文件系统在硬盘上的日志区。
3)将EXT4文件系统的日志区设置为内存日志区。
4)挂载EXT4文件系统。
umount_MJFS.sh基本的工作过程:
1)卸载EXT4文件系统。
2)将内存日志区备份到硬盘根分区。
3)释放内存日志区的内存。
MJFS只能保证正常关机或重启时文件系统的一致性,并不能保证突然掉电等一些异常情况下文件系统的一致性。由于mount_MJFS.sh脚本加载的内存日志区是上一次umount_MJFS.sh脚本产生的,因此日志区始终是一致的。无论突然掉电会不会破坏文件系统的一致性,使用fsck仅仅检查该内存日志区并不会发现错误。必修使用fsck对整个分区进行检查,才能发现潜在的文件系统不一致。也就是当突然掉电后,由于内存日志区中的数据没有被保存,内存日志文件系统不在具有日志文件系统快速从崩溃中恢复的特性。但是突然掉电这种情况发生的概率比较小,尤其是对数据一致性要求比较高的数据中心一般都有UPS等手段来应对突然掉电。并且目前已经有一些技术手段来保证文件系统运行时的一致性,这些技术可以进一步减少突然掉电给数据造成的破坏。
RamDisk使用虚拟内存管理。所占有的内存会在RamDisk初始化的时候就分配好,只有当RamDisk真正要存取数据时才会分配物理内存。为了避免内存缺页异常给内存日志区造成的性能损失,内存日志区最好在初始化的时候就分配相应的物理内存。当RamDisk格式化为日志区时,可以通过要向该日志区填充0来促使操作系统来给日志区分配物理内存。本章使用的将RamDisk格式化为日志区的命令mke2fs会在日志区生成后,向日志区中填充0。这样当内存日志文件系统正常工作的时候,就不会因内存日志区缺页异常而带来性能损失。
系统的内存不足时,内核就会使用LRU算法来回收内存或者是将内存中的数据交换到swap分区上。本文设计的内存日志区要求在系统内存不足的时候也能够常驻内存,不然就会带来数据的丢失以及性能的损失。日志区是在RamDisk基础上建立起来的,由于RamDisk的特殊性,RamDisk所占有的物理内存是不归内核LRU算法管理的。为了验证这一结论,本节设计了一个内核模块,该内核模块可以扫描所有的物理页框,并将属于LRU算法管理的页框标示出来。在Fdtree测试用例运行前后分别运行一次该模块,发现LRU算法管理的页框并没有明显的变化。这说明内存日志区不归LRU算法来管理,也就不存在回收与交换到swap分区的可能。因此当内存日志文件系统卸载的时候需要使用工具(如util-linux工具中的blockdev命令)显示的回收内存日志区占有的内存。
三、实验验证
本实施例使用测试日志文件系统元数据性能的Fdtree、Metarates,测试文件系统I/O吞吐量的IOzone、Bonnie++四种Micro-benchmark来测试MJFS。Fdtree是用shell脚本写的,用来测试文件系创建目录、删除目录、创建文件、删除文件这四个方面的速度。Metaraes是一个MPI程序,常用于测试HPC下文件的创建、删除、修改速度。IOzone代码是开源的,被广泛的用来测试数据的吞吐量,有着丰富的数据访问模式以及参数设定。Bonnie++既可以测试读写性能,也可以测试文件的创建、删除速度。文件创建以及删除速度已经使用Fdtree和Metarates来单独测试,这里只使用Bonnie++的读写性能测试。
不同的文件系统在Macro-benchmark中的视频播放测试用例下,硬盘功耗基本相同。本实施例使用Macro-benchmark中的编译内核测试用例。编译内核是CPU密集型的任务,但是也会涉及大量的数据的读取和写入操作。本文编译的内核是最新稳定版的Linux3.6.1,使用“make defconfig”命令来产生默认的配置文件,采用单线程编译。
每种测试用例测试的侧重点是不一样的。Fdtree、Metarates侧重的是文件创建、删除的速度等,IOzone、Bonnie++侧重的是文件的随机、顺序读写速度等。图3是内存日志文件系统在5种不同的测试用例下相对于EXT4文件系统的性能提升效果图。图4是内存日志文件系统在5种不同的测试用例下相对于EXT4文件系统降低的能耗和功耗。从图3和图4中可以看出,在针对于文件系统元数据的测试中,内存日志文件系统的结果最好。而针对于I/O吞吐量的测试中,内存日志文件系统的性能提升和节约的功耗均在5%以内。这是因为元数据的测试使用的是小文件,这会涉及到大量日志区的操作,而I/O吞吐量的测试中使用的是大文件,日志区的操作相对比较少。而且I/O吞吐量测试中,硬盘的吞吐量已经达到极限,很难再通过优化文件系统来提高吞吐量。
图3为内存日志文件系统在Fdtree、Metarates、IOzone、Bonnie++和编译内核五种测试用例下的性能提升效果图。Fdtree对日志区的访问次数要高于Metarates。因此内存日志文件系统在Fdtree测试用例下性能提升最高为55.80%,同时硬盘的功耗降低幅度也最大为19.32%。编译器会将.c、.h文件加载到内存,同时会将编译生成的目标文件.o文件写入硬盘,因此编译内核也会涉及到大量文件的读写操作。从图3中可以看出,内存日志文件系统的在编译内核测试中性能下降了0.5%,由于下降不明显,本文归于测量误差。图4中显示,使用内存日志文件系统编译内核可以使硬盘的能耗降低1.9%,硬盘的功耗降低2.2%。图4为内存日志文件系统在Fdtree、Metarates、IOzone、Bonnie++和编译内核五种测试用例下的节约的能耗和功耗效果图。其中IOzone、Bonnie++测试用例下功耗没有变化,能耗分别降低了0.25%和3.44%。
四、应用领域
因此,MJFS的优点是可以降低硬盘的功耗,提升系统的性能。MJFS的缺点是需要额外的内存消耗(默认是128MB),而且突然掉电后,有可能会丧失日志文件系统快速从崩溃中恢复的特性。考虑到MJFS的优缺点,接下来总结一下MJFS最适合应用的场合。
(1)服务器或数据中心。服务器不仅会配有大量的内存,而且还提供不间断的电力供应。在加上服务器对性能的要求极高,因此MJFS在这种场合最能发挥自身的优势同时又避免了本身的不足。
(2)带有SSD的笔记本。处于性能、重量以及功耗方面的考虑,笔记本已经开始使用SSD来代替传统的硬盘。但是SSD最大的缺陷便是使用寿命会随着写次数的增多而降低。若直接将传统的日志文件系统应用到SSD,那么日志区的频繁写入操作,会降低SSD的寿命。MJFS不仅会避免这种情况,而且还能降低SSD的功耗。目前的笔记本均有电池,并且大都会配置4GB的内存,可以避免MJFS的缺点。
(3)智能手机或平板。Google公司已经考虑在使用android操作系统的智能设备中使用EXT4作为默认的文件系统。智能设备目前采用的都是Flash存储介质。考虑到智能设备目前资源有限(内存相对较小),但是为了延长Flash的使用寿命,在这些智能设备中可以使用内存日志区相对较小的MJFS。
上述实例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人是能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。凡根据本发明精神实质所做的等效变换或修饰,都应涵盖在本发明的保护范围之内。
Claims (7)
1.一种基于EXT4文件系统的内存日志文件系统,其特征在于所述内存日志文件系统包括用于在内存中构建映射硬盘分区EXT4文件系统日志区的内存日志区的内存日志区构建模块、用于当硬盘分区挂载时将硬盘分区中日志区文件读入到内存日志区,当硬盘分区卸载时将内存日志区作为日志区文件写入硬盘的日志文件刷新模块以及用于在硬盘分区卸载后将映射硬盘分区EXT4文件系统的内存日志区写入另一硬盘分区日志区的日志区回写模块;所述内存日志区构建模块采用RamDisk构建内存日志区,并确定RamDisk的大小为硬盘分区中日志区的容量。
2.根据权利要求1所述的基于EXT4文件系统的内存日志文件系统,其特征在于所述内存日志区构建模块通过RamDisk构建内存日志区后,在RamDisk上按照EXT4文件系统日志区的结构格式化内存日志区,构建内存日志区的结构。
3.根据权利要求1所述的基于EXT4文件系统的内存日志文件系统,其特征在于所述内存日志区构建模块通过RamDisk构建内存日志区后,在将EXT4文件系统日志区读取到内存日志区前在内存日志区填充0。
4.根据权利要求1所述的基于EXT4文件系统的内存日志文件系统,其特征在于所述日志文件刷新模块为事件驱动,包括卸载子模块和挂载子模块,所述卸载子模块用于当硬盘分区要卸载的时候执行,将内存日志区写入硬盘分区;所述挂载子模块用于当硬盘分区挂载后执行,将硬盘分区中的日志区文件从硬盘分区中读入到内存日志区。
5.根据权利要求4所述的基于EXT4文件系统的内存日志文件系统,其特征在于所述挂载子模块用于执行:
1)检查硬盘分区根目录下是否有日志区文件,若有则拷贝到内存中,没有则在内存中创建;
2)删除EXT4文件系统在硬盘上的日志区;
3)将EXT4文件系统的日志区设置为内存日志区;
4)挂载EXT4文件系统。
6.根据权利要求4所述的基于EXT4文件系统的内存日志文件系统,其特征在于所述卸载子模块用于执行:
1)卸载EXT4文件系统;
2)将内存日志区备份到硬盘根分区;
3)释放内存日志区的内存。
7.根据权利要求6所述的基于EXT4文件系统的内存日志文件系统,其特征在于所述日志区回写模块负责在硬盘分区卸载成功后在释放内存日志区的内存前将内存日志区写入到另一硬盘分区的日志区。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310350603.XA CN103514260B (zh) | 2013-08-13 | 2013-08-13 | 内存日志文件系统及其实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310350603.XA CN103514260B (zh) | 2013-08-13 | 2013-08-13 | 内存日志文件系统及其实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103514260A CN103514260A (zh) | 2014-01-15 |
CN103514260B true CN103514260B (zh) | 2016-12-28 |
Family
ID=49896984
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310350603.XA Active CN103514260B (zh) | 2013-08-13 | 2013-08-13 | 内存日志文件系统及其实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103514260B (zh) |
Families Citing this family (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104199967A (zh) * | 2014-09-22 | 2014-12-10 | 广东欧珀移动通信有限公司 | 一种手机文件的恢复方法及装置 |
CN105956172B (zh) * | 2016-05-23 | 2019-08-13 | 深圳市硅格半导体有限公司 | 日志信息的存储方法及装置 |
CN106227473A (zh) * | 2016-09-27 | 2016-12-14 | 天脉聚源(北京)传媒科技有限公司 | 一种将内存作为磁盘读写的实现方法和装置 |
CN106502587B (zh) * | 2016-10-19 | 2019-10-25 | 华为技术有限公司 | 硬盘数据管理方法和硬盘控制装置 |
CN106682162B (zh) * | 2016-12-26 | 2021-03-09 | 浙江宇视科技有限公司 | 日志管理方法及装置 |
CN106649152A (zh) * | 2016-12-29 | 2017-05-10 | 郑州云海信息技术有限公司 | 一种基于非易失内存的系统日志存储方法及装置 |
CN107256273A (zh) * | 2017-06-28 | 2017-10-17 | 联想(北京)有限公司 | 一种文件系统日志的缓存方法及系统 |
CN109324752B (zh) * | 2017-07-31 | 2023-11-03 | 伊姆西Ip控股有限责任公司 | 用于控制脏页生成的系统、介质和方法 |
CN109669623B (zh) * | 2017-10-13 | 2021-09-03 | 杭州海康威视系统技术有限公司 | 一种文件管理方法、文件管理装置、电子设备及存储介质 |
CN108170768B (zh) * | 2017-12-25 | 2023-03-24 | 腾讯科技(深圳)有限公司 | 数据库同步方法、装置及可读介质 |
CN108829345B (zh) * | 2018-05-25 | 2020-02-21 | 华为技术有限公司 | 日志文件的数据处理方法和终端设备 |
CN109117086B (zh) * | 2018-07-16 | 2021-09-21 | 北京百度网讯科技有限公司 | 存储设备数据位置的处理方法、装置、设备及存储介质 |
CN109284270B (zh) * | 2018-11-14 | 2021-09-17 | 郑州云海信息技术有限公司 | 一种分布式文件系统存储模块的部署优化方法及装置 |
CN111367755A (zh) * | 2020-02-17 | 2020-07-03 | 上海基分文化传播有限公司 | 一种移动终端的用户日志写入方法及系统 |
CN112631819A (zh) * | 2020-12-25 | 2021-04-09 | 深圳忆联信息系统有限公司 | 收取ssd错误日志的方法、装置、计算机设备及存储介质 |
CN112860493B (zh) * | 2021-02-03 | 2022-09-27 | 广东中兴新支点技术有限公司 | Linux虚机云盘根分区断链保护方法、系统及介质 |
CN117555718B (zh) * | 2024-01-11 | 2024-04-09 | 麒麟软件有限公司 | 一种基于swap交换分区的Linux操作系统死机日志转储方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2009188727A (ja) * | 2008-02-06 | 2009-08-20 | Sharp Corp | 表示装置 |
CN102866862A (zh) * | 2012-07-26 | 2013-01-09 | 浪潮电子信息产业股份有限公司 | 一种基于4k扇区硬盘性能优化的方法 |
CN103177006A (zh) * | 2011-12-21 | 2013-06-26 | 北京昆仑万维科技股份有限公司 | 一种数据存储系统及其更新存储容量的方法 |
CN103176888A (zh) * | 2011-12-22 | 2013-06-26 | 阿里巴巴集团控股有限公司 | 一种日志记录的方法和系统 |
-
2013
- 2013-08-13 CN CN201310350603.XA patent/CN103514260B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2009188727A (ja) * | 2008-02-06 | 2009-08-20 | Sharp Corp | 表示装置 |
CN103177006A (zh) * | 2011-12-21 | 2013-06-26 | 北京昆仑万维科技股份有限公司 | 一种数据存储系统及其更新存储容量的方法 |
CN103176888A (zh) * | 2011-12-22 | 2013-06-26 | 阿里巴巴集团控股有限公司 | 一种日志记录的方法和系统 |
CN102866862A (zh) * | 2012-07-26 | 2013-01-09 | 浪潮电子信息产业股份有限公司 | 一种基于4k扇区硬盘性能优化的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN103514260A (zh) | 2014-01-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103514260B (zh) | 内存日志文件系统及其实现方法 | |
Mittal et al. | A survey of software techniques for using non-volatile memories for storage and main memory systems | |
EP2353081B1 (en) | Managing cache data and metadata | |
Kang et al. | X-FTL: transactional FTL for SQLite databases | |
US8225058B2 (en) | Memory system managing a size of logs | |
US9032151B2 (en) | Method and system for ensuring reliability of cache data and metadata subsequent to a reboot | |
US9244839B2 (en) | Methods and apparatus for supporting persistent memory | |
US10909072B2 (en) | Key value store snapshot in a distributed memory object architecture | |
US8176233B1 (en) | Using non-volatile memory resources to enable a virtual buffer pool for a database application | |
US20130145095A1 (en) | Melthod and system for integrating the functions of a cache system with a storage tiering system | |
TW201501131A (zh) | 一種具有綠能資料持續模式的裝置驅動器 | |
Lu et al. | Blurred persistence: Efficient transactions in persistent memory | |
Son et al. | SSD-assisted backup and recovery for database systems | |
US9411692B2 (en) | Applying write elision | |
Bisson et al. | NVCache: Increasing the effectiveness of disk spin-down algorithms with caching | |
US8301857B2 (en) | Writing to file by multiple application threads in parallel | |
Maker et al. | A survey on android vs. linux | |
KR101966399B1 (ko) | 원자적 연산을 이용한 파일 시스템 저널링 장치 및 방법 | |
Lv et al. | HAT: an efficient buffer management method for flash-based hybrid storage systems | |
Tan et al. | Embedded Transaction Support Inside SSD With Small-Capacity Non-Volatile Disk Cache | |
CN111309645B (zh) | 基于非易失性内存的新型混合内存垃圾回收方法及系统 | |
CN116820861B (zh) | 一种企业级固态硬盘垃圾回收机制的测试方法及测试装置 | |
CN111190543B (zh) | 一种线程间共享nvdimm存储资源的存储方法及系统 | |
CN107957927A (zh) | 微控制器和相关的存储器管理方法 | |
WO2020024589A1 (en) | Key value store snapshot in a distributed memory object architecture |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |