写缓存的数据同步方法及装置的制造方法

文档序号:8209002阅读:266来源:国知局
写缓存的数据同步方法及装置的制造方法
【技术领域】
[0001]本发明属于电子信息技术领域,尤其涉及写缓存的数据同步方法及装置。
【背景技术】
[0002]为了提高读写文件的速度,操作系统(如Linux或者Windows等)采用缓存机制。当应用程序调用read或write等系统调用读写文件时,操作系统并不立即与存储设备进行交互。当应用程序调用read系统调用读写文件时,首先查看需要读取的数据是否已在读缓存中,若是,则直接从读缓存中读取数据;若否,则从存储设备中读取数据。当从存储设备中读取数据时,首先将数据写入至写缓存。其中,存储设备可能为如硬盘或SD卡(SecureDigital Memory Card,安全数码卡)等。
[0003]当满足预设条件时,操作系统将写缓存中的数据同步到存储设备。fsync系统调用用于把一个文件在写缓存中已修改的数据同步到存储设备。在使用过程中发现,当存储设备损坏时,fsync系统调用阻塞时长最长可达数分钟。跟踪定位发现,执行fsync系统调用,在操作系统的通用SCSI (Small Computer System Interface,小型计算机系统接口)驱动层表现为顺序执行N个SCSI写命令,其中,N为正整数,且N的数值随着待同步的写缓存数据量增长。当存储设备(如SD卡)损坏时,每个SCSI写命令的耗时接近6秒,fsync系统调用一直阻塞到SCSI命令队列中的全部命令执行完毕。经测试,往损坏的SD卡中写入一定数据量,再执行fsync系统调用,耗时如下:(I)往损坏的SD卡中写入IMB数据,再执行fsync系统调用,耗时51.8秒;(2)往损坏的SD卡中写入2MB数据,再执行fsync系统调用,耗时99.2秒;(3)往损坏的SD卡中写入5MB数据,再执行fsync系统调用,耗时184.8秒;(4)往损坏的SD卡中写入8MB数据,再执行fsync系统调用,耗时340.4秒。
[0004]在实时性很强且对数据丢失零容忍的应用场景中,通常设置了主存储设备和从存储设备的两套互为备用的存储设备,同时也设置了自动检测系统死机并重启系统的机制。当主存储设备损坏时,正确的措施应当是切换到从存储设备。但是,应用程序长时间阻塞(如调用fsync系统调用强制同步写缓存数据至损坏的SD卡)会导致系统死机的误判,并因此错误重启系统,从而造成实时数据丢失。

【发明内容】

[0005]鉴于此,本发明实施例提供了一种写缓存的数据同步方法及装置,以解决现有技术中将写缓存中的数据同步至存储设备时,由于存储设备损坏造成的同步操作长时间阻塞的问题;以及,现有技术中将写缓存中的数据同步至存储设备时,若采用主从存储设备而当前使用的存储设备损坏,则导致产生系统死机的误判,并因此错误地重启系统,造成实时数据丢失的问题。
[0006]一方面,本发明实施例提供了一种写缓存的数据同步方法,包括:
[0007]当小型计算机系统接口 SCSI命令队列中有待执行的SCSI命令时,获取SCSI执行状态值;
[0008]当获取的所述SCSI执行状态值为第一预设值时,丢弃所述SCSI命令队列中的所有待执行的SCSI命令。
[0009]第二方面,本发明实施例提供了一种写缓存的数据同步装置,包括:
[0010]SCSI执行状态值获取单元,用于当小型计算机系统接口 SCSI命令队列中有待执行的SCSI命令时,获取SCSI执行状态值;
[0011]丢弃单元,用于当获取的所述SCSI执行状态值为第一预设值时,丢弃所述SCSI命令队列中的所有待执行的SCSI命令。
[0012]本发明实施例与现有技术相比存在的有益效果是:本发明实施例通过当SCSI命令队列中有待执行的SCSI命令时,获取SCSI执行状态值,并当获取的SCSI执行状态值为第一预设值时,丢弃SCSI命令队列中的所有待执行的SCSI命令,由此在将写缓存中的数据同步至存储设备时,若存储设备损坏,则根据SCSI执行状态值及时丢弃SCSI命令队列中待执行的SCSI命令,从而避免造成阻塞;此外,在将写缓存中的数据同步至存储设备时,若采用主从存储设备而当前使用的存储设备损坏,则根据SCSI执行状态值及时将当前使用的存储设备切换至备用存储设备,从而避免产生系统死机的误判,并避免造成实时数据的丢失。
【附图说明】
[0013]为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0014]图1是本发明实施例提供的写缓存的数据同步方法的实现流程图;
[0015]图2是本发明另一实施例提供的写缓存的数据同步方法的实现流程图;
[0016]图3是本发明实施例提供的写缓存的数据同步装置的结构框图。
【具体实施方式】
[0017]为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0018]图1示出了本发明实施例提供的写缓存的数据同步方法的实现流程图,详述如下:
[0019]在步骤SlOl中,当小型计算机系统接口 SCSI命令队列中有待执行的SCSI命令时,获取SCSI执行状态值;
[0020]在步骤S102中,当获取的所述SCSI执行状态值为第一预设值时,丢弃所述SCSI命令队列中的所有待执行的SCSI命令。
[0021]当满足预设条件时,操作系统将写缓存中的数据同步到存储设备。预设条件可能包括以下任意一种或几种:(I)写缓存占用过多内存,使内存空间不足;(2)数据在写缓存的停留时长达到时长阈值;(3)接收到将写缓存中的数据同步到存储设备的外部指令;(4)write系统调用使写缓存中待同步到存储设备的数据比例达到临界值。
[0022]fsync系统调用用于把一个文件在写缓存中的数据同步到存储设备。执行fsync系统调用将写缓存的数据同步至存储设备,在操作系统的通用SCSI驱动层表现为顺序执行SCSI命令队列中的SCSI命令。
[0023]作为本发明的一个实施例,在操作系统通用SCSI驱动层初始化时,对SCSI执行状态值赋予第二预设值。需要说明的是,在本发明实施例中,SCSI执行状态值只可能为第一预设值或者第二预设值。其中,第一预设值可以为OK,第二预设值可以为FAULT ;或者,第一预设值可以为1,第二预设值可以为0,在此不作限定。
[0024]在本发明实施例中,当SCSI命令队列中有待执行的SCSI命令时,获取SCSI执行状态值。当获取的SCSI执行状态值为第一预设值时,在很大程度上表明存储设备损坏,此时,及时丢弃SCSI命令队列中所有待执行的SCSI命令,以避免对SCSI命令队列中所有SCSI命令均尝试执行后,才返回执行失败的结果。若采用主从两套互为备用的存储设备,则当获取的SCSI执行状态值为第一预设值时,则在很大程度上表明当前使用的存储设备损坏,此时,根据SCSI执行状态值及时将当前使用的存储设备切换至备用存储设备。
[0025]进一步地,在步骤SlOl中所述获取SCSI执行状态值之后,所述方法还包括:
[0026]当获取的所述SCSI执行状态值为第二预设值时,取出所述SCSI命令队列中的第一个SCSI命令并执行所述SCSI命令。
[0027]在本发明实施例中,当获取的SCSI执行状态值为第二预设值时,表明存储设备未损坏。在这种情况下,按照SCSI命令队列中的SCSI命令的顺序从SCSI命令队列中取出一个SCSI命令并执行。
[0028]进一步地,在所述取出所述SCSI命令队列中的第一个SCSI命令并执行所述SCSI命令之后,所述方法还包括:
[0029]当判定所述SCSI命令执行失败时,对所述SCSI执行状态值赋予所述第一预设值。
[0030]在尝试执行一个SCSI命令后,若判定该SCSI命令执行失败,则在很大程度上表明存储设备损坏,此时,对SCSI执行状态值赋予第一预设值,丢弃该SCSI命令以及SCSI命令队列中剩余待执行的SCSI命令。
[0031]进一步地,在所述取出所述SCSI命令队列中的第一个SCSI命令并执行所述SCSI命令之后,所述方法还包括:
[0032]当判定所述SCSI命令执行完成时,继续从所述SCSI命令队列中取出下一个SCSI命令并执行所述下一个SCSI命令,直至判定所述下一个SCSI命令执行失败。
[0033]在尝试执行一个SCSI命令后,若该SCSI命令执行完成,则SCSI执行状态值保持为第二预设值,且继续从SCSI命令队列中取出下一个SCSI命令并执行,直至判定某一 SCSI命令执行失败时,对SCSI执行状态值赋予第一预设值,并丢弃SCSI命令队列中剩余待执行的SCSI命令。
[0034]进一步地,所述方法还包括:
[0035]当所述SCSI命令队列中无待执行的SCSI命令时,对所述SCSI执行状态值赋予所述第二预设值。
[0036]作为本发明的一个实施例,当SCSI命令队列为空,即SCSI命令队列中无待执行的SCSI命令时,对SCSI执行状态值赋予第二预设值。
[0037]在本发明实施例中,通过在SCSI命令队列的处理流程中加入SCSI执行状态值来改善写缓存与存储设备之间的数据同步。经测试,往损坏的SD卡中写入一定数据量,再执行fsync系统调用,耗时如下:(I)往损坏的SD卡中写入IMB数据,再执行fsync系统调用,耗时5.76秒;(2)往损坏的SD卡中写入2MB数据,再执行fsync系统调用,耗时5.77秒;
(3)往损坏的SD卡中写入5MB数据,再执行fsync系统调用,耗时5.78秒;(4)往损坏的SD卡中写入8MB数据,再执行fsync系统调用,耗时5.78秒;(5)往损坏的SD卡中写入40MB数据,再执行fsync系统调用,耗时5.79秒。通过在SCSI命令队列的处理流程中加入SCSI执行状态值,无论从写缓存同步至存储设备的数据量多大,执行fsync系统调用(即执行SCSI命令队列)的耗时都不超过5.8秒,从而避免了将写缓存中的数据同步至存储设备造成的阻塞。
[0038]图2示出了本发明另一实施例提供的写缓存的数据同步方法的实现流程图,为了便于说明,仅示出了与本实施例相关
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1