Linux

“postgres 阻塞超過 120 秒” - 我的數據庫是否仍然一致?

  • November 4, 2012

我在 Open-E 儲存系統上為 XenServer 主機上執行的多個虛擬機使用 iscsi 卷。有時,當虛擬機(以及儲存系統)上的磁碟 I/O 負載非常高時,我在 vm 控制台上收到以下錯誤消息:

[2594520.161701] INFO: task kjournald:117 blocked for more than 120 seconds.
[2594520.161787] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[2594520.162194] INFO: task flush-202:0:229 blocked for more than 120 seconds.
[2594520.162274] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[2594520.162801] INFO: task postgres:1567 blocked for more than 120 seconds.
[2594520.162882] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.

我了解此錯誤消息是由核心通知這些程序尚未執行 120 秒引起的,很可能是因為尚未處理對儲存系統的磁碟訪問。

但是對過程有什麼影響。例如,postgres 程序最終會不會在儲存系統在幾分鐘後再次空閒時寫入其數據,從而使所有數據仍然一致?還是會中止寫入,使某些表處於不一致的狀態?

我當然希望前者應該是這種情況 - 如果磁碟訪問速度很慢,postgres(或任何其他受影響的程序)應該只要等待就可以了。我可以忍受應用程序掛起幾分鐘。但是,如果有可能發生數據損壞,那麼這些錯誤中的任何一個都是壞消息。

請建議在這裡做什麼。

您認為數據庫將保持一致的直覺應該是正確的,除非 120 秒掛起的原因恰好是磁碟本身出現故障。如果根本原因真的只是高 I/O,PostgreSQL 將確保它送出數據到磁碟的順序將確保它沒有損壞。

我以前遇到過 SATA 磁碟出現故障時往往會掛起等待 I/O 操作完成並導致此核心錯誤的情況。到那時,您可能無法非常信任該磁碟上的數據 - 120 秒的掛起只是副作用,而不是損壞的根本原因。

引用自:https://serverfault.com/questions/445173