為寫入密集型機器調整 innoDB
我的桌面上有 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