Mysql
可以讓 MySQL 使用多個核心嗎?
我收到了一些專用的 MySQL 伺服器,它們從不使用超過一個核心。我比 MySQL 的 DBA 更像開發人員,所以需要一些幫助
設置
這些伺服器在 OLAP/DataWarehouse (DW) 類型的負載下非常龐大:
- 主要:96GB RAM,8 核 + 單個 RAID 10 陣列
- 測試:4 核 32GB RAM
- 最大的 DB 為 540 GB,總量約為 1.1TB,主要是 InnoDB 表
- Solaris 10 Intel-64
- MySQL 5.5.x
注意:最大的 DB 是從 OLTP DR 伺服器複製的 DB,DW 是從這裡載入的。它不是一個完整的 DW:僅持續 6 個月到 6 週,因此它比 OLTP DB 小。
測試伺服器上的觀察
- 3個獨立的連接
- 每個都有一個並發的(和不同的)
ALTER TABLE...DROP KEY...ADD INDEX
- 這 3 個表有 2.5、3.8 和 450 萬行
- CPU 使用率高達 25%(一個核心被最大化)並且沒有更高
- 3 個 ALTER 需要 12-25 分鐘(最小的單個需要 4.5)
問題
- 需要什麼設置或更新檔才能允許使用多個核心?
也就是說,為什麼 MySQL 不使用所有可用的核心?(與其他 RDBMS 一樣) 2. 這是複制的結果嗎?
其他注意事項
- 我了解 RDBMS“執行緒”和作業系統“執行緒”之間的區別
- 我不是在問任何形式的並行性
- InnoDB 和執行緒的一些系統變數不是最佳的
(尋求快速獲勝)- 短期內,我無法更改磁碟佈局
- 如果需要,可以調整作業系統
- 最小表上的單個 ALTER TABLE 需要 4.5 分鐘(令人震驚的 IMO)
編輯 1
- innodb_thread_concurrency 在兩者上都設置為 8。是的,這是錯誤的,但不會讓 MySQL 使用多核
- innodb_buffer_pool_size 在主數據庫上是 80GB,在測試上是 10GB(另一個實例已關閉)。現在可以了。
- innodb_file_per_table = ON
編輯 2
- innodb_flush_log_at_trx_commit = 2
- innodb_use_sys_malloc = ON
- innodb_flush_method 應該是 O_DIRECT (但是 SHOW VARIABLES 沒有顯示這個)
- innodb_doublewrite = 關閉
- 文件系統 = ZFS(我的系統管理員發現了這個:http: //blogs.oracle.com/realneel/entry/mysql_innodb_zfs_best_practices)
去測試
- innodb_flush_method 不應該顯示為 O_DIRECT
- 將遵循 RolandoMySQLDBA 的設置
如果我錯過了任何重要的事情,請告訴我
乾杯
更新
在 RolandoMySQLDBA 的答案中更改了 innodb_flush_method + 3 x 執行緒設置
結果:> 1 個核心用於測試 = 陽性結果
實際上,我在 2011 年 5 月的 Percona Live NYC 會議上與一位 MySQL 專家討論了 innodb_thread_concurrency。
我學到了一些令人驚訝的東西:儘管有文件,最好離開
innodb_thread_concurrency
0(無限並發)。這樣,InnoDB 決定innodb_concurrency_tickets
為給定的 MySQL 實例設置打開的最佳數量。設置
innodb_thread_concurrency
為 0 後,您可以將innodb_read_io_threads
和innodb_write_io_threads
(從 MySQL 5.1.38 開始)設置為最大值 64。這應該會佔用更多核心。