保持应用程序数据的完整性是计算系统的首要职责。诸如电源中断之类的故障是主要的危险:更新期间的突然崩溃可能会破坏数据,或者通过破坏元数据有效地破坏数据。应用程序通过使用针对故障的原子更新机制来保护数据完整性。这种机制承诺在崩溃后将数据恢复到应用程序定义的一致状态,从而支持应用程序恢复。
不幸的是,失败原子更新机制的曲折历史排除了盲目信任。广泛使用的关系数据库和键值存储常常不能维护它们的事务性保证。24位于堆栈下部的耐用存储设备在断电时可能损坏或破坏数据。25新兴的NVM(非易失性内存)硬件和相应的故障原子更新机制7,8努力避免重复早期技术的错误,就像传统硬件对持久内存的软件抽象一样。10,11然而,在任何新技术成熟之前,健康的怀疑需要有第一手证据证明它兑现了其完整性的承诺。
谨慎的开发人员遵循格言:“像战斗一样训练”。如果需求要求应用程序必须容忍指定的故障,那么应用程序应该在生产前测试和/或生产系统上的游戏日故障注入测试中能够经受住这些故障。1对于任何耐碰撞机制来说,突然的全系统电源中断都是最艰巨的挑战,没有什么可以替代广泛而现实的电源故障测试。在过去,我和我的同事们测试了我们针对电力故障的耐碰撞机制,3.,17,20.,21但我们并没有记录实践这门艺术所需的部落知识。
本文描述了一个简单而经济的测试平台的设计和实现,该测试平台可使运行在完整硬件/软件堆栈上的应用程序遭受重复的突然的全系统电源中断。一个完整的测试台的成本不到100美元,可以在无人看管的情况下无限期地运行,并在一分钟或更短的时间内执行一个完整的测试周期。然后用这个测试平台来评估一种最新的持久性内存容错机制。10软件开发人员可以在将软件发布到生产使用之前使用这种类型的测试平台来评估软件的耐崩溃性。应用程序操作人员可以从本文中学到一些原则和技术,这些原则和技术可以应用于生产硬件和软件的电源故障测试。
当然,电源故障测试本身只是整个可靠性和保证链中的一个环节。可靠性取决于深思熟虑的设计和认真的实施;保证取决于在可能的情况下进行核查以及各种各样和彻底的现实测试。2,13本文介绍的技术,以及其他补充的保证措施,可以帮助勤奋的开发人员和操作人员保持应用程序数据的安全。
简要回顾持久内存和相应的容错机制,重点介绍本文后面将要测试的软件。然后描述电源中断试验台和持久内存容错机制的测试结果。本文中描述的所有软件都可以在以下网站获得https://queue.acm.org/down-loads/2020/Kelly_powerfail.tar.gz.
而非易失性内存是一种硬件,持续的内存是一种更通用的硬件无关抽象,它允许在缺乏NVM的传统计算机上实现。11相应的持久内存编程风格涉及在内存映射文件中布局应用程序数据结构,允许应用程序逻辑直接通过CPU指令(负载
而且商店
).
持久内存编程的主要优点是简单:它既不需要单独的外部持久存储(如关系数据库),也不需要在内存中的数据格式和不同的持久格式之间进行转换。传统硬件上的持久内存的另一个好处是存储灵活性。持久应用程序数据最终驻留在文件中,可以完全自由地选择文件系统下面的持久存储层:即使持久应用程序数据必须跨高可用性弹性云存储进行地理复制,应用程序仍然可以通过以下方式访问它负载
而且商店
.毫不奇怪,各种形式的持久内存正吸引着工业界和软件从业者越来越多的关注。16
本文介绍的技术,以及其他补充的保证措施,可以帮助勤奋的开发人员和操作人员保持应用程序数据的安全。
对于传统硬件上的持久内存,正确的容错机制是FAMS(故障原子)msync
())。17而传统的Posixmsync
()系统调用将文件支持的内存映射的修改页压入到备份文件中没有任何完整性保证在出现故障时,FAMS保证备份文件的状态总是反映最近的成功msync
()调用。FAMS允许应用程序将持久数据从一个一致的状态发展到下一个状态,而不必担心因不合时宜的崩溃而损坏。我和我的同事在Linux内核中实现了FAMS,17在商业文件系统中,20.在用户空间库中也是如此。9,23至少还有另外两个独立的FAMS实现。4,5,22虽然本文强调的是类似posix的环境,但在其他操作系统上也存在类似的特性。例如,Microsoft Windows的界面类似于mmap
(),并实现了一个失败原子文件更新机制。17
本文使用下一节中描述的电源故障测试平台来评估最新的FAMS实现:famus_snap
(failure-atomicmsync
()在用户空间通过快照)。10的famus_snap
实现设计为易于审计。以前的FAMS实现要么涉及晦涩难懂的内核/文件系统代码,要么涉及数百行用户空间代码,famus_snap
包含51行非空代码,不包括注释。它通过利用BtrFS、XFS和OCFS2文件系统中目前可用的高效的逐文件快照特性来实现简洁。12在文件快照之上构建FAMS的附带好处是效率:快照采用了写时复制机制,因此避免了日志记录的双写。20.但原则上famus_snap
它的正确性可以通过检查来评估,但实际上它的正确性取决于快照的文件系统实现,因此需要进行整个系统的电源故障测试。
电源故障试验台最重要的要求是,在主机上运行的软件必须能够在自己选择的时间突然切断主机的电源。然后必须以某种方式将电源恢复到主机,主机必须通过重新启动并开始下一个测试周期作出响应。主机应该坚固耐用,能够承受数千次的电源中断,并且能够快速地执行关机/开机周期。它还应该让预算适中的开发人员负担得起,而且它应该足够便宜,因为重复的电源循环的压力可能最终会损坏它。的确,你应该积极地去做更喜欢尽可能使用最脆弱的硬件:根据定义,这样的硬件增加了测试失败的可能性,因此在廉价机器上成功的测试会激发最大的信心。本节的其余部分将描述主机、辅助电路和软件共同实现这些目标。
主机电脑。选择一台好的主机并不容易。从云提供商那里租用可以满足节约的目标,但不幸的是,云硬件完全被虚拟化层所包裹,根据设计,客户软件无法从裸露的金属上断开电源。高端服务器公开了管理接口,允许远程重新启动或关机,但这种关机比突然断电要温和得多;如果你能突然切断一个高端服务器的电源,你就有可能损坏这台昂贵的机器。笔记本电脑价格便宜,而且可以一次性使用,但是笔记本电脑缺乏在外部电源恢复后自动重启的BIOS功能。工作站和桌面电脑有这样的BIOS功能,但它们体积庞大,耗电大,启动速度慢。
像树莓派(Raspberry Pi)这样的单板计算机非常适合我们的目的:它们体积小、坚固耐用、足够便宜,可以一次性使用,而且耗电非常少。Pi运行Linux操作系统和几乎所有的Linux软件。它启动迅速和自动时,电源。它的GPIO(通用输入/输出)引脚使无特权软件可以方便地控制外部电路。最重要的是,这是一台简约的机器。如果软件和存储设备在Pi上通过了电源故障测试,那么它们在更昂贵的功能丰富的硬件上的表现可能也不会更糟。本文中的测试台使用树莓派3 Model B+,它至少要到2026年才会投产。18
单板计算机的主要缺点是对CPU能力和外设接口的限制。例如,Pi 3B+ CPU不支持Linux“软脏位”,存储空间仅限于板载microSD卡和usb连接设备。然而,通过诸如SATA-to-USB适配器,可以连接各种各样的存储设备。总的来说,目前用途的单板计算机的吸引力超过了它们的局限性。
电力中断电路。在过去,我和我的同事们使用带有网络控制接口的交流电源条来测试我们的碰撞一致性机制。3.,17,20.,21这些电源条往往是挑剔的和缺乏记录。我们以前的测试系统包括一台独立的控制计算机,除了托管被测试软件和存储设备的计算机之外;控制机使用电源条切断并恢复主机电源。回想起来,这些早期的测试框架似乎没有必要那么复杂,就像“买一辆车来听收音机”。本节中描述的极简电源中断电路更便宜、更优雅、支持更艰苦的测试,并使主机能够直接控制电源切断。
这里介绍的试验台使用机电继电器从主机物理断开电源。继电器忠实地模拟突然电源中断的影响,并完全隔离主机。
电源电路可以包含惊人数量的剩余能量,足以使服务器级别的计算机在公用事业电源故障时适当地关闭。15因此,我们的电源中断电路位于主机和电源之间,这消除了电源中的剩余能量可能以某种方式使主机有序关闭而不是突然停止的可能性。
事实证明,一个非常简单的电路足以暂时切断主机电源,从而可靠地触发立即重启。电路如图所示图1,是围绕单稳态(非闭锁)继电器。当有足够的电流给继电器的线圈通电时,活动极就会从常闭位置切换到常开位置。(图1遵循在许多中继数据表上发现的惯例:正常关闭接触显示最近的线圈和你是想象的电流在线圈推动继电器的极点向上正常开放联系人。)我们使用继电器19它的触点可以为Pi携带足够的能量,它的线圈可以由Pi的3.3伏GPIO引脚操作,而不会超过16毫安的电流限制。继电器的180Ω线圈,加上GPIO引脚的31Ω内阻,14适当限制电流。
如图1, Pi的电源通过继电器的常闭触点。当Pi上的软件使用GPIO引脚为继电器的线圈供电时,当继电器的极点跳离通常闭合的触点时,Pi的电源被切断。此时无能为力的Pi上的GPIO引脚将停止通过线圈推动电流,因此极极很快回落到正常关闭的位置,恢复Pi的电源并触发重启。当电流停止流经继电器线圈时,线圈中的磁场就会崩溃,释放出的能量可能会伤害控制GPIO引脚的Pi上脆弱的电路。一个习惯保护二极管与继电器的线圈并联可以防止这种损坏。(有关电感负载的二极管保护的描述,请参见电子的艺术。6我的电路使用IN4001二极管。)
主要的担忧围绕着电路图1它能很快地给主机恢复电力,这可能会以某种方式掩盖长时间断电可能暴露的故障。
图2图中显示了另一个叫做PiNap的电路,它会中断Pi的电源几秒钟。
如图2 (a)该电路包括两个电容器:一个帮助切换继电器,另一个接管在Pi断电时给继电器线圈供电的作用。图2 (b)描述正常操作:外部5.1V电源通过继电器的常闭触点向Pi供电;它也为两个电容器充电。图2 (c)显示了主机上的软件通过GPIO引脚给继电器的线圈供电的瞬态情况:外部电源立即从主机断开,但来自电容C2的能量使GPIO引脚推动继电器的极点一直向上,关闭常开的触点。则,如图所示图2 (d),电容C1通过线圈放电,保持Pi电源关闭几秒钟。当C1中的能量耗尽时,继电器的极点回落到常闭触点,为Pi恢复电源,为下一个测试周期重新启动。
简单的计算决定了PiNap电路中所有组件的规格。继电器与电路中的继电器相同图1出于同样的原因。19电容C1被充电到5.1V,所以您首先选择电阻,以降低通过继电器线圈的电压降约3V;根据欧姆定律120Ω是合适的。现在你选择C1,使C1和电阻的电阻-电容(RC)时间常数在几秒的量级上;在10-40毫微米法拉(10,000-40,000 μF)附近的任何东西都可以。在这个范围内的电解电容器是笨拙的大-大约盐瓶的大小-所以我使用一个小得多的22,000 μF的超级电容。最后,电容C2必须能够持有足够的能量,以保持线圈供电,而继电器的极点在飞行中(大约1毫秒,根据继电器数据表);220 μF或更高就可以了。
图3展示了PiNap在面包板上的特写。继电器是靠近中心的白色盒子。电容C2是右边边缘的圆柱体;右上角的黑色矩形是超级帽C1。电阻和保护二极管分别是垂直方向和水平方向的小圆柱体。所有的元件都很舒服地装在照片底部的美制硬币上,完整的电路占据了一张扑克牌大小的面包板的上半部分。主机的GPIO和地引脚分别通过继电器侧面的红色和黑色垂直跳线连接。外部5.1V电源通过面包板两侧的内轨进入面包板,通过外轨出。
有些继电器和电容器要求正确的直流极性;我做的事。通过极性敏感继电器线圈发送错误的电流将无法切换极点,保护二极管将提供一个短路路径。极性不正确会导致极化电容故障。组装电路时要密切注意极性。
图4在一张美国字母大小的图形纸上显示了完整的测试台:PiNap的面包板在底部中心,带usb存储设备的树莓派在右边,电源在左边。为了清晰起见,苹果派的USB鼠标和键盘已被移除。为了在电源和Pi之间插入PiNap,我切断了电源线,并焊接了面包板友好的22 AWG实心铜线到其绞线;这是装配测试台硬件过程中最慢的一步。所显示的一切图4可以花不到100美元买到
建立这个测试平台的最后两个技巧:
为了简洁和美观,本文省略了第三个电源中断电路,它是我在电路之前设计和制造的图1而且2.它使用两个继电器,一个集成电路定时器芯片,几个电阻,电容和二极管,和一个单独的12 VDC电源,除了Pi的5.1V电源。我的第一个电路在数千次测试中可靠地工作,在某些方面比PiNap更容易解释,但它比本文中介绍的电路更昂贵、更复杂,也更难组装。我的第一个赛道的主要贡献是展示了不简化,激发了寻找更精简的替代方案。
系统配置和测试软件。详细介绍了主机配置和测试软件的测试方法famus_snap
图书馆防止电源故障有点乏味。本节提供测试设置过程的简要概要。详细的说明是本文附带的源代码tarball的一部分。(雄心勃勃的读者:以默认用户登录你的Pi”π
,在主目录中解tar/home/pi/
,并参阅README文件。)
主机硬件配置相对简单。主机必须连接到的外部电路图1或图2通过GPIO和接地引脚,Pi的电源通过电路布线。存储设备通过Pi的其中一个USB端口连接。注意,配置主机进行测试销毁存储设备上的所有数据。
主机软件配置涉及几个步骤。主机运行的是Linux的Raspbian变体;从2018年到2019年,我用过这个操作系统的几个版本。需要注意的是,必须安装几个非默认的软件包xfsprogs
,它用于在usb连接的存储设备上创建一个新的XFS文件系统。使用XFS是因为famus_snap
依赖于高效的再连接快照,而XFS是支持该特性的少数文件系统之一。可以配置Pi以一种简化的方式引导(例如,不启动图形用户界面)。精益引导可能更快,但差别很小,默认引导就足够快了(不到一分钟)。
示例代码tarball包含特定于famus_snap
测试。主电源故障测试程序被称为击球。
它将备份文件映射到内存中,重复地用一个特殊的伪随机模式填充内存中的映像,并调用famus_snap
模拟的msync
()将内存中的映像提交到快照文件。这些测试的目标是查看电源故障是否破坏击球
;因此,设计了伪随机模式,使腐败易于检测。
的cron
实用程序设置为运行一个名为rab
当外部电路恢复电源时,就会发生这种情况。rab的主要工作是调用测试脚本,pft_run
.脚本pft_run
启动测试程序击球
等待几秒钟,然后使用GPIO引脚激活外部电路,切断并恢复Pi的电源。
简单的计算决定了PiNap电路中所有组件的规格。
rab脚本支持电源故障测试的替代方案:它可以用于重新启动π突然击球
是运行,这比电源故障压力小,但更容易设置,因为外部电路是不必要的。
在适当数量的开关循环完成后,您可以检查是否击球
的数据已被破坏检查
脚本。检查脚本运行击球
在恢复模式中,该模式检查适当的快照文件,以查看它们是否包含预期的伪随机模式。
测试famus_snap
采用了本文所讨论的三种外部电源中断电路图1而且2第三个复杂电路之前简单提到过。测试在三种不同的存储设备上运行:一个便宜的(30美元)64GB闪存盘;据说是一个粗劣而昂贵的512GB闪存棒(220美元);以及一个价格适中(90美元)的500GB便携式SSD(固态硬盘)。总共运行了超过58,000个关机/开机测试循环。每个关机/开机周期大约需要1分钟,这比我和同事过去构建的测试环境的5分钟周期要快得多。3.,17,20.,21所有测试都完美地通过了;没有一个字节的数据被损坏。
通过检查测试留下的碎片,可以了解在断电时被测试软件在做什么。的famus_snap
库在应用程序软件调用它时创建备份文件的快照msync
()替换;调用者选择快照文件名并决定何时删除它们。pft测试应用程序在两个快照文件之间交替;famus_snap的
规则规定,崩溃后恢复应该用最近可读的快照文件替换备份文件。10
在长达一个月的测试运行中,使用昂贵的闪存棒完成了49,626个关机/开机测试周期,断电使这对快照文件在所有四种逻辑上可能的情况下都保留了:只有一个快照文件存在,它适合恢复(0.054%的测试);两个文件都是完整的(也就是说,与备份文件大小相同),但只有一个是可读的(4.7%);两个快照文件都是完整的和可读的,因此恢复必须比较它们的last-mod时间戳(43.8%);一个文件是完整的和可读的,但另一个文件太小和可写(51.4%)。
这些结果符合我基于相对时间的预期击球
申请及famus_snap
不同州的图书馆开支。改变测试覆盖率平衡的一种方法是触发电源故障在PFT应用程序或famus_snap
类中使用的内联“崩溃点”测试famus
图书馆9(不要混淆famus_snap
).
正如Dijkstra所指出的那样,测试可以显示bug的存在,但不能显示它们的不存在。我的结果并不能证明这一点famus_snap
将始终维护其数据完整性的保证,也不会保证树莓操作系统、XFS文件系统、树莓派计算机或被测试的存储设备在电源故障时是可靠的。我只能说,这些神器没有利用无数机会让人失望。成功的结果在一个极简的库上,比如famus_snap
而像Pi这样的普通硬件则进一步提高了功能齐全、价格昂贵的硬件和/或软件的门槛。运行在服务器类主机和企业级存储上的商业关系数据库最好能在成千上万次突然的全系统电源中断中完好无损地存活下来——否则供应商就要做出解释了!
电源故障对应用程序数据完整性构成最严重的威胁,痛苦的经验告诉我们,不能只看表面价值就相信故障原子更新机制的完整性承诺。勤奋的开发人员和运营商坚持通过大量的第一手测试来确认完整性声明。本文介绍了一种简单、廉价的测试平台,能够使存储设备、系统软件和应用软件每周进行10,000次突然的全系统电源中断测试。
最近的famus_snap
失败原子的实现msync
()出色地通过了成千上万的电源故障测试,这表明硬件/软件堆栈测试应用程序代码的所有组件,famus_snap
库代码、XFS文件系统、操作系统、存储设备和主机——要么按预期运行,要么非常幸运。
未来的工作可能会采用本文的技术,围绕其他类型的单板计算机(例如,基于其他CPU类型的计算机)设计测试台。可以说,未来工作最重要的方向是部署和广泛应用旨在在出现故障时保持数据完整性的工件的彻底折磨测试套件。讽刺的是性能事务处理系统的基准有很多,但是crash-consistency测试套件相对较少,似乎速度比正确性更重要。本文的研究技巧和方法来源于文献研究24确定有效的测试策略。是时候把这些知识付诸实践了。
相关文章
在queue.acm.org
传统硬件上的持久内存编程
特伦斯凯利
https://queue.acm.org/detail.cfm?id=3358957
生产故障注入
约翰Allspaw
http://queue.acm.org/detail.cfm?id=2353017
从失败测试中抽象化天才
彼得·阿尔瓦罗和塞弗琳·泰蒙
https://queue.acm.org/detail.cfm?id=3155114
1.生产中的故障注入。acmqueue 10, 8 (2012);http://queue.acm.org/detail.cfm?id=2353017.
2.阿尔瓦罗。P.和Tymon, S.把天才从失败测试中抽离出来。acmqueue 15, 5 (2017);https://queue.acm.org/detail.cfm?id=3155114.
3.Blattner, A., Dagan, R.和Kelly, T.用于Indigo和其他产品的通用抗崩溃存储。技术报告2013-75,惠普实验室,2013;http://www.hpl.hp.com/techreports/2013/HPL-2013-75.pdf.
4.文件系统和块设备的失败原子写,2017;https://lwn.net/Articles/715918/.
5.Hellwig。C. Linux的失败原子文件更新。Linux Piter 2019;演示:https://linuxpiter.com/en/materials/2307;补丁:https://www.spinics.net/lists/linux-xfs/msg04536.html而且http://git.infradead.org/users/hch/vfs.git/shortlog/refs/heads/O_ATOMIC.
6.霍洛维茨和希尔。《电子艺术》,3理查德·道金斯版。剑桥大学出版社,2015,38 - 39,818。
7.英特尔。Optane技术;http://www.intel.com/optane/.
8.英特尔。持久内存开发工具包;http://pmem.io/pmdk/.
9.Kelly, T. famus:失败-原子msync ()在用户空间;http://web.eecs.umich.edu/~tpkelly/famus/.
10.凯利,t,很好的传统的持久记忆。;登录:44, 4 (2019), 29-34;https://www.usenix.org/system/files/login/articles/login_winter19_08_kelly.pdf.(源代码为famus_snap图书馆在https://www.usenix.org/sites/default/files/kelly_code.tgz.)
11.Kelly, T.在传统硬件上进行持久内存编程。acmqueue 17, 4 (2019);https://dl.acm.org/citation.cfm?id=3358957.
12.Linux程序员手册。ioctl_ficlone ();http://man7.org/linux/man-pages/man2/ioctl_ficlonerange.2.html.
13.C.麦卡弗里,分布式系统的验证。acmqueue 13, 9 (2016);http://queue.acm.org/detail.cfm?id=2889274.
14.麦克马纳斯,S,库克,M。2 .树莓派nd版。约翰·威利父子出版社,2015年,第281页。
15.纳拉亚南,D.和霍德森,O.全系统持久性。在第十七届会议的会议记录th对编程语言和操作系统的体系结构支持, 2012;https://dl.acm.org/doi/proceedings/10.1145/2150976
16.斯旺森,s(组织者)。现实生活中的持久编程(会议);https://pirl.nvsl.io/.
17.Park, S, Kelly, T. Shen, K.失败原子msync ():一种简单而有效的机制,用于保存持久数据的完整性。在八人会议记录thACM欧洲会议。计算机系统, 2013;https://dl.acm.org/citation.cfm?id=2465374.
18.树莓派3 Model B+;https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/.
19.TE连接。Axicom继电器,产品代码IM21TS,部件编号1-1462039-5。供应商数据表:https://www.te.com/usa-en/product-1-1462039-5.html;https://www.te.com/usa-en/product-1-1462039-5.datasheet.pdf;https://bit.ly/3eJY75n.
20.Verma, R., Mendez, a . a ., Park, S., Mannarswamy, S., Kelly, T.和Morrey, B. Linux文件系统中应用程序数据的失败原子更新。在十三届会议的议事录th文件和存储技术Usenix会议, 2015;https://www.usenix.org/system/files/conference/fast15/fast15-paper-verma.pdf.
21.Verma, R., Mendez, a.a., Park, S., Mannarswamy, S., Kelly, T.和Morrey, B. SQLean:通过原子文件更新的数据库加速。技术报告hpl -2015- 103,2015。惠普实验室;http://www.labs.hpe.com/techreports/2015/HPL-2015-103.pdf.
22.NOVA:用于混合易失性/非易失性主存的日志结构文件系统。在14国会议记录th文件和存储技术, 2016;https://www.usenix.org/system/files/conference/fast16/fast16-papers-xu.pdf.
23.柳,S,基利安,C,凯利,T, Cho, H. K.和Plite, S.异步系统的组合可靠性。Usenix年度技术会议论文集。, 2012;https://www.usenix.org/conference/atc12/technical-sessions/presentation/yoo.
24.郑,M., Tucek, J.,黄,D.,秦,F., Lillibridge, M.,杨,E.S., Bill W. Zhao, B.W.和Singh, S.为了乐趣和利益而折磨数据库。在十一届会议记录thUsenix协会。操作系统设计与实现“,, 2014;https://www.usenix.org/system/files/conference/osdi14/osdi14-paper-zheng_mai.pdf(请注意,勘误表是单独提供的。)
25.郑敏,Tucek, J,秦峰,Lillibridge, M.理解ssd在电源故障下的鲁棒性。在十一届会议记录th文件和存储技术, 2013;https://www.usenix.org/system/files/conference/fast13/fast13-final80.pdf.
数字图书馆是由计算机协会出版的。版权所有©2020 ACM, Inc.
没有找到条目