パフォーマンス
再作成中です - Mitsuhiro Yoshida 2010年4月8日 (木) 15:44 (UTC)
少人数のユーザ、数千名のユーザでも、Moodle は快適に稼動させることができます。パフォーマンスに関係する要素は、基本的に他の PHP ベースのデータベース主導型システムと同じです。 あなたのサーバを最適化するには「ユーザ数の多寡が大きな要素となること」に焦点を置いてください。例えば、相対的にみて、データベースにアクセスするユーザよりも閲覧するユーザが多い場合、ウェブサーバのパフォーマンスを改善してください。
ベンチマークのベースラインを取得する
最適化を試みる前に、あなたが改善しようと考えるシステムコンポーネントに関するベンチマークのベースラインを取得してください。Linux の場合、LBS をお試しください。Windows の場合、パフォーマンスモニターを使用してください。システムに関する現在のパフォーマンスの数値データを取得することにより、あなたの設定変更がどれだけ実際のインパクトを与えたのか測定することができるようになります。
パフォーマンスを改善するための全体的な照準は、RAM (キャッシング) の使用量およびディスクベースの活動の軽減です。特にスワップファイルの使用を可能な限り減らすことは重要です。あなたのシステムがスワッピングを開始した場合、さらに RAM を追加すべきです。
一般的に「最適化の優先順位」は、第1に「記憶装置 (RAM)」、第2に「記憶装置 (速いハードディスク/ハードディスク設定の改善)」、第3に「プロセッサ (個数および速度)」です。
スケーラビリティ (拡張性)
アプリケーション層を明確に分離することにより、強力に拡張可能な設定を Moodle に施すことができます (詳細は Moodleの大規模インストールをご覧ください)。
通常、小規模サイトでは必要ありませんが、大規模サイトではウェブおよびデータベースを分離したサーバに設置してください。
例えば1つ以上のサーバを使用することで、Moodle をロードバランスすることは可能です。分離されたウェブサーバでは、同じデータベースに問い合わせを行い、同じファイルエリアを参照します。そうでなければ、このようなクラスタリングを適用するには、アプリケーション層の分離だけで十分です。同様に、データベースをクラスタ化することもできます (例 MySQL クラスタ)。しかし、これは簡単な仕事ではなく、エキスパートのサポートが必要です。
ハードウェア設定
メモ: あなたがパフォーマンスを改善できる、簡単かつ効果的な変更は、サーバのメモリを可能な限り増やすことです (例 4GB)。メモリを増やすことで、ディスクへのスワップを減らし、さらに多くのユーザを処理することができるようになります。
- 最良の「プロセッサ性能」 (例 デュアルまたはデュアルコア) を適用することで、さらなるパフォーマンスの向上を図ることができます。最新の BIOS では、ハイパースレッディングを有効にすることができます。しかし、これが全体的なプロセッサのパフォーマンスに違いをもたらすかどうか、CPUベンチマークツールを使用して確認してください。
- 可能でしたら、「SATA ドライブ」の代わりに「SCSI ハードディスク」を購入してください。SCSI ドライブが独自の統合プロセッサを持ち、複数ドライブがある場合、それぞれに統合プロセッサを持つのに対し、SATA ドライブはシステム CPU の利用を増大させます。あなたが SATA ドライブを使用する必要がある場合、マザーボードおよびドライブが NCQ (Native Command Queuing) をサポートするかどうかチェックしてください。
- 「シークタイムの短い」ハードディスクを購入してください。これは全体的なスピード (特に Moodle のレポートにアクセスする時) を改善します。
- 「スワップファイル」を正しく設定してください。一般的には、物理メモリーの4倍の設定値をお勧めします (この設定値には賛否両論あります - Mitsuhiro Yoshida)。
- 「RAID ディスクシステム」を使用してください。サーバコンピュータに対して、多くの異なる RAID 設定を行うことができますが、下記の設定は一般的に最も良く動作します:
- 可能であればハードウェア RAID コントローラーをインストールしてください (ソフトウェア RAID、ハードウェア RAID に関する意見も多々あります - Mitsuhiro Yoshida)。
- RAID-1 に設定して、オペレーティングシステムとスワップを同じドライブに設定してください。
- Moodle、ウェブサーバおよびデータベースを RAID-5 に設定した別々のディスクに入れてください。
- 遅延時間およびスループットを改善するため、「ギガビットイーサーネット」を使用してください。あなたがウェブサーバおよびデータベースサーバを分離して運用している場合、これは特に大切です。
- あなたの「ネットワークカード」の設定を確認してください。バッファおよびトランスミット/レシーブディスクリプタを増やすこと (これはプロセッサとメモリのオーバヘッドとのバランスをとってください)、TCP チェックサムの計算を OS ではなくカードにオフロードすることでパフォーマンスを改善することができます。
オペレーティングシステム
- あなたはサーバの「オペレーティングシステム」として、Linux (お勧めです) 、Unix ベースの OS、Windows、Mac OS X を使用することができます。シェルインターフェースのみで構成された場合、一般的に *nix オペレーティングシステムは同じタスクの処理に関して、Mac OS X または Windows サーバよりも少ないメモリを必要とします。さらに Linux にはライセンス料が発生しませんが、あなたが他のオペレーティングシステムを日常的に使用している場合、Linux コマンド等の習得に大きな学習曲線を描くことになります。サーバが SMP で動作している大量のプロセッサを持っている場合、高度にチューニングされた Solaris のような OS の使用を考えてみてください。
- 最適化するには、OS および「サーバ製造元の使用説明書」を確認してください。
- Linux に関しては、Linux Performance Team サイトをご覧ください。
- Linux では hdparm コマンドでハードディスクの状態を詳細に調べることができます。例) hdparm -m16 -d1 でマルチセクタの read/write を有効にできます。DMA マウントのディスクには、async および noatime オプションを付けてください。
- Windows サーバでは、ネットワークアプリケーションを最適化してください (コントロールパネル >> ネットワーク接続 >> LAN 接続 >> プロパティ >> Microsoft ネットワーク用ファイルとプリンタ共有 >> 最適化)。最適化に関するドキュメントは、Microsoft TechNetサイトでご覧いただけます。
ウェブサーバパフォーマンス
Firefox および firebug エクステンションをインストールすることで、それぞれのページコンポーネントのロードに掛かる時間を観察することができます。また、Yslow エクステンションでは、ウェブサイトの迅速なロードするため、あなたのページを Yahoo 14 rules (video) に関して調査します。
PHP パフォーマンス
- CPU ロードを軽減するAPC (推奨)、PHPA、Xcache または eAccelerator のような「PHP アクセラレータ」の使用を強くお勧めします。(あなたの PHP バージョンで適切に動作する PHP アクセラレータを注意深く選定してください。Turck MMCache の開発およびメンテナンスは中止され、PHP 5 で問題が発生しますので注意してください)。PHP ページのキャッシュを TMPFS ファイルシステムに置いてください。
- CGI としてインストールするより「Apache/IIS ISAPI モジュール」としてインストールする方が、PHP のパフォーマンスは良くなります。
- ご利用の Moodle が 1.7 より以前のバージョンの場合、php.ini の「memory_limit」を確認して、16M に減らしてください (詳細はこのフォーラムディスカッションをご覧ください)。Moodle 1.7 以降では、「memory_limit」を 40M に設定することをお勧めします。
Apache パフォーマンス
- MaxClients ディレクティブを正しく設定してください。 次の公式を使用して設定値を計算してください (予備のメモリ領域を残すため、利用可能なメモリの 80% を使用します):
MaxClients = 利用可能な合計メモリ * 80% / Apache プロセスの最大メモリ使用量
- Apache プロセスのメモリ使用量は通常 10MB です。一般的な経験則として、MaxClients の値を取得するには、利用可能なメモリ容量を 10MB で割ってください。Apache プロセスの最大メモリ使用量を見つけるには、シェルコマンドの結果より値を読み取ってください:
#ps -ylC httpd --sort:rss
- 警告: MaxClients の値をあなたの利用可能なメモリ容量より大きくする誘惑に負けないでください。サーバが実際の RAM より多くを消費し、ディスクスワップが発生し始めることになります。
- 必要なメモリを減らすため、Apache がロードするモジュール数を httpd.conf ファイルで必要最小限に減らすことを考慮してください。
- 最新バージョンの Apache を使用してください - Apache 2 ではメモリ使用量を大幅に減らすため、メモリモデルが改善されています。
- Unix/Linux システムでは、httpd.conf の「MaxRequestsPerChild」を 20~30 くらいに下げることをお考えください (この設定をさらに低くすると、fork のオーバーヘッドがメリットを上回ることになります)。
- 負荷が高いサーバでは、「KeepAlive Off」に設定する (Moodle ページにリソースまたはアップロードされたイメージへのリンクが設定されていない場合のみ)、または「KeepAliveTimeout」を 2~5 の間に下げることをお考えください。デフォルトは 15 (秒) です - この値を高くすると、それに応じてサーバプロセスがアイドルコネクションを待つことになります。あなたのユーザがページのダウンロードにかかる時間を観察することで、より正確な「KeepAliveTimeout」の値を取得できます。さらなる作業プロセス/スレッドの起動により、オーバーヘッドが発生しますので、 KeepAlive の設定を変更した後は CPU 利用を監視してください。
- 「KeepAlive Off」の代わりの方法として、HTML ファイルとイメージをキャッシュするため、Moodle サーバの前に Reverse Proxy server を設定することをお考えください。
- あなたが「.htaccess」ファイルを使用していない場合、.htaccess ルックアップを避けるため、AllowOverride を「AllowOverride None」にしてください。
- content-negotiation (コンテンツ・ネゴシエーション) を避けるため、DirectoryIndex を正しく設定してください。以下、運用サーバの設定例です:
DirectoryIndex index.php index.html index.htm
- あなたがサーバを開発作業に使用している場合を除いて、ExtendedStatus Off を設定および mod_info と同様に mod_status を無効にしてください。
- DNS 待ち時間を減らすため、HostnamesLookups Off (デフォルト) のままにしてください。
- TimeOut の値を 30~60 (秒) に減らすことを考慮してください。
- Options Multiviews によるディレクトリスキャンを避けるため、Options ディレクティブを設定してください。ディスク I/O を減らすには:
Options -Indexes FollowSymLinks
- キャッシング - Apache では、イメージのような各種ページ要素をローカルメモリでキャッシュして、ページがリクエストされるたびに Apache に要求しないようブラウザに指示することができます。この設定をどのようにするか OS 間で若干異なりますが、以下2つの基本的なステップがあります:
- mod_expires をインストールおよび有効化してください - 詳細はドキュメントまたは man ページをご覧ください。
- 次のコードをバーチャルサーバの config ファイル内の root ディレクトリ用 <directory> セクションに追加してください (または、AllowOverrides が有効の場合、.htaccess ファイル):
<IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 seconds" ExpiresByType text/html "access plus 1 seconds" ExpiresByType image/gif "access plus 1 week" ExpiresByType image/jpeg "access plus 1 week" ExpiresByType image/png "access plus 1 week" ExpiresByType text/css "access plus 1 week" ExpiresByType text/javascript "access plus 1 week" ExpiresByType application/x-javascript "access plus 1 week" ExpiresByType text/xml "access plus 1 seconds" </IfModule>
この設定の効果は、動的に変わる HTML および XML を除いて、すべてをキャッシュに保持します。このようにして、ロードタイムを大幅に減らすことが可能です。どのくらいの頻度であなたのイメージが変更されるか等を考慮しながら、キャッシュタイムを調整してください。
詳細は次のサイトをご覧ください: www.metaskills.net
代わりに「ライトウェイトウェブサーバ (lighttpd)」lighttpd と fastCGI モードの PHP を使用することにより、ウェブサーバのパフォーマンスを向上させることができます。Apache に比べて Lighttpd では、メモリー消費を抑えることができます。fastCGI と lighttpd を合わせたプロセスより、1つの Apache プロセスの方がより多くの RAM を必要とします。注意: Lighttpd は相対的に設定および管理が難しく、Apache より多くの時間を要します。
IIS パフォーマンス
IISパフォーマンス - 下記の場所にあるすべてのレジストリを変更してください:
HKLM\SYSTEM\CurrentControlSet\Services\Inetinfo\Parameters\
- KeepAliveTimeoutと同等な設定項目は「ListenBackLog」です (IIS - レジストリの場所: HKLM\ SYSTEM\ CurrentControlSet\ Services\ Inetinfo\ Parameters)。この値を 2~5 の間に設定してください。
- 「MemCacheSize」の値を搭載メモリ総量 (MB) に合わせてください。IIS ではファイルキャッシュに使用します (デフォルトは利用可能メモリの 50% です)。
- 「MaxCachedFileSize」の値をファイルキャッシュに保存されるファイルキャッシュの最大サイズ (単位: バイト) に合わせてください。デフォルトは、262,144 (256K) です。
- キャッシュ内のオブジェクトがメモリに保持される時間 (ミリセカンド) を変更するため、「ObjectCacheTTL」と呼ばれる DWORD を新しく作成してください。デフォルトは、30,000 ミリセカンド (30秒) です。
データベースパフォーマンス
Moodle にはADOdbパフォーマンスモニタから重要なデータベースパフォーマンス統計を表示するスクリプトが含まれています。下記の例のようにスクリプトを実行してください:
http://www.mymoodle.com/admin/dbperformance.php
あなたのデータベースサーバのチューニングおよび改善のため、表示されるデータを利用してください。
MySQL パフォーマンス
次の内容は、あなたの MySQL パフォーマンスを向上させるための my.cnf (Windowsではmy.ini) 特有の設定です。現在の設定値は次のコマンドで確認することができます。
SHOW STATUS; SHOW VARIABLES;
重要: MySQL サーバの設定を変更する前に、あなたのデータベースを必ずバックアップしてください。my.cnf を少しでも変更した後は、mysqld をリスタートしてください。
- 「query_cache_type = 1」 にすることで「query cache」を有効にしてください。ほとんどの Moodle インストールでは、query_cache_size を 36M に、query_cache_min_res_unit を 2K にしてください。データベースの更新が頻繁でない場合、「query cache」はパフォーマンスを改善します。
- 「table cache」を正しく設定してください。Moodle 1.6では table_cache = 159に、Moodle 1.7では table_cache = 170 に設定してください。あなたがインストールしたモジュールおよびプラグインの数に応じてこの値は変わりますので注意してください。下記のMySQL命令文を実行して、あなたのサーバの値を調査してください。表示される行 (rows) を確認して、その値を table_cache に設定してください。
mysql>SELECT table_name FROM information_schema.tables WHERE table_schema='yourmoodledbname';
- 「thread cache」を正しく設定してください。この式であなたの「スレッドキャッシュ利用 (thread cache utilization)」ができるだけ100%に近くなるように調整してください:
thread cache utilization (%) = (threads_created / connections) * 100
- 「key buffer」はMoodle の SELECT クエリーのアクセススピードを改善することができます。適切な値は、インデックスファイル (myi) のサイズに依存します。Moodle 1.6 またはそれ以上 (追加モジュールおよびプラグインなし) での推奨値は、key_buffer_size = 32M です。100 リクエストごとにデータベースを1回読むのが理想的です。あなたの Moodle に値が適切になるよう、次の式に当てはまる key_buffer_size の値を調整してください:
key_read / key_read_requests < 0.01 key_write / key_write_requests <= 1.0
- あなたのユーザが「Too many connections」メッセージを見なくても良いように、「maximum number of connections」を設定してください。この設定は総メモリ使用量に影響を及ぼしますので注意してください。一般的に MySQL コネクションは、1000分の何秒か続きます。ですから非常に負荷の高いサーバだとしても、200 以上の値を設定することは普通ではありません。
- 「高負荷活動」に対する設定。あなたが多くの小テストを含む Moodle を使用して、パフォーマンスに関する問題がある場合、「back_log」の設定値を増やしてみてください (threads_connected の値をモニタして確認してください - この値が上がらないはずです。)。
- 毎週および Moodle のアップグレード後に MySQL テーブルを最適化してください。活動モジュールの大きなデータ削除後、あなたの MySQL テーブルを最適化することをお勧めします (例 学期または年度の終了後)。この作業により、確実にインデックスファイルが最新のものになります。最初にデータベースをバックアップして、次のコマンドを実行してください:
mysql>CHECK TABLE mdl_tablename; mysql>OPTIMIZE TABLE mdl_tablename;
- 一般的にチェックする Moodle のテーブルは、mdl_course_sections、mdl_forum_posts、mdl_log および mdl_sessions (dbsessionsを使用する場合) です。 REPAIR TABLE コマンドを使用して、テーブルのエラーを修正してください (詳細はMySQL manual をご覧ください)。
- インデックスデータファイルをメンテナンスしてください。毎月またはそれくらいの頻度でMySQLサーバを停止して、次の myisamchk コマンドを実行することをお勧めします。
#myisamchk -a -S /pathtomysql/data/moodledir/*.MYI
- 警告: MySQL データベースプロセス (mysqld) を必ず停止してください。停止しない場合、データを喪失するリスクがあります。
- ディスクに一時的に保存されるテーブル数を減らしてください。この設定値は、created_tmp_disk_tables で調べることができます。この値が相対的 ( >5% ) に大きい場合、小さくなるよう tmp_table_size の設定値を変更してください。この設定変更は、RAM の使用に影響を及ぼしますので注意してください。
- Moodleの テーブルでは、「MyISAM」フォーマットを使用します。パフォーマンスの向上に繋がらないため、「InnoDB」は無効にしてください。あなたが InnoDB を使用する必要がある場合のみ、すべての Moodle テーブルを変換してください。次の innodb スクリプトで Moodle テーブルを変換することができます:
http://www.mymoodle.com/admin/innodb.php
他のデータベースパフォーマンスリンク
- memcached のような分散型キャッシングシステムの使用を考えてください。memcached の場合、セキュリティ機能はありませんので、ファイアーウォールの背後で使用してください。
- PostgresSQL の使用を考えてください。詳細は、PostgreSQLを使う理由をご覧ください。
- データベース接続持続時間を増やしてみてください。
- General advice on tuning MySQL parameters (MySQL マニュアルのアドバイス)
Moodle 管理設定
- Moodle 1.7以降のバージョンでは、あなたのサーバのキャッシュタイプ (サイト管理 -> サーバ -> パフォーマンス -> キャッシュタイプ) を有効にしてください。ここでは、いくつかのオプションを利用することができます。
- あなたがeAcceleratorまたはmmemcachedをインストールしていない場合、「internal」(レコード/内部キャッシュを使用する - 次の箇条書きをご覧ください) を選択してください。
- あなたが単一のサーバを使用して、eAcceleratorを共有メモリサポートでコンパイルしている場合、キャッシュタイプの「eaccelerator」オプションを選択してください。
- あなたが共有していないmemcachedサーバを使用している場合、キャッシュタイプに「memcached」を選択した後、「memcachedホスト (memcachedhosts)」にカンマ区切りのサーバIPアドレス一覧を入力してください。
- レコード/内部キャッシュを有効にする: サイト管理 -> サーバ -> パフォーマンス -> レコードキャッシュ = True。キャッシュに割り当てる最大メモリ容量を「内部キャッシュ最大値 (intcachemax)」のテキストボックス内で設定してください。この設定により、データベースエンジンキャッシュを使用せずに、データベースレコードの一次キャッシュを有効にすることができます。例) MySQL/PostgreSQLキャッシュ。詳細なディスカッションは、このTrackerエントリをご覧ください。
- 言語キャッシュを有効にしてください。
- 大きなログファイルは、時間と共に全体的なパフォーマンスを落とす要因となります。ブラウザに表示されるページのスピードが徐々に遅くなってきた場合、「サイト管理 > サーバ > クリーンアップ」で「ログの保存期間」を減らしてください。
- Moodle でオペレーティングシステムの「zip/unzip」コマンドを使用することで、PHP ベースの zip ライブラリを使用するより、パフォーマンスを大きく改善することができます。管理 >> 設定 >> 詳細設定で適切なパスを入力してください。同様に「du」のパスを設定することで、Moodle におけるディレクトリコンテンツのリスティングスピードを改善することができます。
- セキュアウェブコネクション (http ではなく https) を使用することで、ウェブサーバおよびクライアントに対して、過大な負荷がかかります。特にキャッシングが効果的に使用されないため、リクエスト数が劇的に増加してしまいます。この理由から、Moodle のすべてのページに対して https を使用することは、お勧めできません。Moodle の設定でログイン画面のみ https を有効にすることはできます。
- あなたの「フィルタ」設定を確認してください。あまりにも多くのフィルタを有効にしていると、特にスペックの低いシステムに深刻な影響を与えます。有効にしているフィルタ数は、それぞれのページ表示に関して、明らかに遅くなるという直接的な影響を及ぼします。
- 「テキストキャッシュ」を有効にしてください。必要な場合以外は「「すべての文字をフィルタする」を有効にしないでください。この設定に疑問がある場合、それぞれの設定を変更して、どのように処理時間に影響を及ぼすか確認してください。
- あなたのサーバの「アンチウイルス」設定を確認してください。これらはセキュリティホールを突かれることを防ぐ「オンデマンド」スキャナーとして有用ですが、ページコンテンツ (word、ppt ファイル等) をスキャニングすることでパフォーマンスに影響を及ぼす可能性があります。
- コースページの表示にパフォーマンスの問題がある場合、管理画面の「モジュール設定」で、リソースの設定を確認してください。リソースの設定で「filterexternalpages」を有効にするとコースページの表示が遅くなります。パフォーマンスを上げるには「No」に設定してください。
- あなたの「フォーラム設定」を確認してください。パフォーマンスを改善するには、「forum_trackreadposts = No」および「forum_usermarksread = Yes」 (この設定はユーザのフォーラム使用の利便性に関して影響を与えます) にしてください。また、利用者が少ない時間帯に、古い投稿を「既読」テーブルからクリアする時刻 (forum_cleanreadtime) を設定してください。
- あなたが本当に必要とする以外、データベースセッションを使用しないでください。どちらかといえば、ディスクセッションの方がはるかに速い傾向にあります。
各 Moodle モジュールのパフォーマンス
Moodle の活動モジュールフィルタおよび他のプラグインは有効/無効にすることができます。必須ではありませんが、必要に応じていくつかの機能 (チャット等) を無効にしてください。各モジュールに関するメモ:
- チャットモジュールは、メインサーバに対して頻繁にHTTPリクエストする点において、大食いだと言われています。管理 >> 設定 >> モジュール管理 >> チャット で、chat_normal_updatemode を「Streame」にするか、chat_method を「Chat サーバデーモン」にすることでサーバに対する負荷を軽減することができます。
- 55名の学生が同時に小テストを使用する場合のパフォーマンスに関する報告 - 英語
- Moodle の cron タスクは、スクリプト cron.php を呼ぶことで動作します。このスクリプトが HTTP 経由で呼ばれた場合 (例 wget または curl を使用)、規模の大きな Moodle サイトでは大量のメモリを消費します。php コマンドを使用して直接呼ばれた場合 (例 php -f /path/to/moodle/directory/admin/cron.php)、大幅に効率が改善されます。
関連情報
- パフォーマンスFAQ
- Using Moodle フォーラム サーバおよびパフォーマンス - 英語
moodle.org には、パフォーマンスに関して数多くのディスカッションが投稿されています。以下、いくつかの興味深い、(潜在的に) 有用な投稿です: