Shutdown

SIGKILL 與切斷電源

  • April 14, 2021

突然斷電和SIGKILL執行程序有什麼區別?

我們有使用數據庫的微服務。我的任務是創建模擬突然斷電的自動測試(不是很好的關機,而是在沒有 UPS 的情況下拔掉電源)。目的是在重新啟動後,我們要驗證數據庫是否仍然一致等。我計劃使用killall -9 microservice_name. 這個模擬有多好?做其中一個或另一個更具破壞性嗎?我特別擔心刷新(或不刷新)文件緩衝區,但也許還有其他區別?

額外的問題:當我們比較的不是實際功率,而是虛擬機的突然殺死時怎麼辦?

從工藝上看,差別不大。ASIGKILL立即終止程序並且不問任何問題(如果可以的話)。

但是,周圍的環境是另一回事。考慮磁碟寫入。一個程序呼叫write(),如果成功,則將 buck 傳遞給作業系統。現在終止程序不會導致寫入數據的失去,這是作業系統的工作來保證這一點。但是數據仍然不能安全地保存在永久儲存中,因為作業系統可能沒有將其發送到磁碟,或者磁碟可能沒有將其寫入永久儲存。

從整個系統中拔出電源會清除作業系統的任何記憶體記憶體(這就是為什麼您通常需要一個 UPS 來確保乾淨關機的原因)以及儲存設備上的任何易失性記憶體(這就是為什麼昂貴的東西有自己的電池)。

強制終止虛擬機將介於兩者之間。如果虛擬機主管死了,它裡面的東西就會失去。但是任何已經發送到主機系統的東西都應該是安全的。

差異的重要性取決於您的方案(和風險評估)。如果您正在測試一個應該對硬體故障具有彈性的低級數據庫,那麼通過實際拔出插頭進行測試可能非常重要。但是,如果您正在測試一個使用數據庫來處理此類事情的更高級別的應用程序,那麼您可能不需要自己測試所有這些。

雖然我希望所有嚴肅的數據庫應用程序至少嘗試明智地處理電源故障,但 SQLite 特別有許多文章描述了他們為此做了什麼,例如https://www.sqlite.org/atomiccommit.html>和<https://www.sqlite.org/howtocorrupt.html

注意:關於 SIGKILL,我說“如果可以的話”。根據作業系統,可能存在 SIGKILL 無法終止程序的情況。例如,在 Linux 上,處於“不間斷睡眠”狀態 (D) 的程序不會在它們等待解決的任何問題之前死亡。參見例如:程序在發送 SIGKILL 信號時會做什麼?以及如何殺死無法殺死的任務(不可中斷?)

引用自:https://unix.stackexchange.com/questions/645050