パフォーマンス
再作成中です - Mitsuhiro Yoshida 2007年10月24日 (水) 01:44 (CDT)
少人数のユーザ、数千名のユーザでも、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倍の設定値をお勧めします (この設定値には賛否両論あります - 吉田光宏)。
- 「RAIDディスクシステム」を使用してください。サーバコンピュータに対して、多くの異なるRAID設定を行うことができますが、下記の設定は一般的に最も良く動作します:
- 可能であればハードウェアRAIDコントローラーをインストールしてください (ソフトウェアRAID、ハードウェアRAIDに関する意見も多々あります - 吉田光宏)。
- 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を無効にしてください。
- Leave HostnamesLookups Off (as default) to reduce DNS latency.
- Consider reducing the value of TimeOut to between 30 to 60 (seconds).
- For the Options directive, avoid Options Multiviews as this performs a directory scan. To reduce disk I/O further use
Options -Indexes FollowSymLinks
- Caching - Apache can be told to make pages load a lot faster by specifying that the browser should cache some various page elements such as images and reuse them from local memory rather than ask for them again every time a page is requested. How to do this varies slightly between OSes but there are two basic steps:
- Install and enable mod_expires - refer to documentation or man pages
- Add this code to the virtual server config file within the <directory> section for the root directory (or within the .htaccess file if AllowOverrides is On):
<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>
The effect is to make everything stay in the cache except HTML and XML, which change dynamically. It's possible to gain a several hundred percent decrease in load times this way. Adjust the cache times according to how often your images etc change.
More info: www.metaskills.net
- Alternatively, you can increase web server performance by using the light-weight webserver lighttpd in combination with PHP in fastCGI-mode instead of Apache. Lighttpd has a lower memory consumption than Apache. One single apache process requires more RAM than the whole lighttpd with all of its fastCGI-processes together. Note that Lighttpd is relatively difficult to configure and administration takes a more time.
IISパフォーマンス
All alter this location in the registry:
HKLM\SYSTEM\CurrentControlSet\Services\Inetinfo\Parameters\
- The equivalent to KeepAliveTimeout is ListenBackLog (IIS - registry location is HKLM\ SYSTEM\ CurrentControlSet\ Services\ Inetinfo\ Parameters). Set this to between 2 to 5.
- Change the MemCacheSize value to adjust the amount of memory (Mb) that IIS will use for its file cache (50% of available memory by default).
- Change the MaxCachedFileSize to adjust the maximum size of a file cached in the file cache in bytes. Default is 262,144 (256K).
- Create a new DWORD called ObjectCacheTTL to change the length of time (in milliseconds) that objects in the cache are held in memory. Default is 30,000 milliseconds (30 seconds).
ウェブサーバパフォーマンス
- PHPパフォーマンス
- CPUロードを軽減するAPC (推奨)、PHPA、XcacheまたはeAcceleratorのような「PHPアクセラレータ」の使用を強くお勧めします。PHPページのキャッシュをTMPFSファイルシステムに置いてください。
- CGIとしてインストールするより「Apache/IIS ISAPIモジュール」としてインストールする方が、PHPのパフォーマンスは良くなります。
- ご利用のMoodleが1.7より以前のバージョンの場合、php.iniの「memory_limit」を確認して、16Mに減らしてください (詳細はこのフォーラムディスカッションをご覧ください)。Moodle 1.7以降では、「memory_limit」を32Mに設定することをお勧めします。
- Apacheパフォーマンス
- 使用メモリーを減らすために、httpd.confファイルでロードする「モジュール数」を可能な限り減らすことを考慮してください。また、さらに使用メモリーを減らすことのできる最新バージョンのApache 2の使用もお考えください。
- Unix/Linuxシステムでは、httpd.confの「MaxRequestsPerChild」を20~30くらいに下げることをお考えください。この設定をさらに低くすると、forkのオーバーヘッドがメリットを上回ることになります。
- 負荷が高いサーバでは、「KeepAliveTimeout」を2~5の間に下げることをお考えください。デフォルトは15 (秒) です - この値を高くすると、それに応じてサーバプロセスがアイドルコネクションを待つことになります。
- 代わりに「ライトウェイトウェブサーバ」lighttpdとfastCGIモードのPHPを使用することにより、ウェブサーバのパフォーマンスを向上させることができます。Apacheに比べてLighttpdでは、メモリー消費を抑えることができます。fastCGIとlighttpdを合わせたプロセスより、1つのapacheプロセスの方がより多くのRAMを必要とします。注意: Lighttpdは相対的に設定および管理が難しく、Apacheよりも多くの時間を必要とします。
- 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管理設定
- language cache を有効にしてください。
- 大きなログファイルは、時間と共に全体的なパフォーマンスを落とす要因となります。ブラウザに表示されるページのスピードが徐々に遅くなってきた場合は、管理画面で「ログの保存期間」を減らしてください。
- Moodle 1.7またはそれ以上のバージョンでは、「レコードキャッシュ」を有効にしてください。「レコードキャッシュ」は一次キャッシュとして動作し、データベースアクセスパフォーマンスを改善することができます。
- Moodleでオペレーティングシステムの「zip/unzip」コマンドを使用することで、PHPベースのzipライブラリを使用するより、パフォーマンスを大きく改善することができます。管理 >> 設定 >> 詳細設定で適切なパスを入力してください。同様に「du」のパスを設定することで、Moodleにおけるディレクトリコンテンツのリスティングスピードを改善することができます。
- セキュアウェブコネクション ('httpではなくhttps) を使用することで、ウェブサーバおよびクライアントに対して、過大な負荷がかかります。特にキャッシングが効果的に使用されないため、リクエスト数が劇的に増加してしまいます。この理由から、Moodleのすべてのページに対してhttpsを使用することは、お勧めできません。Moodleの設定でログイン画面のみhttpsを有効にすることはできます。
- あなたの「フィルタ」設定を確認してください。あまりにも多くのフィルタを有効にしていると、特にスペックの低いシステムに深刻な影響を与えます。有効にしているフィルタの数は、それぞれのページ表示に関して、明らかに遅くなるという直接的な影響を及ぼします。
- 「テキストキャッシュ」を有効にしてください。必要な場合以外は「「すべての文字をフィルタする」を有効にしないでください。この設定に疑問がある場合は、それぞれの設定を変更して、どのようjに処理時間に影響を及ぼすか確認してください。
- あなたのサーバの「アンチウイルス」設定を確認してください。これらはセキュリティホールを突かれることを防ぐ「オンデマンド」スキャナーとして有用ですが、ページコンテンツ (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)、大幅に効率が改善されます。
関連情報
- Using Moodleフォーラム サーバおよびパフォーマンス (英文)