作爲@mvp筆記,如果COMMIT
是緩慢的通常的原因是慢fsync()
是因爲每一個事務提交必須刷新數據到磁盤 - 通常與FSYNC()調用。不過,這不是緩慢提交的唯一可能原因。您可能:
- 有慢的fsync()S作爲已經指出
- 有慢檢查站拖延I/O
- 有
commit_delay
集 - 我還沒有證實延遲提交記錄到日誌中爲長時間運行報表,但它似乎是合理的
如果fsync()速度慢,您最好的選擇是重新構建您的工作,以便您可以在更少的較大的事務中運行它。一個合理的選擇可以使用commit_delay
來分組提交;這將會提高整體吞吐量,但實際上會降低單個交易的速度。
更好的是,修復問題的根源。升級到具有電池支持的寫回緩存的RAID控制器或升級到高功率故障安全的SSD。請參見,普通磁盤通常每轉少於一次fsync(),或每分鐘5400到15,000次,具體取決於硬盤驅動器。由於大量的交易和大量的提交,這將大大限制你的吞吐量,特別是因爲這是最好的情況如果他們所做的只是微不足道的沖洗。相比之下,如果您在RAID控制器或SSD上擁有耐用的寫入緩存,則操作系統不需要確保數據實際位於硬盤驅動器上,只需確保其已達到持久寫入緩存 - 即大規模更快,因爲這通常只是一些電源保護的RAM。
這可能是fsync()不是真正的問題;它可能會很慢checkpoints。最好的辦法是查看日誌,看看是否有任何關於檢查點發生頻繁或時間過長的投訴。您還可以啓用log_checkpoints
來記錄檢查點的頻繁程度和頻率。
如果檢查點時間過長,請考慮調整bgwriter完成目標(請參閱文檔)。如果太頻繁,請增加checkpoint_segments
。
請參閱Tuning your PostgreSQL server瞭解更多信息。
儘管非常準確,但請記住,事務中的包裝會改變應用程序的工作,因爲一個錯誤將意味着什麼都不會保存到磁盤! –
在AutoCommit打開的情況下運行時,您將不會在日誌中看到COMMIT語句。 AutoCommit最有可能被關閉,EVERY查詢被顯式包裝在一個事務塊中。這將使更難以確切地診斷哪些查詢導致長時間運行的同步,而無需打開完整的日誌記錄。 –
謝謝!我會尋找可能性來將查詢包裝成更大的塊。 – lorgartzor