禁用binlog時mysql伺服器大多停止工作
性能比我在 mysql 伺服器上想要的要慢一些,而且我們不使用複制,也不需要時間點恢復。因此,一種推薦的提高性能的方法似乎是關閉 bin-logging。我的 my.cnf 中有以下內容:
## Replication / Transaction Logging # binlog_format = row log-bin = /var/lib/mysql/mysql-bin.log expire_logs_days = 3 sync-binlog = 1
我註釋掉了所有四行並重新啟動了 mysql。該服務啟動良好,在任何錯誤日誌或慢查詢日誌中都沒有任何問題。一切看起來都很好,除了寫入性能減慢到無法使用的水平。它確實繼續工作。取消註釋以上四行並重新啟動服務立即恢復了以前的性能水平。
以前的性能水平不是我想要的,我想要關閉 bin-logging 帶來的性能改進。
為什麼會這樣?如何成功關閉 bin 日誌記錄以獲得性能?
眼鏡:
- 所有表都是innodb(一些相當大)
- mysql Ver 14.14 Distrib 5.6.19,用於使用 EditLine 包裝器的 debian-linux-gnu (x86_64)
- Ubuntu 12.04 LTS 伺服器
同步二進制日誌
當您註釋掉時
sync-binlog = 1
,發生了什麼?您將sync_binlog預設設置為 0。然後會發生什麼?MySQL 文件說:
sync_binlog 的預設值為 0,它不同步到磁碟——在這種情況下,伺服器依賴作業系統不時刷新二進制日誌的內容,就像任何其他文件一樣。
這意味著 mysqld 受作業系統的支配以將磁碟更改刷新到二進制日誌。這表明必須有很多文件打開(執行
lsof
)作業系統必須刷新到磁碟。MySQL 的目前二進制日誌必須處於需要定期刷新到磁碟的打開文件日誌堵塞的中間,尤其是在定期寫入大量這些打開文件的情況下。MySQL 文件進一步說:
值 1 是最安全的選擇,因為在發生崩潰時,您最多會從二進制日誌中失去一個送出組。然而,它也是最慢的選擇(除非磁碟有電池支持的記憶體,這使得同步非常快)。
這僅僅意味著執行的刷新到磁碟
sync-binlog=1
為伺服器提供了一些穩定性,因為磁碟更改被刷新到磁碟並釋放了作業系統以更好地執行。沒有它,mysqld 與任何其他打開文件的程序(應用程序或作業系統)具有相同的優先級。InnoDB
這是 InnoDB 的圖形表示(來自 Percona CTO Vadim Tkachenko)
您可能希望強制 InnoDB 更積極地刷新到磁碟並且仍然表現良好。
- 設置innodb_flush_method以
O_DIRECT
使 InnoDB 處理自己的磁碟更改刷新。給定圖片,InnoDB 將顯式刷新到系統表空間(ibdata1)中的雙寫緩衝區以及.ibd
緩衝池中的表文件。在具有硬體 RAID 控制器和電池支持的寫入記憶體的系統上,O_DIRECT 可以幫助避免 InnoDB 緩衝池和作業系統的文件系統記憶體之間的雙重緩衝。- 將innodb_write_io_threads設置為 8(或 16)
- 將innodb_log_buffer_size設置為 128M 以減少磁碟 I/O
- 將innodb_log_file_size設置為 1G
因此,將這些設置添加到 my.cnf(需要重新啟動)
[mysqld] innodb_flush_method = O_DIRECT innodb_write_io_threads = 8 innodb_log_buffer_size = 128M innodb_log_file_size = 1G
結語
如果你想禁用二進制日誌,調整 InnoDB 以通過補償更好地刷新