Mysql

可以讓 MySQL 使用多個核心嗎?

  • February 28, 2020

我收到了一些專用的 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)

問題

  1. 需要什麼設置或更新檔才能允許使用多個核心?

也就是說,為什麼 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_method 不應該顯示為 O_DIRECT
  • 將遵循 RolandoMySQLDBA 的設置

如果我錯過了任何重要的事情,請告訴我

乾杯

更新

在 RolandoMySQLDBA 的答案中更改了 innodb_flush_method + 3 x 執行緒設置

結果:> 1 個核心用於測試 = 陽性結果

實際上,我在 2011 年 5 月的 Percona Live NYC 會議上與一位 MySQL 專家討論了 innodb_thread_concurrency

我學到了一些令人驚訝的東西:儘管有文件,最好離開innodb_thread_concurrency0(無限並發)。這樣,InnoDB 決定innodb_concurrency_tickets為給定的 MySQL 實例設置打開的最佳數量。

設置innodb_thread_concurrency為 0 後,您可以將innodb_read_io_threadsinnodb_write_io_threads(從 MySQL 5.1.38 開始)設置為最大值 64。這應該會佔用更多核心。

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