突然断电和SIGKILL运行程序有什么不同?
我们有使用数据库的微服务。我的任务是创建模拟突然停电的自动测试(不是很好的关机,而是在没有UPS的情况下从电源上拔出电源)。目的是在关闭电源后,我们想要验证数据库是否仍然是一致的,等等。我计划使用killall -9 microservice_name来模拟它。这个模拟有多好?做一个还是另一个更具破坏性?我特别担心的是冲洗(或不)文件缓冲区,但可能还有其他的区别吗?
额外的问题:当我们比较不是实际的力量,而是突然杀死虚拟机?
发布于 2021-04-14 13:34:12
从过程的角度看,差别不大。SIGKILL会立即终止这个过程,并且不会问问题(如果可以的话)。
然而,周围的环境却是另一回事。考虑磁盘写入。一个进程调用write(),如果成功,责任将传递给操作系统。现在终止进程并不会导致书面数据的丢失,保证这一点是操作系统的工作。但是,数据仍然不能安全地存储在永久存储中,因为操作系统可能没有将其发送到磁盘,或者磁盘可能没有将其写入永久存储。
从整个系统中拔出电源将消除操作系统的任何内存缓存(这就是为什么通常会有一个UPS来确保干净关机),以及存储设备上的任何易失性缓存(这就是为什么昂贵的东西都有自己的电池)。
强制终止VM将介于两者之间。如果VM主管死了,它里面的东西就会丢失。但是任何已经发送到主机系统的东西都应该是安全的。
差异有多重要,取决于您的方案(以及风险评估)。如果您正在测试一个低级别的数据库,该数据库应该对硬件故障具有弹性,那么通过实际拔掉插头进行测试可能是非常重要的。但是,如果您正在测试一个更高级的应用程序,该应用程序使用的是一个处理类似事情的数据库,那么您可能不需要自己测试所有这些。
虽然我希望所有严肃的数据库应用程序至少能够明智地处理电源故障,但SQLite特别有一些文章描述了它们为此目的所做的事情,例如https://www.sqlite.org/atomiccommit.html和https://www.sqlite.org/howtocorrupt.html。
注:我说“如果可以”关于SIGKILL。根据操作系统的不同,可能会出现SIGKILL无法杀死进程的情况。例如,在Linux上,处于“不间断睡眠”状态(D)的进程在等待解决之前不会死。参见:当一个程序发送SIGKILL信号时,它会做什么?和如何杀死无法终止的任务(不间断)?
https://unix.stackexchange.com/questions/645050
复制相似问题