MySQL使用過多的CPU
我現在正在學習成為一名 DBA,因為我有一個龐大的實時數據庫,我管理它非常敏感。這是我的專用數據庫伺服器的目前系統統計資訊:
- CentOS 5.9
- 24GB 記憶體
- 8核CPU
- 用於 /var/lib/mysql 的 50gb FusionIO 磁碟
- MySQL 5.5.23
頂部 - 18:40:27 上升 14 天,4:43,1 個使用者,平均負載:19.72、22.62、24.04
任務:共 183 個,執行 3 個,睡眠 180 個,停止 0 個,殭屍 0 個
CPU (s): 69.9%us, 0.4%sy, 0.0%ni, 29.2%id, 0.0%wa, 0.1%hi, 0.4%si, 0.0%st
記憶體:總計 24685224k,已使用 20172096k,空閒 4513128k,343420k 緩衝區
交換:總計 2007284k,使用 0k,免費 2007284k,記憶體 729004k
PID 使用者 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令
5446 mysql 15 0 18.4g 17g 6176 R 765.8 76.2 114437:38 mysqld
我目前正在使用 50gb FusionIO 切片中的 43gb。MySQL 平均大約 700 QPS 和 75-90% 的 CPU 使用率。這是我的 my.cnf 文件:
[mysqld] user=mysql datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock #innodb #innodb_log_file_size = 256M #innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 2 innodb_lock_wait_timeout=50 innodb_file_per_table innodb_buffer_pool_size=16G innodb_buffer_pool_instances=4 #eliminating double buffering innodb_flush_method = O_DIRECT flush_time=86400 skip-name-resolve query_cache_limit=4M query_cache_size=256M sort_buffer_size=8M read_rnd_buffer_size=1M max_connections=5000 interactive_timeout=60 wait_timeout=300 connect_timeout=30 thread_cache_size=32 key_buffer=124M tmp_table_size=4096M max_heap_table_size=256M join_buffer=16M max_connect_errors=2000 table_cache=2048 thread_concurrency=12 long_query_time=5 log-slow-queries=/var/log/mysql-slow.log #table_definition_cache=384 max_allowed_packet=1024M #server-id=20 #log-bin=mysql-bin #expire_logs_days=10 event_scheduler=ON [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
你們能推薦我應該對 MySQL 或 CentOS 進行的任何配置更改,以大大降低我的 CPU 使用率嗎?或者就此而言是否有任何其他資源改進?
你需要釋放兩件事
- innodb_read_io_threads (預設為 4, Max 為 64, 提高 8 或 16)
- innodb_write_io_threads (預設為 4, Max 為 64, 提高 8 或 16)
- innodb_thread_concurrency(預設為0。既然你沒有,0就好了)
這些年來我一直在討論這個問題。請參閱我之前關於讓 InnoDB 參與更多 CPU/Core 活動的一些文章。
May 26, 2011
:關於單執行緒與多執行緒數據庫的性能Sep 12, 2011
:可以讓 MySQL 使用多個核心嗎?Sep 20, 2011
:多核和 MySQL 性能Apr 26, 2012
: CPU 性能與數據庫伺服器有關嗎?試一試 !!!
更新 2013-06-20 02:39 EDT
你最後的評論
嘿 Rolando,我在 8 時添加了 read_io 和 write_io 並閱讀了您的其他文章,但它似乎並沒有降低 CPU 使用率。我什至將 4 個緩衝池實例減少到 1 個,希望它有更好的性能,但還是不行。你還有什麼我可以實施的有助於降低 CPU 使用率的建議嗎?
我建議將innodb_buffer_pool_instances提高到 8 以匹配核心數。MySQL 文件建議每個緩衝池實例 1G。然後,您將提高到 16(因為您的 innodb_buffer_pool_size 為 16G)。先試試 8,再試試 16。
即使這樣,我也有一些相當令人痛心的消息:這是2 年前 FusionIO 的新聞稿。第 2 段說:
StatSoft 白皮書得出的結論是,Fusion ioDrives 顯著提高了 STATISTICA 分析軟體產品和解決方案套件的 I/O 性能,大大提高了 CPU 使用率和效率。與傳統的基於磁碟的儲存相比,借助 ioMemory,StatSoft 實現了 300% 和 500% 的數據性能和延遲減少改進。隨著 Fusion ioDrives 提高 I/O 性能,在大型數據集測試中 CPU 使用率增加到 90%,而基於磁碟的技術觀察到的 CPU 使用率為 32%。
如果您使用 RAID 10 SAS 甚至 SSD
/var/lib/mysql
,InnoDB 將與 CPU 共事。但是,從本新聞稿的外觀來看,InnoDB 正在與 FusionIO 競爭 CPU 使用率。建議
找出 FusionIO 磁碟的 IOP 並將innodb_io_capacity設置為該數字。innodb_io_capacity的預設值為200。如果 IOP 大於 200,請設置它。如果 IOP 達到 1000,那麼 InnoDB 就有機會與 FusionIO 處於公平競爭的環境中。
試一試 !!!