質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

4回答

1982閲覧

Mysql5.5で2台のDBサーバーでパフォーマンスに差異がある場合の調査方法を教えてください

Marcocco

総合スコア26

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

3クリップ

投稿2016/07/26 02:53

編集2016/07/26 03:49

<環境>
CentOS6.5, Mysql5.5

<問題点>
Mysql5.5でまったく同じ性能、設定のDBサーバーが2台あり、テーブル定義は同じですがデータの内容が違うDBがそれぞれにあります。

使用ユーザーが増えるにつれ処理が重くなってきたので調査したところ、DBサーバーAだけがDBサーバーBの1.5倍ほど
CPU使用率が高く、spin_lockも多く発生していることがわかりました。
それで、コネクション数やSQLの発行数などを調査したところ、DBサーバーBの方がAよりも1.3倍ほど値が高い傾向でした。spin_lockは多いもののデッドロックは発生しておらず、スロークエリも問題となるようなものもありません。

<要約>
・DBサーバーA
テーブルX:データ件数約600万レコード

・DBサーバーB
テーブルX':データ件数約600万レコード

※サーバー性能は同じ
※Mysqlの設定は同じ
※Update、Insert、Deleteの処理件数はBの方が多い
※CPU使用率、spin_lock、os_wait値はAの方が高い
※デッドロックは発生していない
※スロークエリも特に問題のあるものはない
※プログラムは同じ
※ユーザーIDにより使用するDBを振り分けている

<質問内容>
この2台のサーバーでなぜこのような違いがあるのか何が考えられるでしょうか?
また、調査するにはどのようにするのがよいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2016/07/26 03:37

ご質問の主意は何でしょうか?単に「2台のサーバーでなぜこのような違いがあるのか」知りたいだけなのか、または「処理が重くなってきた」ことを改善したいのでしょうか?後者の場合、どちらのサーバの何を(処理速度なのか、CPUまたはI/Oの負荷を下げたいのか、、など)改善したいのかを明記すると、具体的な回答がつきやすくなるかと思います。
Marcocco

2016/07/26 03:52

ご連絡ありがとうございます。質問内容がわかりにくくすいません。質問内容修正しました。 質問の意図は、もちろん改善をしたいのですがその前に見解と調査方法がしりたいと考えています。
dupont_kedama

2016/07/26 09:17

テーブルX の それぞれの(レコード数ではなく)データ容量は同等でしょうか?
Marcocco

2016/07/26 09:21

はい、ほぼ同じなのです。
coco_bauer

2016/07/26 09:40

「ユーザーIDにより使用するDBを振り分けている」という事は、サーバーAとサーバーBの負荷は異なりますよね。負荷が異なれば、パフォーマンス(レスポンス)が異なるのは自然だと思います。 それぞれのサーバのログから、どんな要求を受け付けたのかを調べると共に、サーバの負荷情報(CPU利用率、ディスクへのアクセス数、レスポンス時間等のデータ)の推移と対応づけてみれば、パターンが見つかるかもしれません。
Marcocco

2016/07/27 11:17

ご連絡ありがとうございます。確かにおっしゃる通りで、パフォーマンスに差が出るのはわかるのですが あまりにも差が開いており、ログをみても情報の推移を見ても、原因が見いだせていないのが現状です。
guest

回答4

0

ベストアンサー

情報の補足、ありがとうございます。

この2台のサーバーでなぜこのような違いがあるのか何が考えられるでしょうか?

spin_lock、os_wait値はAの方が高い

ということから、DBサーバAではロックの取得待ちが頻発しており、
それがDBサーバAのCPU使用率を高めている、という可能性が考えられます。

なぜなら、どうやら spin_lock 中はビジーウェイトすることがあるようだからです。
https://dev.mysql.com/doc/refman/5.5/en/innodb-performance-spin_lock_polling.html

InnoDB minimizes this issue by waiting a random time between subsequent polls. The delay is implemented as a busy loop.

また、調査するにはどのようにするのがよいでしょうか?

上の仮説を検証するためには、INFORMATION_SCHEMA テーブルを確認すると何か分かるかもしれません。
https://dev.mysql.com/doc/refman/5.5/en/information-schema.html

ちょっと情報が多すぎて私も追いきれていないのですが、以下のページなどが有用かと思います。
https://dev.mysql.com/doc/refman/5.5/en/innodb-information-schema-transactions.html
https://dev.mysql.com/doc/refman/5.5/en/innodb-trx-table.html
https://dev.mysql.com/doc/refman/5.5/en/innodb-locks-table.html
https://dev.mysql.com/doc/refman/5.5/en/innodb-lock-waits-table.html
https://dev.mysql.com/doc/refman/5.5/en/innodb-information-schema-examples.html

特に、最後のリンクで紹介されているクエリを何度も繰り返し実行してみて、waiting_queryカラムやblocking_queryカラムに同じようなクエリが頻繁に表示される場合、それが犯人だと推測できます。

または、一時的にスロークエリの閾値を下げてみることで、問題のあるクエリを検出できる可能性があります。
https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_long_query_time
https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_min_examined_row_limit

※スロークエリも特に問題のあるものはない

とのことですが、例えば、現状 long_query_timeの値をデフォルトの 10 に設定しているとすると、
1回の実行に5秒かかるクエリが10万回実行されていたとしても、それをスローログから検知することはできません。

一時的にスロークエリの閾値を下げてみることで、そのようなクエリがログに記録されるかもしれないからです。


ちなみに、本回答で紹介させていただいたMySQLのマニュアルのリンクについて、実はURLの "5.5/en" 部分を "5.6/ja" に書き換えると、すべて日本語訳のページを表示してくれますw

ただし、日本語訳は バージョン5.6 のものですので、5.5 とは記述が異なっている可能性があります。
ご注意ください。

投稿2016/07/27 15:52

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Marcocco

2016/08/03 03:36

連絡が遅くなってすいません。詳細な回答に感動です。実はその後、調査を待っていられないとのことでプログラム改良で対応され、環境が変わってしまいました。。。でのすので、次回、今後調査する際の糧とさせていただきます。ありがとうございました。
guest

0

レプリケーションなし、ユーザーIDで水平分割の運用でしょうか?
通常ありえないことばかりですが、なにかヒントになることでもあれば・・・

  1. Aサーバーのほうがクエリキャッシュのヒット率が低い
  2. Aサーバーが複雑なSQLの割合が多い(JOIN/サブクエリなど)
  3. もしくは、複雑なSQLに影響するデータ数が多い
  4. クラウドの共有サーバーの場合、同じハード上の他サーバーに引っ張られている
  5. ストレージの劣化
  6. MySQL以外のサービスが影響

投稿2016/07/26 08:39

rkojima

総合スコア421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Marcocco

2016/07/27 10:44

連絡が遅くなってすいません。はい、水平分割です。 回答の観点で調査してみます。ありがとうございました!
guest

0

もう既に試されたとは思いますが書いておきます。
Deleteが多いと、徐々にHDD領域を多めに取ってしまうようになると思います。
ですので、テーブルの最適化を試してはどうでしょうか。

SQL

1$ mysqlcheck -u root -p -o db名 table

InnoDB の場合は、
テーブルダンプ ⇒ テーブル削除 ⇒ テーブル最作成 ⇒ テーブルリストア
の手順で可能だそうです。

投稿2016/07/26 03:29

momotaro888

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Marcocco

2016/07/26 05:53

ご連絡ありがとうございます。本番機なので原因が特定できずにこの作業を行いますとはいえない状況なのです。。。
guest

0

同じテーブルをA,Bに用意して検証してみないとあまり意味ないのでは?

データへのアクセスはどのようにされていますか?
ODBCやPDOでプログラムから読んでいます?

あまり関係ないかもしれませんがデータが多くなればHDDなどのファイルI/Oも
それなりに影響があるのかもしれません

投稿2016/07/26 03:10

yambejp

総合スコア114767

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Marcocco

2016/07/26 05:50

ご連絡ありがとうございます。PDOを使っています。 そうですね。断片化も遅くなる原因になるかとは思います。 しかし、同じ時期に構築したAとBで大きく違うのが不可解なのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問