「パフォーマンスおよびスケーラビリティ」の版間の差分

提供:MoodleDocs
移動先:案内検索
編集の要約なし
編集の要約なし
 
(同じ利用者による、間の13版が非表示)
1行目: 1行目:
作成中です - [[利用者:Mitsuhiro Yoshida|Mitsuhiro Yoshida]] ([[利用者・トーク:Mitsuhiro Yoshida|トーク]])
「パフォーマンス」とはMoodleが一定のハードウェアで可能な限り多くのユーザをサポートできるようにすることです。
 
'''パフォーマンス'''とはMoodleが一定のハードウェアで可能な限り多くのユーザをサポートできるようにすることです。


もちろん、あなたはいつでも大きなサーバを購入できます。「スケーラビリティ」とは2倍の性能のサーバを買った場合、2倍の負荷に対応できるようにすることです。
もちろん、あなたはいつでも大きなサーバを購入できます。「スケーラビリティ」とは2倍の性能のサーバを買った場合、2倍の負荷に対応できるようにすることです。
10行目: 8行目:


===すべてのページで決まった数のデータベースクエリしか使用しない===
===すべてのページで決まった数のデータベースクエリしか使用しない===
* ループの中にデータベースコードがある場合、非常に疑ってください。
* ループの中にデータベースコードがある場合、非常に疑ってください。
** これはデータベースアクセスが関数の中に隠されている場合、発見が難しいことがあります。
** これはデータベースアクセスが関数の中に隠されている場合、発見が難しいことがあります。
* 代わりにJOINおよびサブクエリを使用してください (<tt>get_records_sql</tt>, <tt>get_recordset_sql</tt>等)。
* 代わりにJOINおよびサブクエリを使用してください (<tt>get_records_sql</tt>, <tt>get_recordset_sql</tt>等)。
** Or look for a Moodle API function that gets the information you want as efficiently as possible. (For example, <tt>get_users_by_capability</tt>)
** またはあなたが必要としている情報を可能な限り効率的に取得できるMoodle API関数を探してください (例 <tt>get_users_by_capability</tt>)
** またはあなたが必要としている情報を可能な限り効率的に取得できるMoodle API関数を探してください (例 <tt>get_users_by_capability</tt>)。Or look for a Moodle API function that gets the information you want as efficiently as possible. (For example, <tt>get_users_by_capability</tt>)
** 私たちがサポートするすべてのデータベースで動作するSQLの記述方法に関して詳細は[[データベース|データベースガイドライン]]をご覧ください。
** See the [[Database|Database guidelines]] for how to write SQL that will work on all our supported databases.
** 詳細は私たちがサポートするすべてのデータベースで動作するSQLの記述方法に関して[[データベース|データベースガイドライン]]をご覧ください。
 
 
===Limit the amount of RAM each page requires to generate===
 
* Large reports should be broken into pages of a fixed size.
* Processing large amounts of data from the database should be handled with a recordset (when you cannot do all the processing in the database with SQL) and using [https://github.com/moodle/moodle/blob/master/lib/classes/dml/recordset_walk.php recordset_walk iterator], as there is no RAM benefit on using recordsets if you load all the results in a massive PHP array.
 
 
===Be cautious about other external calls===
 
Like a database query, there are other operations that are much slower than just executing PHP code. For example:
* running a shell script
* making a web-service call
* (to a lesser extent) working with files.
Whenever you are doing these things, worry about performance.
 
==How to improve the performance of your code==
 
===Measure during development===


* Turn on [[:en:Debugging#Performance_info|display of performance information]] (including counting database queries), so you are aware of what your code is doing.
===各ページの生成に必要なRAMの容量を制限する===
* 大きなレポートは一定の大きさのページに分割する必要があります。
* データベースから大量のデータを処理する場合、レコードセットを使用して処理する必要があります (あなたがデータベース内のすべての処理をSQLで実行できない場合)。また、[https://github.com/moodle/moodle/blob/master/lib/classes/dml/recordset_walk.php recordset_walk iterator] を使用してください。あなたがすべての結果を大量のPHP配列で読み込む場合、レコードセット使用によるRAMの利点はありません。


* Use tools like [http://jakarta.apache.org/jmeter/ JMeter] to subject your new code to load.
===その他の外部コールに注意する===
データベースクエリのようにPHPコード実行だけよりはるかに遅い処理があります。例えば:
* シェルスクリプトの実行
* ウェブサービスコールの作成
* (それほどではありませんが)ファイル操作
あなたがこれらを実行する場合、必ずパフォーマンスを心配してください。


* Use https://github.com/moodlehq/moodle-performance-comparison (Moodle 2.5 onwards) to compare performance. You can also use the [[Test site generator]] or [[Test course generator]] generators (also Moodle 2.5 onwards).
==あなたのコードのパフォーマンス改善方法==


===開発中の測定===
* あなたのコードが何をしているのか確認するため、[[:en:Debugging#Performance_info|パフォーマンス情報]] (データベースクエリのカウントを含む) を有効にしてください。
* あなたの新しいコードを読み込むために[http://jakarta.apache.org/jmeter/ JMeter]のようなツールを使用してください。
* パフォーマンスを比較するためにhttps://github.com/moodlehq/moodle-performance-comparison (Moodle 2.5 以降) を使用してください。また、[[Test site generator]]または[[Test course generator]]ジェネレータ (これもMoodle 2.5以降) を使用できます。


===Measure in production===
===実運用中の測定===
 
* あなたがPostgreSQLを使用している場合、ログを解析して遅いクエリのトップ10を出力するためのスクリプトがあます。あなたに毎日メールを送信するためcronjobに組み込めます。このスクリプトに関して以下のページをご覧ください:
* If you're using postgres, there's a script that can parse the logs and output the top 10 slow queries, ready to be plugged into a cronjob to email you every day.  It can be found here:  
 
http://git.catalyst.net.nz/gw?p=pgtools.git;a=blob_plain;f=scripts/pg-log-process.pl;hb=refs/heads/pg-log-process-multidb
http://git.catalyst.net.nz/gw?p=pgtools.git;a=blob_plain;f=scripts/pg-log-process.pl;hb=refs/heads/pg-log-process-multidb


You need to configure postgres a bit to make it log things in the correct format.  Instructions are in the file.
あなたが正しいフォーマットでログを記録するためPostgreSQLを少し設定する必要があります。インストラクションはファイル内にあります。
 
==How big can a Moodle site be?==
 
Looking at the [http://moodle.org/stats/ statistics], the largest sites in the world currently have
* Up to 1 000 000 users
* Up to 50 000 courses
* Up to 5 000 users per course
* Up to 50 roles
* Up to 100 course categories nested up to about 10 levels deep.
* Up to XXX activities in a course.
* Please add more things here.


When planning and testing your code, these are the sorts of numbers you should be contemplating. However, do not assume that Moodle sites will never get bigger than this.
==Moodleサイトの規模は?==
[http://moodle.org/stats/ 統計]で確認する限り、現在、世界中での大きなサイトは以下のように記録されています:
* 1 000 000ユーザ以上
* 50 000コース以上
* 1ユーザあたり5 000コース
* 50ロール以上
* 10レベルの深さにネストされた100以上のコースカテゴリ
* コースあたりXXX以上の活動モジュール
* さらにここに追加してください。


Even if you can't test sites this big on your development server, you should use the generator script so you can test your code in a Moodle site that is not tiny.
あなたのコードを計画およびテストする場合、このような数字を考慮する必要があります。しかし、Moodleサイトがこれより大きくなることはないと考えないでください。


あなたの開発サーバでこれほど大きなサイトをテストできない場合でも、あなたのコードを小さくないMoodleサイトでテストできるようジェネレータスクリプトを使用すべきです。


==関連情報==
==関連情報==


* [[Coding|Moodle coding guidelines]]
* [[コーディング|Moodleコーディングガイドライン]]
* [[Performance]] guidance for administrators
* [[パフォーマンス]] 管理者のためのガイダンス
* [[Performance FAQ]]
* [[パフォーマンスFAQ]]


[[Category:コーディングガイドライン|パフォーマンス]]
[[Category:コーディングガイドライン|パフォーマンス]]


[[en:Development:Performance_and_scalability]]
[[en:Development:Performance_and_scalability]]

2022年2月18日 (金) 15:00時点における最新版

「パフォーマンス」とはMoodleが一定のハードウェアで可能な限り多くのユーザをサポートできるようにすることです。

もちろん、あなたはいつでも大きなサーバを購入できます。「スケーラビリティ」とは2倍の性能のサーバを買った場合、2倍の負荷に対応できるようにすることです。

このページはMoodleコーディングガイドラインの一部です。

スケールおよびパフォーマンスのためのコードを書く

すべてのページで決まった数のデータベースクエリしか使用しない

  • ループの中にデータベースコードがある場合、非常に疑ってください。
    • これはデータベースアクセスが関数の中に隠されている場合、発見が難しいことがあります。
  • 代わりにJOINおよびサブクエリを使用してください (get_records_sql, get_recordset_sql等)。
    • またはあなたが必要としている情報を可能な限り効率的に取得できるMoodle API関数を探してください (例 get_users_by_capability)。
    • 私たちがサポートするすべてのデータベースで動作するSQLの記述方法に関して詳細はデータベースガイドラインをご覧ください。

各ページの生成に必要なRAMの容量を制限する

  • 大きなレポートは一定の大きさのページに分割する必要があります。
  • データベースから大量のデータを処理する場合、レコードセットを使用して処理する必要があります (あなたがデータベース内のすべての処理をSQLで実行できない場合)。また、recordset_walk iterator を使用してください。あなたがすべての結果を大量のPHP配列で読み込む場合、レコードセット使用によるRAMの利点はありません。

その他の外部コールに注意する

データベースクエリのようにPHPコード実行だけよりはるかに遅い処理があります。例えば:

  • シェルスクリプトの実行
  • ウェブサービスコールの作成
  • (それほどではありませんが)ファイル操作

あなたがこれらを実行する場合、必ずパフォーマンスを心配してください。

あなたのコードのパフォーマンス改善方法

開発中の測定

  • あなたのコードが何をしているのか確認するため、パフォーマンス情報 (データベースクエリのカウントを含む) を有効にしてください。
  • あなたの新しいコードを読み込むためにJMeterのようなツールを使用してください。
  • パフォーマンスを比較するためにhttps://github.com/moodlehq/moodle-performance-comparison (Moodle 2.5 以降) を使用してください。また、Test site generatorまたはTest course generatorジェネレータ (これもMoodle 2.5以降) を使用できます。

実運用中の測定

  • あなたがPostgreSQLを使用している場合、ログを解析して遅いクエリのトップ10を出力するためのスクリプトがあます。あなたに毎日メールを送信するためcronjobに組み込めます。このスクリプトに関して以下のページをご覧ください:

http://git.catalyst.net.nz/gw?p=pgtools.git;a=blob_plain;f=scripts/pg-log-process.pl;hb=refs/heads/pg-log-process-multidb

あなたが正しいフォーマットでログを記録するためPostgreSQLを少し設定する必要があります。インストラクションはファイル内にあります。

Moodleサイトの規模は?

統計で確認する限り、現在、世界中での大きなサイトは以下のように記録されています:

  • 1 000 000ユーザ以上
  • 50 000コース以上
  • 1ユーザあたり5 000コース
  • 50ロール以上
  • 10レベルの深さにネストされた100以上のコースカテゴリ
  • コースあたりXXX以上の活動モジュール
  • さらにここに追加してください。

あなたのコードを計画およびテストする場合、このような数字を考慮する必要があります。しかし、Moodleサイトがこれより大きくなることはないと考えないでください。

あなたの開発サーバでこれほど大きなサイトをテストできない場合でも、あなたのコードを小さくないMoodleサイトでテストできるようジェネレータスクリプトを使用すべきです。

関連情報