Moodle高速化 - RとLinuxと...

RとLinuxと...


Moodle高速化

パフォーマンス 出典: MoodleDocs? 移動: メニュー, 検索

少人数のユーザ、数千名のユーザでも、Moodleは快適に稼動させることができます。パフォーマンスに関係する要素は、基本的に他のPHPベースのデータベース主導型システムと同じです。あなたのサーバを最適化するには「ユーザ数の多寡が大きな要素となること」に焦点を置いてください。例えば、相対的にみて、データベースにアクセスするユーザよりも閲覧するユーザが多い場合、ウェブサーバのパフォーマンスを改善してください。 目次 [非表示]

  • 1 ベンチマークのベースラインを取得する
  • 2 スケーラビリティ (拡張性)
  • 3 ハードウェア設定
  • 4 オペレーティングシステム
  • 5 ウェブサーバパフォーマンス
             o 5.1 PHPパフォーマンス
             o 5.2 Apacheパフォーマンス
             o 5.3 IISパフォーマンス
  • 6 データベースパフォーマンス
             o 6.1 MySQLパフォーマンス
             o 6.2 他のデータベースパフォーマンスリンク
  • 7 Moodle管理設定
  • 8 各Moodleモジュールのパフォーマンス
  • 9 関連情報

ベンチマークのベースラインを取得する

最適化を試みる前に、あなたが改善しようと考えるシステムコンポーネントに関するベンチマークのベースラインを取得してください。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設定を行うことができますが、下記の設定は一般的に最も良く動作します:
             o 可能であればハードウェアRAIDコントローラーをインストールしてください (ソフトウェアRAID、ハードウェアRAIDに関する意見も多々あります - 吉田光宏)。
             o RAID-1に設定して、オペレーティングシステムとスワップを同じドライブに設定してください。
             o Moodle、ウェブサーバおよびデータベースをRAID-5に設定した別々のディスクに入れてください。 
  • 遅延時間およびスループットを改善するため、「ギガビットイーサーネット」を使用してください。あなたがウェブサーバおよびデータベースサーバを分離して運用している場合、これは特に大切です。
  • あなたの「ネットワークカード」の設定を確認してください。バッファおよびトランスミット/レシーブディスクリプタを増やすこと (これはプロセッサとメモリのオーバヘッドとのバランスをとってください)、TCPチェックサムの計算をOSではなくカードにオフロードすることでパフォーマンスを改善することができます。

オペレーティングシステム

  • あなたはサーバの「オペレーティングシステム」として、Linux (お勧めです) 、UnixベースのOS、Windows、Mac OS Xを使用することができます。シェルインターフェースのみで構成された場合、一般的に*nixオペレーティングシステムは同じタスクの処理に関して、 Mac OS XまたはWindowsサーバよりも少ないメモリを必要とします。さらにLinuxにはライセンス料が発生しませんが、あなたが他のオペレーティングシステムを日常的に使用している場合、Linuxコマンド等の習得に大きな学習曲線を描くことになります。サーバがSMPで動作している大量のプロセッサを持っている場合、高度にチューニングされたSolarisのようなOSの使用を考えてみてください。
  • 最適化するには、OSおよび「サーバ製造元の使用説明書」を確認してください。
             o Linuxに関しては、Linux Performance Teamサイトをご覧ください。
             o Linuxではhdparmコマンドでハードディスクの状態を詳細に調べることができます。例) hdparm -m16 -d1 でマルチセクタのread/writeを有効にできます。DMAマウントのディスクには、asyncおよびnoatimeオプションを付けてください。
             o 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つの基本的なステップがあります:
  1. mod_expiresをインストールおよび有効化してください - 詳細はドキュメントまたはmanページをご覧ください。
  2. 次のコードをバーチャルサーバの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管理設定

  • language cache を有効にしてください。
  • 大きなログファイルは、時間と共に全体的なパフォーマンスを落とす要因となります。ブラウザに表示されるページのスピードが徐々に遅くなってきた場合、管理画面で「ログの保存期間」を減らしてください。
  • Moodle 1.7またはそれ以上のバージョンでは、「レコードキャッシュ」を有効にしてください。「レコードキャッシュ」は一次キャッシュとして動作し、データベースアクセスパフォーマンスを改善することができます。
  • 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)、大幅に効率が改善されます。
 
Link: Linuxの備忘録(2535d)
Last-modified: 2009-09-05 (土) 15:36:34 (3388d)