我正在编写一些软件,该软件使用fsync()
系统调用来确保文件持久保存到磁盘。我以前做过这个,我知道你需要注意的各种"陷阱"(即,在替换文件时,你需要fsync()
文件,发出一个rename()
,然后fsync()
包含目录。对持久将文件写入磁盘的软件进行编码是可以的。
测试软件是另一回事。我想验证它在面对停电等情况下是否正常运行。我的身体反应非常好,但还不足以拔下两个CPU指令之间的电源线。
我应该如何测试写入磁盘的 C 程序的持久性?
(正如标题所暗示的,我假设您使用某种类似调试器的软件,也许使用ptrace()
,在特定文件/行处自动终止您的程序,如可执行文件的调试信息中所列。
请做好准备,在正常情况下发生不可预见的事件随机事件(例如停电(的情况下,您无法将 100% 的数据保存到磁盘中。 但是,可以通过各种方式提高概率 - 例如以块的形式写入磁盘。 块的大小是这样的,如果它没有保存在磁盘中,那么它的某些部分可以在重新启动电源后恢复或安全地忽略。 块的大小还取决于磁盘缓存,这将确保数据快速写入和程序读取的数据流速率。 数据恢复可以通过设计硬件/软件来实现,以便在断电时系统中有某种备用电源。 该设计将允许系统有足够的时间向SW发出信号以完成剩余数据的保存(如果有(,或者将数据保留在RAM中,直到CPU的主电源恢复。 有几种测试想法,其中之一是在线程中执行磁盘写入操作,并根据您的要求以循环中的速率从主线程启动/终止线程。
您正在寻找的测试类型是 - 负载测试和压力测试。负载测试将测试当需要非常频繁地在磁盘上写入大量数据时,应用程序是否能够执行。这要求您通过向外部提供输入来模拟行为,例如。通过模拟读取数据源的测试应用程序。 压力测试将测试当系统中的CPU利用率为100%或系统RAM或磁盘中没有内存时程序的行为。strees-ng
工具可用于模拟 CPU 负载场景。请参阅[链接](https://www.tecmint.com/linux-cpu-load-stress-test-with-stress-ng-tool/(。希望对您有所帮助。