web-dev-qa-db-ja.com

CentOS 6でのMySQL 5.1高CPU使用

MySQL 5.1を16G RAMを搭載したCentOS 6サーバーで実行しています。私はそれにApacheも手に入れました。

MySQLは常に過剰なCPUを使用しています。

top - 17:40:36 up 112 days, 12:13,  1 user,  load average: 1.24, 1.72, 1.82
Tasks: 222 total,   1 running, 221 sleeping,   0 stopped,   0 zombie
Cpu(s): 12.3%us, 11.6%sy,  0.4%ni, 72.9%id,  2.8%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  16329040k total, 12946136k used,  3382904k free,   587252k buffers
Swap:  1051832k total,  1050988k used,      844k free,  4986272k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                 
25368 mysql     20   0 8854m 5.3g 5064 S 295.4 33.9  11912:37 mysqld                                                                                                                                 
 1757 Apache    20   0  982m  80m  28m S  2.0  0.5   0:03.04 httpd                                                                                                                                   
 2494 Apache    20   0  878m  68m  27m S  2.0  0.4   0:00.92 httpd   

my.cnf

[client]
default-character-set=utf8

[mysqld]
local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
bind-address=127.0.0.1

key_buffer        = 800M
max_allowed_packet    = 32M
thread_stack        = 256K
thread_cache        = 8
thread_cache_size    = 20
thread_concurrency = 4
max_connections        = 510
table_cache            = 9000
interactive_timeout = 80
tmp_table_size = 540M
max_heap_table_size = 540M
max_connect_errors = 150
wait_timeout = 20
read_rnd_buffer_size = 1024K
connect_timeout = 10
query_cache_type = 1
query_cache_limit   = 40M
query_cache_size        = 128M
innodb_buffer_pool_size = 256M

join_buffer_size = 14M
sort_buffer_size = 14M

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

SHOW FULL PROCESSLIST;は、平均2〜5のクエリで私を返します。

これはSHOW VARIABLES;コマンドの出力です

このシステムでMyISAMテーブルとInnoDBテーブルを取得しました。

ご提案ありがとうございます。

編集1

これはvmstatの出力です

編集2

SHOW GLOBAL STATUS出力は、コメントの下にあります。

2
jithujose

システムで最も遅いクエリを見てみましょう。おそらく、それを修正する(インデックスの追加、SELECTの再構成など)ことが最善の解決策です。 SHOW FULL PROCESSLIST-あなたはいたずらなクエリを表示する可能性が高いと述べました。それらと、関連するSHOW CREATE TABLEを見てみましょう。

query_cache_size = 128M-大きすぎます; 5000万以下。大きな値を指定すると、剪定によりシステムの速度が低下します。

innodb_buffer_pool_size = 256Mおよびkey_buffer = 800M-どのエンジンを使用していますか?これらの値はどちらも「良い」とは言えません。詳細なアドバイスについては http://mysql.rjweb.org/doc.php/memory を参照してください。キャッシュのサイズが適切でないと、余分なI/Oが発生する可能性があり、遅いクエリと見なされます。

table_cache = 9000-いいね!テーブルはいくつありますか? (何千ものテーブルがOSの問題です。)

1
Rick James

この問題は、このサーバーでホストされている非アクティブなレガシーWebサイトが原因で発生しました。大量のスパムの標的になりました。一部のテーブルを読み取り専用モードにすることで、この問題を解決しました。

0
jithujose