Mysql

為寫入密集型機器調整 innoDB

  • October 9, 2021

我的桌面上有 MariaDB 10.5,帶有多個磁碟(SSD 和 HDD),用於寫入密集型項目。寫入單個表的速度很快,並且臟頁的百分比保持接近於零1000-3000 writes/s

但是,當我同時主動寫入多個表時,臟頁的百分比迅速上升。問題是刷新到磁碟的水平下降到100 writes/s並保持在該水平。

在重新啟動之前,此行為將一直存在。

我認為這個問題與Percona 10 年前發現的問題有某種關係(不完全是)。

有什麼技巧可以保持沖水的速度嗎?

key_buffer_size     = 20M
max_allowed_packet  = 5G
thread_stack        = 256K
thread_cache_size       = 8
innodb_buffer_pool_size = 70G
innodb_log_buffer_size = 512M
innodb_log_file_size = 20G
innodb_thread_concurrency = 0
innodb_flush_log_at_trx_commit = 0
innodb_compression_level = 6
innodb_io_capacity=2000
innodb_io_capacity_max=30000
innodb_max_dirty_pages_pct=0
innodb_doublewrite = 0
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth=128
innodb_purge_threads=8
innodb_purge_batch_size=600
innodb_flush_neighbors=0
innodb_change_buffer_max_size=50
innodb_buffer_pool_load_at_startup=OFF
innodb_buffer_pool_dump_at_shutdown=OFF
innodb-ft-result-cache-limit=4G
innodb_fatal_semaphore_wait_threshold=7200
innodb_compression_default=ON
innodb_random_read_ahead=1

更新:可能的解決方案

我不發布這個,因為我不確定它是否是真正的解決方案。經過大量實驗,我發現問題在於自適應沖洗。我解決了這個問題

innodb_adaptive_flushing=0
innodb_adaptive_flushing_lwm=70

顯然,當觸發自適應刷新以避免高 I/O 時,它會停留很長時間。

UPDATE2:頁面與列壓縮

我發現問題是

innodb_compression_default=ON

根據Rick James的建議,我使用列壓縮而不是頁面壓縮創建了類似的表。兩種方法的壓縮率大約為 300%(頁面壓縮好 10-20%,適用於整個表而不是選擇性列),但在 HDD 上的性能明顯不同。

我認為問題在於在 HDD 上同時寫入由頁面壓縮創建的多個稀疏文件(這在 SSD 上應該不是問題)。

我需要重新創建所有表來確定,這個過程非常耗時。

對於 MariaDB 和“行通常具有較長的中文本欄位”,請考慮使用列壓縮。

我懷疑這innodb_io_capacity_max=30000太大了。試試5000。

innodb_max_dirty_pages_pct=0– 臟頁好;不要試圖用“0”來避免它們。預設值為 75(百分比);MariaDB 10.5.7 決定一個更好的預設值是 90。試試其中一個。請注意,該設置是GLOBAL動態的,因此不需要重新啟動。

通過不積極刷新“臟”頁面,您提供了在實際需要將塊(“頁面”)寫入磁碟之前多次寫入的可能性。

什麼工具告訴你“100 writes/s”?

如需深入了解,請提供全域狀態和變數:http: //mysql.rjweb.org/doc.php/mysql_analysis#tuning

引用自:https://dba.stackexchange.com/questions/300855