Mysql

MySQL 使用 100% 的 CPU 和 1500 個活動連接

  • November 2, 2018

我在使用MySQL時遇到問題。我有一個執行一些 cron 作業的系統,這些作業創建了大量的數據庫連接。當它達到大約1500 個活動連接時,cpu 使用率達到 100%,但記憶體保持正常。我的伺服器配置是:

CentOS release 6.6 (Final)
Model   Intel(R) Xeon(R) CPU E5-1660 v3 @ 3.00GHz
Cores   16
Speed   1278.984 MHz
Cache   20480 KB
Memory 130GB

文件 my.cnf:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0


max_connect_errors=100
open-files=64

interactive_timeout=60
wait_timeout=10

max_connections=2000

max_allowed_packet=5M
tmp_table_size=100M
max_heap_table_size=100M

#query cache desativado
query_cache_type = 0
query_cache_limit = 50M

sort_buffer_size=       1M
read_buffer_size= 128K
read_rnd_buffer_size=1M
#join_buffer_size=208M
join_buffer_size=8M
key_buffer_size=20M
myisam_sort_buffer_size=10M

thread_cache_size = 30

key_buffer=100M
open_files_limit=64
default-storage-engine=MyISAM

innodb_file_per_table=1
innodb_buffer_pool_size=35G
innodb_additional_mem_pool_size=80M

query_cache_size=50M

back_log=75
expire_logs_days        = 1
max_binlog_size         = 30M

tmpdir = /var/mysqltmpdir

long_query_time=1
log_slow_queries=/var/log/mysql_slow_queries.log

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
bind-address   =  *
port = 3306

您可能遇到過馮諾依曼瓶頸。

隨著連接數的增加,CPU 使用率預計會增加。隨著連接的增加,活動查詢的數量也應該增加。每個查詢都會使用一些 CPU。最終,您將有足夠的查詢來使用所有可用的 CPU。

隨著並發執行的查詢數量的增加,還有一些額外的因素會使用更多的 CPU:

  • 等待資源鎖所花費的時間。這可能涉及鎖旋轉,這將消耗額外的 CPU。
  • 作業系統切換目前正在執行的查詢時的上下文切換。這是多處理的副作用,它允許您一次執行多個查詢。

執行類似的程序sar可能會提供有關 CPU 使用位置的更多詳細資訊。

和你的

innodb_buffer_pool_size = 35G

你可能應該考慮使用

innodb_buffer_pool_instances = 8

以提高並發性並減少爭用。

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