SIGKILL 与切断电源

SIGKILL 与切断电源

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

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

额外问题:当我们比较的不是实际功率,而是虚拟机的突然终止时,结果如何?

答案1

从流程来看,没有太大区别。 ASIGKILL立即终止该进程,并且不询问(如果可以的话)。

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

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

强制终止虚拟机介于两者之间。如果虚拟机管理器死亡,其内部的所有内容都会丢失。但任何已经发送到主机系统的东西都应该是安全的。

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

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

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

相关内容