MOODLE的性能和可伸縮性

這篇文檔是如何提高moodle(魔燈)性能【performance】和可伸縮性【performance】的編碼指南。

性能【performance】是指允許Moodle(魔燈)使用一定數(shù)量的硬件支持盡可能多的用戶。
當(dāng)然,你總是可以購買更大的服務(wù)器??缮炜s性【scalability】意味著,如果你購買的服務(wù)器的功能是原來的兩倍,那么它可以處理兩倍的負(fù)載。

編寫可擴(kuò)展和執(zhí)行的代碼

每個(gè)頁面應(yīng)該只使用固定數(shù)量的數(shù)據(jù)庫查詢

  • 如果在循環(huán)中看到數(shù)據(jù)庫訪問操作,一定要保持警惕。如果數(shù)據(jù)庫訪問隱藏在函數(shù)中,有時(shí)很難發(fā)現(xiàn)這一點(diǎn)。
  • 使用聯(lián)接【JOINs】和子查詢(get_records_sql、get_recordset_sql等)而不是循環(huán)執(zhí)行多個(gè)查詢。
  • 或者找到一個(gè)Moodle API函數(shù),盡可能高效地獲取您想要的數(shù)據(jù)。(例如,get_users_by_capability)。
  • 了解如何編寫適用于所有受支持?jǐn)?shù)據(jù)庫的SQL,參考官方的《數(shù)據(jù)庫指南》【Database guidelines】文檔。

限制每個(gè)頁面在生成時(shí)所需的內(nèi)存大小

  • 大型報(bào)表應(yīng)該按固定大小的頁面進(jìn)行分頁。
  • 當(dāng)您無法使用SQL在數(shù)據(jù)庫中完成所有業(yè)務(wù)操作時(shí),處理來自數(shù)據(jù)庫的大量數(shù)據(jù),應(yīng)該使用記錄集,并使用recordset_walk迭代器(moodle/lib/classes/dml/recordset_walk.php),避免將所有結(jié)果加載到大型PHP數(shù)組中消耗內(nèi)存。

警惕外部調(diào)用【external call】

與數(shù)據(jù)庫查詢一樣,還有其他操作比只執(zhí)行PHP代碼慢得多。例如:

  • 運(yùn)行shell腳本;
  • 進(jìn)行web服務(wù)調(diào)用;
  • 處理文件(程度較輕)。

無論何時(shí)做這些事情,都要注意性能問題。

限制會(huì)話鎖【session locks】的范圍

如果您不需要會(huì)話鎖,或者只需要在頁面的一部分使用它,請(qǐng)解鎖會(huì)話。

如何提高代碼的性能

在開發(fā)過程中評(píng)估性能

  • 啟用顯示性能信息【Performance info】(包括數(shù)據(jù)庫查詢操作計(jì)數(shù))。管理員登錄后,在 網(wǎng)站管理->開發(fā)->調(diào)試 中勾選perfdebug配置項(xiàng)。勾選性能信息設(shè)置項(xiàng),將在標(biāo)準(zhǔn)主題【theme】(以及其他一些主題)的頁腳中顯示如下性能信息:頁面加載時(shí)間、用于生成頁面的內(nèi)存量、cpu使用率、負(fù)載、記錄緩存的命中/未命中率。如果需要對(duì)數(shù)據(jù)庫查詢操作計(jì)數(shù),還需要在config.php中加入如下代碼:
// Capture performance profiling data 
define('MDL_PERF', true);
// Capture additional data from DB
define('MDL_PERFDB', true);
// Print to log (error_log(),for passive profiling of production servers)
define('MDL_PERFTOLOG', true);
// Print to footer (works with the default theme)
define('MDL_PERFTOFOOT', true);

小技巧:如果希望只對(duì)站點(diǎn)管理員顯示性能信息,可以在適當(dāng)?shù)奈恢茫ū热绮季猪撁娴捻敳浚?,加入如下代碼:

if (is_siteadmin()) {
    $CFG->perfdebug = 8;
}
  • 使用JMeter(https://jmeter.apache.org/)等工具對(duì)新代碼做壓力測(cè)試。
  • 使用https://github.com/moodlehq/moodle-performance-comparison (moodle 2.5及以上版本)比較Moodle的性能。您還可以使用測(cè)試站點(diǎn)生成器【Test site generator】或測(cè)試課程生成器【Test course generator】(Moodle 2.5及以上版本)。

在運(yùn)行中評(píng)估性能

如果你使用postgres,有一個(gè)腳本可以解析日志并輸出最慢的10個(gè)數(shù)據(jù)庫查詢,隨時(shí)可以插入cronjob并每天給你發(fā)電子郵件。腳本可以在這里找到:

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

需要對(duì)postgres進(jìn)行一些配置,使其以正確的格式記錄內(nèi)容。

MySQL數(shù)據(jù)庫有?個(gè)配置選項(xiàng)可以幫助我們及時(shí)捕獲慢SQL語句:

# 開啟日志記錄慢查詢
slow_query_log = ON
# 閾值,記錄執(zhí)行時(shí)間超過2秒的慢查詢
long_query_time = 2
# 指定日志文件
slow_query_log_file = path/to/log/file/slowquery.log
# 記錄不使用索引查詢,即使查詢效率不慢
log_queries_not_using_indexes = ON
# 記錄數(shù)據(jù)庫管理SQL中慢sql
log-slow-admin-statements = ON

Moodle(魔燈)網(wǎng)站能支持多大負(fù)荷

從統(tǒng)計(jì)數(shù)據(jù)來看,目前世界上最大的Moodle(魔燈)站點(diǎn)

  • 多達(dá)100萬用戶
  • 多達(dá)5萬門課程
  • 每門課程多達(dá)5000名用戶
  • 多達(dá)50個(gè)角色
  • 多達(dá)100個(gè)課程類別,嵌套深度約為10級(jí)。
  • 課程中多達(dá)XXX項(xiàng)活動(dòng)。
  • 更多內(nèi)容。。。

在規(guī)劃和測(cè)試代碼時(shí),這些是您應(yīng)該考慮的數(shù)字。然而,不要認(rèn)為Moodle(魔燈)網(wǎng)站永遠(yuǎn)不會(huì)比這更大。
即使不能在開發(fā)服務(wù)器上測(cè)試這么大的站點(diǎn),也應(yīng)該使用生成器腳本,這樣就可以在一個(gè)不小的Moodle(魔燈)站點(diǎn)上測(cè)試代碼。

發(fā)表評(píng)論

您的電子郵箱地址不會(huì)被公開。 必填項(xiàng)已用*標(biāo)注