MySQLのパフォーマンス

MySQLのパフォーマンス

- Takahiro Kagoya の投稿
返信数: 9

Win2Kserver+IIS5+php521+Moodle1.9という構成で利用しています。

最近のMoodleの利用に際し、どうもレスポンスが悪い気がします。(深夜一人でのアクセスでも。)
サーバー環境は1.5の頃とあまり変わっていません。(メモリ容量等も実メモリ1Gほど)

phpのeAcceleratorも今回から稼働(たぶんしていると思う)させました。

1.9にするのを機にMySQLをmysql 5.0.51a-win32にしました。このインストールの際に、あまり何も考えず、デフォルトのストレージエンジンをInnoDBにしていたようなのですが、本家ではMyISAMの方がいいという記述も見かけました。

あるいはMySQLの変数設定等でメモリの割り当てを適正にしないとパフォーマンスが悪い...といった記述も見かけます。

正直、これらのMySQLについての設定値が複雑でよくわかっていません。それで、大きく2点に分けてアドバイスをいただきたいのですが、

  1. InnoDBにすべきかMyISAMにすべきか。 
     現在moodleデータベース内では、二つのエンジンタイプのテーブルが混在しています。これが最初からか、1.6->1.9にダンプを戻した際にInnoDBになったのかよくわかっていません。
    moodleの管理設定で、MyISAMからInooDBに変換するスクリプトはあったのですが、以前やってみた際、途中にエラーでとまってしまった記憶があります。それと、InnoDBからMyISAMへの変換スクリプトはなさそうですが、phpMyAdminでは、テーブルの操作項目として、、簡単にプルダウンメニューからストレージエンジンを選択できます。試しにあまり使っていない、mdl_hotpotを変えてみたら、Alterできました。もし、すべてのテーブルをMyISAMにすべきならこの方法で変えてしまってよいものでしょうか。テーブルが壊れると怖いので。
  2. MySQLの適正な設定値は?
    MySQLのインストールウィザードであまり深く考えず設定しました。添付ファイルはphpMyAdminのサーバーの変数と状態(ランタイム情報)を表示させ、それをWordに貼り付けたものです。

コメントをいただけたら幸いです。

Takahiro Kagoya への返信

Re: MySQLのパフォーマンス

- Tatsuya Shirai の投稿

 お恥ずかしい話(ばかり)ですが,自分のデータベースがInnoDBかMyISAMか分かりません.どこを見れば分かるのでしょうか.

Tatsuya Shirai への返信

Re: MySQLのパフォーマンス

- Takayuki Fukuyama の投稿
Mysqlはtableごとにエンジンを切り替えられますので、どのテーブルがInnoDBなのかMyISAMなのか(あるいはその他なのか)をみるには show table status というのを使ってやればみる事ができます。




たとえばmdl_userの情報を見たければ以下のようにします
 show table status from DB名 like 'mdl_user'; 
これのEngineというのがそうなのですが、ご存知でしたら余計な事ですが、通常見辛いので\Gを付けてやると可読性がよくなります。
mysql> show table status from mdlcvs like 'mdl_user' \G
*************************** 1. row ***************************
           Name: mdl_user
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 3
 Avg_row_length: 216
    Data_length: 648
Max_data_length: 281474976710655
   Index_length: 18432
      Data_free: 0
 Auto_increment: 4
    Create_time: 2008-04-15 21:13:40
    Update_time: 2008-04-15 21:39:06
     Check_time: 2008-04-15 21:13:40
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment: One record for each person
1 row in set (0.01 sec)

これでMyISAMだという事がわかります。 そしてこれがどのようにCREATEされたかをみるには show create table mdl_user \Gとやるとよくわかりますが
show create table mdl_user \G
*************************** 1. row ***************************
       Table: mdl_user
Create Table: CREATE TABLE `mdl_user` (
  `id` bigint(10) unsigned NOT NULL auto_increment,
--  略
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='One record for each person'
1 row in set (0.01 sec)
このようにMyISAMがENGINEとして指定されてCREATEされている事がわかります。
Takayuki Fukuyama への返信

Re: MySQLのパフォーマンス

- Tatsuya Shirai の投稿

 1,2個のテーブルを見た感じでは,MyISAMのようでした.特に何か変わったことを行なった訳ではありませんので,他もMyISAMなのでしょう.あまりレスポンスが悪いという感じはありませんねぇ.それほど私のMoodleが活用されていないせいでしょう...

 パラメータは多少,調整しています.phpMyAdminでランタイム情報を表示し,赤文字で表示されているステータスのコメント欄にしたがって調整しています.本当に効果が出ているのかは良く分かりませんが.

 いまのところはMoodleのサーバとMySQLのサーバを同一のPC上に構築していますが,これは分けてネットワーク接続した方が効率よく動作するのでしょうか? サーバとしてWindowsXPのPCを使用しています.Pentium4 の HyperThredingを On にしているので,アクセスすると Apache と MySQLが仲良くCPUパワーを半分ずつ取り合っています.サーバを分けて(MySQLはLinux),Apache (Windows) はHyperThreadingをOffにした方がレスポンスが良いかなぁと考えています.

Tatsuya Shirai への返信

Re: MySQLのパフォーマンス

- Takayuki Fukuyama の投稿
phpmyadminですとデータベースを選択したときにズラズラと出てくるテーブル一覧の中に「フィールドタイプ」として見る事が出来ますから多少便利かもしれません。いずれにせよ、moodleはデフォルトでMyISAMを使うようになっているはずです。チューニングに関しては以下のドキュメントが参考になると思います。
データベースパフォーマンス

パフォーマンスが出ないといった場合、一概にDBを疑う事が出来ないのが難しい所です。同一システム上の他のプロセスがCPUやメモリを食い潰している可能性もあるでしょうし、apacheやphpの設定、コネクションがつまっている可能性、また何かがデッドロックのような状態になっている事も考えられます。MySQLの--log-slow-queriesなどのオプションでどのクエリが遅いのか付きとめる事もできますし、(windowsで動くのかどうかわかりませんが)mytopのようなツールでリアルタイムに遅いクエリを見る事もできるのですが、見てもあまりわからないかもしれません。それよりもレスポンスが以上に悪い時を狙ってmysqlにログインしてshow processlist \G などをやってみて大量のrowが取れるようであればDBのロックが何かおかしくなっている可能性もあります。
いずれにせよ上記記事におけるデータベースのチェックや最適化などをやってみる価値はあると思います。

また、SQLサーバをリモートに置く場合は管理のし易さはありますが今度はネットワークがボトルネックになる可能性なども捨てきれません。基本的にはアクセス数とメンテナンス性(と、プログラム設計、とはいえmoodleコード勝手に変えるのも問題ですが)に応じたDB構築を行う必要があると考えます(それこそ大量のアクセスがあるようなサービスですと専用サーバ1台では足りない所もあるでしょうし...)

Takayuki Fukuyama への返信

Re: MySQLのパフォーマンス

- Tatsuya Shirai の投稿

 なるほど.このページは目を通したことがありませんでした.
 特にデータベースの最適化はいつかやらなくてはいけないと考えていましたので,参考になりました.ありがとうございます.


 Innodb関係のランタイム情報(Innodb_buffer_pool_write_requestsなど)は全てゼロですので,当方のMoodle関係のDBにInnoDBのものは一つも無いと考えて良さそうですね.

Takahiro Kagoya への返信

Re: MySQLのパフォーマンス

- Takayuki Fukuyama の投稿
一人でもアクセスが悪いとのことですので、ボトルネックの切り分けがある程度必要かと重いますが(本当に邪魔になっているのがDBなのかどうなのか)、データベースのチューニングの話は奥が深いので一概にこうすれば良いというものでもないのですが、とりあえずmoodle docsには

> Moodleのテーブルでは、「MyISAM」フォーマットを使用します。パフォーマンスの向上に繋がらないため、「InnoDB」は無効にしてください。

と書いてありますね。あまり深く読んでいませんがこんなスレッドもありました
http://moodle.org/mod/forum/discuss.php?d=12961

InnoDB→MyISAMというのはやった事がないのですがphpmyadminで出来るのものなのでしょうか。時間があれば試してみますが、確実なのは一度dumpして構造を替えた後入れ直すのが良いのでは無いかと思います。

# MySQLのチューニングの深い所についてであればmysqlのオフィシャルドキュメント
# も結構そろっていますが、書籍であれば以下の書籍がおすすめです
# http://www.amazon.co.jp/dp/4873112095
Takayuki Fukuyama への返信

Re: MySQLのパフォーマンス

- Takahiro Kagoya の投稿

みなさん、いろいろコメントありがとうございます。

やはり、状況に応じた対応が必要ということで、チューニングは難しいですね。

phpMySQLでのデーブル別のエンジンは、データベースmoodleを選択して、
サーバー:localhost -> データベース:moodle
となった画面の、構造タブで、テーブルの一覧が表となって表示され、その種別の列に表示されています。当方では、半分以上がInnoDBになってしまっています。

エンジンの変更は、テーブルを選択後、操作タブで、テーブルオプションのところで変えられます。...が、本当に変えていいのかが自信ないだけです。

実行時にモニタリングすることもちょっと考えてみます。

それと、テーブルの操作タブにある、テーブル管理(デフラグや最適化)も試してみないといけないのかもしれません。

それと、MySQLだけを疑っていましたが、最近50人以上つかっていて、IISのメモリ使用が200M近くにあがり、極端にアクセスが遅くなる(ほぼ反応がなくなる)ことがあります。タスクマネージャのロードグラフはさほどあがっていないのですが、メモリに無理があるのかもしれません。IISを再起動すると直るので、やはり別スレッドにあったようにISAPIよりもFastCGIにするか、Apacheでの運用にしないとまずいのかもしれません。

 

Takahiro Kagoya への返信

Re: MySQLのパフォーマンス

- Haruhiko Okumura の投稿
すみません,このスレッドは出遅れました。

夜に一人で使っても遅いというのは,MySQLのチューニングといった問題では全然ないでしょうね。
Haruhiko Okumura への返信

Re: MySQLのパフォーマンス

- Tatsuya Shirai の投稿

 「サイト管理」-「サーバ」-「パフォーマンス」はきちんと設定済みだと思いますが,もう一度,確認されては如何でしょう.こちらのキャッシュタイプをeaceleratorに指定し,レコードキャッシュをYesにしてあるでしょうか?(私の場合はあまり体感速度は変わりませんでしたが)

 それと,以前はページフッターにパフォーマンス(レスポンスに要した秒数?)が表示できたと思うのですが,1.8の頃からか,設定はあれども表示されなくなったような気がします.(「サーバ」-「デバッグ」の”パフォーマンス情報”) これが表示されるならば設定値の変更による効果が確認できるのですけれども.


 ちなみに,Wikiは気を抜くと,HTMLエディタの制御コードのゴミが溜まって(<SPAN><SPAN><SPAN><SPAN><SPAN>.....),編集結果を書き込んでから応答が戻ってくるまで長く待たされることはあります.