web-dev-qa-db-ja.com

MySQLは、1500のアクティブな接続で100%のCPUを使用します

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
1
CentosMrqst

フォンノイマンボトルネックに遭遇した可能性があります。

接続数が増えると、CPU使用率も増えると予想されます。接続が増えると、アクティブなクエリの数も増えるはずです。各クエリはCPUを使用します。最終的に、使用可能なすべてのCPUを使用するのに十分なクエリが作成されます。

同時に実行されるクエリの数が増えるにつれて、より多くのCPUを使用するいくつかの追加の要因があります。

  • リソースロックの待機に費やされた時間。これには、追加のCPUを消費するロックスピンが含まれる場合があります。
  • O/Sが現在実行中のクエリを切り替えるときのコンテキスト切り替え。これは、一度に複数のクエリを実行できるマルチプロセッシングの副作用です。

sarのようなプログラムを実行すると、CPUが使用されている場所の詳細が提供される場合があります。

1
BillThor

〜1500のアクティブな接続がある場合、my.cnfを次のように変更することを検討してください:

thread_cache_size = 100   # v8 suggested CAP to minimize thread create/destroy.

詳細な分析については、元の投稿に以下を追加してください:

SHOW GLOBAL STATUS;
SHOW GLOBAL VARIABLES;
SHOW ENGINE INNODB STATUS;

最大5つの特定の提案について、1日あたり最大1つ適用するために、監視します。

0
Wilson Hauck

あなたと

innodb_buffer_pool_size = 35G

あなたはおそらく使用を検討する必要があります

innodb_buffer_pool_instances = 8

並行性を改善し、競合を減らすため。

0
Wilson Hauck