Mysql

MySQL使用過多的CPU

  • February 22, 2018

我現在正在學習成為一名 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 參與更多 CPU/Core 活動的一些文章。

試一試 !!!

更新 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 處於公平競爭的環境中。

試一試 !!!

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