Mysql

超執行緒和 MySQL InnoDB 執行緒並發性能

  • June 27, 2015

我有一個具有以下規格的專用數據庫伺服器"

  • Ubuntu 12.04 LTS 伺服器

  • 英特爾(R) 至強(R) CPU X5670

    • @ 2.93GHz
    • 12 種顏色
  • MySQL 5.5.29

  • 64 GB 記憶體

  • RAID10

我們目前正在做超執行緒,所以我們有 24 個邏輯核心。目前在 2k-4k 事務/秒之間執行。

我設置了以下內容:

  • innodb_thread_concurrency = 48
  • innodb_read_io_threads = 24
  • innodb_write_io_threads = 24

這是嚴格的 OLTP 負載(70% 讀取)。查詢相對較快(毫秒)。查詢記憶體已打開,但未使用太多。臨時磁碟表不經常創建。InnoDB 緩衝池設置為 48GB,幾乎覆蓋了整個數據集(60GB 數據+索引)。

  • 事務負載將翻倍至 4k-8k 事務/秒。目前 CPU 負載約為 1000%,所以我預計這將是瓶頸。

如何更好地調整 CPU 執行緒以及 MySQL 如何使用這些執行緒?讓我知道是否有人對innodb_thread_concurrency.

我將不勝感激任何建議。


更新

從更新innodb_thread_concurrency = 48到:

  • innodb_thread_concurrency = 0

在高峰時間(4-5k 事務/秒)的生產系統上查看行為,這是我觀察到的:

  • 負載平均增加
  • mysqld 程序 CPU 使用率從 400% - 1000% 變為 400% - 1400%
  • 大約 4-10 個 CPU 空閒,而其他 14-20 個 CPU 大約 70%-90%
  • 每個 CPU 的 %wa 為 0% - 0.1%,因此 I/O 不是這裡的問題。(來自 linux 頂部輸出)

似乎設置innodb_thread_concurrency為非零值會限制您的 CPU,以免它們過火。我將其設置回innodb_thread_concurrency=48並降低了 CPU 使用率。

我將不勝感激對這些結果的任何想法。

預設情況下,innodb_thread_concurrency為 0。這實際上是最好的設置。這意味著無限並發。它允許 InnoDB 儲存引擎決定要啟動和處理的最佳並發票數。如果設置不正確,將其設置為非零值實際上可以限制 InnoDB 或限制作業系統。

我在 DBA StackExchange 中寫了很多關於此設置的文章:

嘗試關閉查詢記憶體,這可能會導致額外的鎖定

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