2012-10-30 143 views
4

我正在嘗試優化PostgreSQL 9.1我正在開發的Rails應用程序的數據庫。在postgresql.conf中我已經設置很多「提交」在慢速查詢的PostgreSQL日誌中

log_min_duration_statement = 200 

然後我用PgBadger來分析日誌文件。其中,到目前爲止,佔據了大部分時間的說法是:

COMMIT; 

我沒有得到任何比這更多的信息,我很困惑,什麼說法,這是。有誰知道我能做些什麼來獲得有關COMMIT查詢的更多詳細信息?所有其他查詢都會顯示語句中使用的變量,SELECT,UPDATE等,但不是COMMIT查詢。

回答

6

COMMIT是完全有效的聲明,其目的是提交當前掛起的事務。由於它的真實性質 - 確保數據真正被刷新到磁盤,所以很可能需要大部分時間。

如何讓您的應用程序工作更快? 現在,您的代碼很可能正在使用所謂的自動提交模式 - 也就是說,每條語句都隱含地表示出來。 如果您明確地將較大的塊包裝到BEGIN TRANSACTION; ... COMMIT;塊中,您將使您的應用程序工作得更快並減少提交次數。 祝你好運!

+3

儘管非常準確,但請記住,事務中的包裝會改變應用程序的工作,因爲一個錯誤將意味着什麼都不會保存到磁盤! –

+2

在AutoCommit打開的情況下運行時,您將不會在日誌中看到COMMIT語句。 AutoCommit最有可能被關閉,EVERY查詢被顯式包裝在一個事務塊中。這將使更難以確切地診斷哪些查詢導致長時間運行的同步,而無需打開完整的日誌記錄。 –

+0

謝謝!我會尋找可能性來將查詢包裝成更大的塊。 – lorgartzor

1

嘗試記錄幾天的每個查詢,然後在COMMIT語句之前查看事務中發生了什麼。

log_min_duration_statement = 0

7

作爲@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瞭解更多信息。

+0

謝謝!我會考慮將數據庫服務器移動到一個SSD光盤 – lorgartzor

+0

@ollak如果你這樣做,確保你得到一個具有可靠的寫緩存的少數(可悲昂貴的)之一。他們中的許多人將絕望地破壞您突然斷電的數據。你不想那樣。您需要帶有適當超級電容器,備用電容陣列,電池或其他電源保護的SSD。 –