SIGKILL 与断电

Mat*_*szL 0 shutdown sigkill

突然断电和SIGKILL在运行程序上有什么区别?

我们有使用数据库的微服务。我的任务是创建模拟突然断电的自动测试(不是很好的关机,而是在没有 UPS 的情况下拔掉电源)。意图是在重新启动后,我们要验证数据库是否仍然一致等。我计划使用killall -9 microservice_name. 这个模拟有多好?做一个或另一个更具破坏性吗?我特别担心刷新(或不刷新)文件缓冲区,但也许还有其他区别?

额外问题:当我们与不是实际功率,而是虚拟机的突然杀死相比时会怎样?

ilk*_*chu 5

从过程的角度来看,没有太大区别。ASIGKILL立即终止进程并且不问任何问题(如果可以的话)。

不过,周围的环境是另一回事。考虑磁盘写入。一个进程调用write(),如果成功,则将费用传递给操作系统。现在终止进程不会导致写入数据的丢失,这是操作系统的工作来保证这一点。但是数据在永久存储上仍然不安全,因为操作系统可能没有将它发送到磁盘,或者磁盘可能没有将它写入永久存储。

从整个系统中拔出电源会清除操作系统的任何内存缓存(这就是为什么您通常会使用 UPS 以确保干净关闭),以及存储设备上的任何易失性缓存(这就是为什么昂贵的东西有自己的电池)。

强行终止 VM 介于两者之间。如果 VM 主管死了,里面的东西就会丢失。但是任何已经发送到主机系统的东西都应该是安全的。

差异有多大,取决于您的场景(和风险评估)。如果您正在测试一个应该对硬件故障具有弹性的低级数据库,那么通过实际拔掉插头进行测试可能非常重要。但是,如果您正在测试使用处理此类内容的数据库的更高级别应用程序,那么您可能不需要自己测试所有内容。

虽然我希望所有严重的数据库应用程序至少会尝试明智地处理电源故障,但 SQLite 尤其有许多文章描述了他们为此所做的工作,例如参见https://www.sqlite.org/atomiccommit.htmlhttps://www.sqlite.org/howtocorrupt.html

注意:我对 SIGKILL 说了“如果可以的话”。根据操作系统的不同,可能存在 SIGKILL 无法终止进程的情况。例如,在 Linux 上,处于“不间断睡眠”状态 (D) 的进程在等待解决之前不会死亡。参见例如:程序在发送 SIGKILL 信号时会做什么?以及如何杀死无法杀死的任务(不可中断?)