Mysql
超執行緒和 MySQL InnoDB 執行緒並發性能
我有一個具有以下規格的專用數據庫伺服器"
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 中寫了很多關於此設置的文章:
May 26, 2011
:關於單執行緒與多執行緒數據庫的性能Aug 16, 2011
:為什麼禁用查詢記憶體時,MySQL 執行緒經常顯示“freeing items”狀態?Sep 12, 2011
:可以讓 MySQL 使用多個核心嗎?Sep 20, 2011
:多核和 MySQL 性能Apr 26, 2012
: CPU 性能與數據庫伺服器有關嗎?Aug 03, 2012
:用於 solr 索引的 mysql innodb 表中的插入性能較慢
嘗試關閉查詢記憶體,這可能會導致額外的鎖定。