MySQLプロセスがCPU使用率の100%を超える


10

LAMPサーバーで問題が発生しています。私のウェブサイトの訪問者数はそれほど変わっていませんが、最近すべてが非常に遅くなりました。topコマンドを実行すると、MySQLプロセスがCPUの150〜200%を占めていると表示されます。それはどうして可能ですか、100%が最大だといつも思っていましたか?

1.5 GBのRAMを搭載したUbuntu 9.04サーバーエディションを実行しています。

my.cnf 設定:

key_buffer      = 64M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
max_connections        = 200
table_cache            = 512
table_definition_cache = 512
thread_concurrency     = 2

read_buffer_size = 1M
sort_buffer_size = 4M
join_buffer_size = 1M

query_cache_limit   = 1M  # the maximum size of individual query results
query_cache_size    = 128M

MySQLTunerの出力は次のとおりです。

MySQLTunerの出力

topコマンド:

トップ出力

この問題の原因は何ですか?my.cnfサーバーがハングしないように変更できますか?

回答:


15
  1. キーバッファーを増やします(現在のサイズは64MBですが、インデックスの合計は116Mなので、少なくとも128MBを入れてください)。すぐに役立つはずです。
  2. テーブルでmysqloptimizemysqlrepairを実行します。
  3. テーブルキャッシュを増やす/テーブルの総数を減らすと、テーブルキャッシュのヒット率が上がります。おそらく、使用されていないか古いテーブルがいくつか削除されている可能性があります。

その他の推奨される構成オプション:

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • long_query_time = 4
  • log-queries-not-using-indexes

しばらくしてからログファイルを確認してください。


推奨事項をありがとう、私はそれらを試してみて、それが役に立ったかどうかをお知らせします。
Temnovit 2011年

教えてください、インデックスの合計が1億1600万であるとどうやって計算しましたか?
Temnovit、2011年

自分で手に入れました:)
Temnovit

5

複数のコアを持つプロセッサを使用している、または複数のプロセッサを使用している。2つのコアがあり、プロセスが両方のコアの100%を使用している場合、上部に200%と表示されます。

同様に、これはおそらく意図したとおりに機能しています-構成に問題はありません。頻繁にハングしている場合は、投稿した内容から、テーブルに適切なインデックスを追加する(またはクエリを最適化する)ことを検討してください。


5

実行top -Hすると、プロセス全体だけでなく、実行中のすべてのスレッドが表示されます。また、上にいるときに1キーを押すと、個々のCPU /コアのCPU使用率が表示されます。


おかげで、これは本当に役に立ちました-topを何年も使用していて、この機能があることを知りませんでした。私は、常に60%のユーザーCPUを消費する「永遠」のmysqlスレッドが1つあることを発見しましたが、クエリスレッドはこの上に行き来します。今、このスレッドが実際に何をしているかを知るために...
scipilot

1

Mysqlには独立して動作する複数のプロセス(スレッド)があり、1つはたとえば、メモリからディスクにデータを書き込む責任があります。CPU(および/または複数のCPU)に複数のコアがある場合、複数のスレッドが動作しているため、単一のコアの100%以上を実行できます-単純化したレベルでは、2つのコアそれぞれの75%が実行されています、150%を提供します。


1

CPUに関連しない問題に気づきました。同じサーバー上でApacheとMySQLを使用している場合、Apacheアクティビティが増加すると、悪条件(RAM)に達する可能性があります。

MySQLTunnerは、200の使用可能な接続(最大接続設定)を使用すると、RAMがいっぱいになることを通知します。apacheが150プロセスに制限されているとしましょう。MySQLとapacheが150接続を使おうとすると、十分なRAMが足りなくなります(ApacheもRAMを食べるので良いので)。

したがって、これはRAMに関するもので、まだヒットしていない可能性があります:-)上位のコマンドは、15個のapacheプロセスのみを表示します(ただし、負荷平均は3/6/16なので、ストームは15分前で、現在退出)。

CPUの問題については、shakalandyの適切な応答を補完するために、単一のクエリが原因である可能性があります。それは巨大なテーブル上にあるか、多くの再インデックスタスクを実行している、または多くの一時ファイルを使用している、インデックスが欠落している(削除された)などです。それを検出する唯一の方法は、遅いクエリログをアクティブにすることです( 8sのような高いthresoldで)。次に、mysqlslaツールを使用してこの遅いクエリログを分析し、特定されたクエリに対していくつかの説明を実行します。


ありがとう、確かに、mysqlが唯一のプロセスではありません:)
Temnovit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.