


摘 要: Moodle 2需要運行在PHP 5.3平臺上,如何利用PHP 5.3通過PHP-FPM服務器管理PHP FastCGI進程的特性來提升Moodle 2系統性能是一個亟待解決的關鍵問題。為此,提出了一種基于LNMP的Moodle 2分布式計算架構,并成功研制出樣機。經功能測試和性能測試表明,該系統較單服務器系統提高了5倍的并發訪問能力,而CPU使用率卻降低了26.2%,實現了Moodle 2的高并發和高速訪問,并具有負載均衡、彈性伸縮和容錯性強的特點,為PHP系統特別是Moodle 2系統的大規模推廣應用提供了重要技術參考。
關鍵詞: Moodle; LNMP; 分布式系統; 高并發; 高性能
中圖分類號:TP302.7 文獻標志碼:A 文章編號:1006-8228(2013)06-05-04
Moodle 2 distributed computing architecture based on LNMP
Zeng Zonggen
(Electronic Information Engineering Department, Ningbo Polytechnic, Ningbo, Zhejiang 315800, China)
Abstract: Moodle 2 operates on PHP 5.3 platform. It is an urgent problem how to use PHP 5.3's characteristic of PHP-FPM server managing PHP FastCGI process to enhance the Moodle system performance. Moodle 2 distributed computing architecture based on LNMP is proposed. A prototype is developed successfully. The functional testing and performance testing show that five-fold increase concurrent access capability is obtained compared to the single-server systems, while CPU usage is reduced by 26.2%. Moodle 2's high concurrency and high-speed access are achieved, together with characteristics of balance, flexibility, fault-tolerance, which provides an important technical reference for PHP system and especially for the Moodle system's large-scale application.
Key words: Moodle; LNMP; distributed system; high concurrency; high performance
0 引言
Moodle 2是澳大利亞Martin Dougiamas博士主持研發的第二代Moodle免費開源網絡課程平臺[1],其功能之強大使得在全球范圍內掀起了一股Moodle 2升級、應用熱潮。
但由于Moodle 2要求運行在PHP 5.3以上,而PHP 5.3是PHP技術發展的分水嶺,它采用PHP-FPM[2]服務方式管理PHP FastCGI進程,如何利用這一特性來有效提高Moodle 2訪問速度和并發處理能力是一個亟待解決的關鍵問題。
本文經過深入研究與實驗,成功研制出一種Moodle分布式計算架構,使用源代碼編譯方式成功編譯、安裝、優化了LNMP[3],并在LNMP上安裝了Moodle 2系統,樣機連接地址為http://61.164.87.150:5483/,經httperf測試證實,該樣機實現了Moodle 2的高性能。
1 Moodle 2分布式計算架構
Moodle過去多運行在WAMP[4]或LAMP[5]架構上,性能方面表現得總是不太理想。而采用LNMP分布式計算架構,即CentOS+Nginx+MySQL+PHP,能有效解決上述問題,主要原因:
⑴ 高并發下CentOS操作系統(Linux 2.6+內核)的epoll網絡模型CPU利用率較Windows操作系統僅有的select網絡模型高很多[6];
⑵ Nginx是由俄羅斯人Igor Sysoev設計的開源、高并發HTTP和反向代理服務器[7],據業界測算,它可支持單臺服務器超過3萬的純PHP腳本并發訪問,性能超過Apache服務器的10倍之多;
⑶ PHP 5.3以FastCGI這一目前公認為效率最高的方式運行,并由PHP-FPM服務器集中管理,實現了PHP高效率、高并發和分布式處理,其通信示意圖[8]如圖1所示。
圖1 Nginx+PHP-FPM通信示意圖
圖1中,如果客戶端瀏覽器發出HTML請求,則Nginx直接將HTML文件發送給客戶端;如果客戶端瀏覽器發出PHP請求,則Nginx將此請求轉發給PHP-FPM服務去處理,PHP-FPM服務與MySQL數據庫服務通信,處理完成后,PHP-FPM將處理結果以HTML的形式返回給Nginx服務,Nginx服務再把此HTML文檔返回給客戶端瀏覽器。
⑷ 由于Nginx、PHP-FPM和MySQL都是獨立的服務,所以可以將這幾個服務分別安裝在不同物理服務器上,分攤單臺服務器的負載,這就實現了分布式和高性能的Moodle。
研究表明,PHP處理是高性能LNMP的瓶頸,因此,應安裝多臺PHP-FPM服務器,以實現PHP-FPM負載均衡[9],并安裝NFS文件服務器來同步PHP文件和session共享(也可將session寫到數據庫中來解決session共享問題),統一訪問同一臺MySQL數據庫。圖2為本文提出的分布式LNMP架構。
圖2 分布式LNMP架構示意圖
圖2的分布式計算架構中,Moodle的程序文件分別拷貝在每臺PHP-FPM服務器中,Moodle的數據文件即moodledata文件夾放在NFS文件服務器中供所有PHP-FPM服務器共享,Moodle的數據庫則存放在MySQL服務器中供所有PHP-FPM服務器統一調用,而Moodle的session則保存在MySQL數據庫中。當用戶訪問Moodle網站時,PHP請求被Nginx服務器接收后,它的upstream模塊按輪詢方式將此請求發送給一臺PHP-FPM服務器去處理,或采用ip_hash方式確定一個訪問者發出的請求總是由一臺固定的PHP-FPM服務器來處理,例如:
Upstream phpfpm {
ip_hash; //如果采用輪詢方式選擇PHP-FPM服務器則注釋掉此行
server 192.168.0.50:9000; //PHP-FPM
server 192.168.0.51:9000; //PHP-FPM
server 192.168.0.52:9000; //PHP-FPM
}
PHP-FPM服務器接收到PHP請求后,則編譯執行本機中的Moodle程序,如果需要存取Moodle數據就從NFS文件服務器中的moodledata程序文件中去存取文件,如果需要存取數據庫就去訪問MySQL數據庫服務器,最后,PHP-FPM服務器把運行結果以HTML方式返回給Nginx服務器,Nginx服務器則將結果返回給客戶端瀏覽器,完成一次Moodle請求。
2 編譯安裝LNMP架構和Moodle 2
確定了分布式架構后,需要在服務器中將LNMP架構和Moodle程序安裝好。由于Moodle 2需要LNMP架構特定模塊支持,必須采用編譯LNMP各部件源代碼方式來安裝LNMP架構而不能安裝二進制發行版。另外,通過本機編譯源碼方式安裝的部件會更好地發揮硬件性能。本文采用的部件及版本如表1所示。
表1 LNMP架構各部件版本一覽表
[部件\&文件名或版本要求\&CentOS\&i386 ,6.2版,32位\&MySQL\&mysql-5.5.19.tar.gz\&mysqlcc\&mysqlcc-1.0.1-fc14.1.i686.rpm\&PCRE\&pcre-8.30.zip\&Nginx\&nginx-1.2.4.tar.gz stable穩定版\&PHP\&php-5.4.8.tar.gz\&eAccelerator\&eaccelerator-42067ac.tar.gz for php 5.4\&Moodle\&moodle-latest-22.tgz\&]
由于編譯安裝LNMP架構和部署Moodle程序是Linux程序員的基本功,本節對此過程不再贅述,讀者可以參考LNMP一鍵安裝包官方網站http://lnmp.org/或張宴老師的博文《Nginx 0.8.x+PHP 5.2.13(FastCGI)搭建勝過Apache十倍的Web服務器(第6版)》[10]。
3 優化LNMP架構參數
編譯安裝好LNMP和Moodle 2后,還需要對各項服務進行優化,使得服務器性能得以充分發揮。優化服務器的主要思路是:調高系統參數、關閉不必要的日志讀寫、使用緩存、使用加速器等。
3.1 Linux內核優化方法[11]
⑴ 調高Linux內核打開文件數量為102400。
Linux默認打開文件數是1024,調高linux內核打開文件數量(必須是root帳號):
a、在/etc/profile文件最后加上:ulimit -HSn 102400
b、在/etc/rc.local文件最后加上:ulimit -HSn 102400
c、在/etc/security/limits.conf文件最后添加下面兩行內容(CentOS 6.2需要在此文件里修改,否則無效):
* hard nofile 102400
* soft nofile 102400
d、在/usr/include/bits/typesizes.h文件中,修改__FD_SET_SIZE宏定義值為102400。
⑵ 調整單個用戶最多擁有的進程數。
a、在/etc/security/limits.conf文件最后添加下面兩行內容
* hard nproc 102400
* soft nproc 102400
b、在/etc/security/limits.d/90-nproc.conf文件中修改soft nproc為102400。
⑶ 優化Linux內核的TCP選項,增加以下設置:
net.ipv4.tcp_max_syn_backlog=65536
net.core.netdev_max_backlog=32768
net.core.somaxconn=32768
net.core.wmem_default=8388608
net.core.rmem_default=8388608
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_timestamps=0
net.ipv4.tcp_synack_retries=2
net.ipv4.tcp_syn_retries=2
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_mem=94500000 915000000 927000000
net.ipv4.tcp_max_orphans=3276800
net.ipv4.ip_local_port_range=1024 65535
3.2 MySQL優化方法
⑴ 使用my-innodb-heavy-4G.cnf作為生產環境下的配置文件。
⑵ 調整/etc/my.cnf中的幾個參數,增加數據庫的打開文件數量和各種緩存:
open_files_limit=10240
back_log=600
max_connections=5000
max_connect_errors=6000
table_open_cache=2048
max_allowed_packet=32M
thread_cache_size=300
query_cache_size=64M
innodb_buffer_pool_size=2G
innodb_thread_concurrency=16
3.3 Nginx優化方法
⑴ 訪問日志會造成頻繁磁盤訪問并占用大量磁盤空間,對于Moodle這樣的安全性要求并不是非常苛刻的應用,應當關閉Nginx訪問日志,或者定時切割Nginx訪問日志(如每天0點0分切割一次),以避免單個日志文件太大而影響系統性能。
⑵ 使用epoll網絡I/O模型,epoll網絡模型只內建于Linux內核2.6以上的OS中。該模型有別于Windows操作系統上僅有的select網絡模型,在高并發連接下,CPU利用率會提高很多。
⑶ 打開keepalive_timeout,使TCP連接保持65秒,連續訪問時避免頻繁重建連接。
⑷ 充分發揮CPU多核心性能,指定Nginx的工作進程數worker_processes,一般為總核數或總核數的兩倍,這里的總核數是指CPU線程總數。
⑸ 開啟Nginx的gzip壓縮功能,提高傳輸速度,改善用戶體驗。啟用gzip壓縮后,Nginx在向客戶端傳送網站的.html的文件、.css和.js等文件時,會先采用gzip壓縮,使文件體積大為減小,傳輸耗時就少了,而常用的客戶端瀏覽器都內建了gzip解壓縮程序,會自動解壓。
3.4 PHP-FPM優化方法
⑴ 指定PHP-FPM允許打開最多文件數,將rlimit_files設為102400,這個參數與Linux內核參數要吻合。
⑵ 根據每個PHP FastCGI進程大約消耗20MB內存計算,4GB內存可一次性開啟128個PHP FastCGI進程,并行等待客戶端PHP腳本請求。指定PHP-FPM以靜態方式創建PHP FastCGI進程,一次性啟動128個PHP FastCGI進程,再設置每個進程在重置之前能夠執行的最多請求數為65535。在終端通過鍵入#pstree命令,可以查看到PHP-FPM服務靜態創建的PHP FastCGI進程的數量為128個,如圖3所示。
圖3 PHP-FPM服務靜態創建的PHP FastCGI進程
3.5 PHP優化方法
使用eAccelerator for PHP 5.4來對PHP進行加速。eAccelerator是一個自由開放源碼的PHP加速器,通過動態內容緩存,使PHP腳本在編譯的狀態下,對服務器的開銷幾乎完全消除。它還能優化腳本,以加快其執行效率,使PHP腳本執行效率能提高1~10倍[12]。
安裝好eAccelerator后,重新啟動PHP-FPM和Nginx,再運行phpinfo.php程序,可以看見這條信息,說明eAccelerator生效了:with eAccelerator v1.0-dev, Copyright (c) 2004-2012 eAccelerator, by eAccelerator。
4 樣機性能測試
經過上述的編譯、安裝和優化,成功研制了LNMP + Moodle 2服務器樣機,網址為http://61.164.87.150:5483/。該服務器硬件配置如表2所示。
表2 Moodle 2服務器樣機硬件配置
[硬件\&參數\&內存\&4GB\&處理器0\&Intel(R) Core(TM) i5-2400S CPU @2.50GHZ\&處理器1\&Intel(R) Core(TM) i5-2400S CPU @2.50GHZ\&處理器2\&Intel(R) Core(TM) i5-2400S CPU @2.50GHZ\&處理器3\&Intel(R) Core(TM) i5-2400S CPU @2.50GHZ\&]
4.1 功能測試
經過三個月“JAVA程序設計”網絡課程的教學使用證實,該樣機在開設課程、上傳用戶、注冊用戶、用戶授權、上傳文件、上傳圖像、上傳用戶、討論板、作業模塊、考試模塊、主題選擇、郵件自動發送、模塊升級和卸載等方面都能正常使用,無任何bug, Moodle 2軟件質量非常高,系統響應速度也非常快,無任何延遲感,學生普遍反映非常滿意。
4.2 性能測試
采用HP實驗室研發的服務器負載測試工具httperf[13]對單服務器和分布式服務器樣機進行對比測試。
【測試樣例】#httperf --server 10.61.0.2 --port 80 --uri/index.php --rate 100 --num-conn 1000 --num-call 1 --timeout 5。
【測試含義】測試機以每秒100個并發連接的速度向服務器(服務器的IP是<10.61.0.2>,端口為80)發起連接(Connection),每個連接產生1個請求(Request),請求的網頁是index.php,如果此連接5秒內還未從服務器返回處理結果,就記為一次錯誤(連接失敗),共要完成1000個連接。
測試結果見表3。
表3 單服務器與分布式服務器性能測試對比表
[ \&單服務器\&分布式服務器\&完成總連接(個)\&230\&1500\&連接速度(連接數/秒)\&18.1\&107.3\&CPU用戶時間(秒)\&5.12\&1.97\&CPU系統時間(秒)\&7.6\&12.01\&]
從以上的對比測試可以看出,在同等條件下,采用單服務器部署方式,Moodle系統平均每秒僅能處理18.1個有效請求,CPU用戶時間占用率高達40.3%;而采用分布式計算的部署方式,Moodle系統平均每秒能處理107.3個有效請求,CPU用戶時間占用率卻低至14.1%。由此可以看出,此分布式系統較單服務器系統并發處理能力提高了近5倍,而CPU用戶時間卻降低了26.2%,系統非常輕松,響應敏捷。
5 結束語
本文在PHP 5.3最新技術的基礎上,提出了一種基于LNMP的Moodle 2分布式計算架構,研制出了一套樣機,并經過了實踐檢驗和服務器負載測試,證明該系統性能得到了很大提升,并具有容錯功能和彈性伸縮的特征。當一臺PHP-FPM服務器當機時,并不會影響整套系統的正常運行;隨著系統應用規模的逐步擴大,還能夠任意將新的PHP-FPM服務器接入到該系統中,分擔計算負載,實現彈性伸縮。限于目前實驗條件所限,本文只針對3臺PHP-FPM服務器進行了實驗。
另外需要指出的是,本文研制的由1臺Nginx服務器、3臺PHP-FPM服務器、1臺NFS文件服務器和1臺MySQL服務器等6臺2核心4線程的服務器組成的Moodle 2分布式計算系統,每秒能處理107.3個有效請求,按以10秒產生一次做題請求來計算,該系統能支持至少1073個學生同時在線考試,能滿足一所2000~3000人訪問的中等學校的應用需求。如果要滿足一所上萬人大學的使用需求,那就需要增加服務器的硬件性能(如CPU超過24線程)和PHP-FPM服務器數量,具體數量應當以httperf服務器負載測試結果為準。
本文提出的LNMP分布式計算構架,適用性廣,不僅適用于Moodle 2系統,也能滿足其他PHP系統的大規模訪問需求。
參考文獻:
[1] Moodle官網[EB/OL].
[2] php-fpm[EB/OL].
[3] LNMP官網[EB/OL].
[4] 曾棕根.基于WAMP的簡體中文Moodle架設與性能優化[J].現代教
育技術,2011,21(4):136-139.
[5] 曾棕根.源程序在線評測系統技術改進[J].計算機工程與應用,
2011.47(4):68-71.
[6] 張宴.實戰Nginx:取代Apache的高性能Web服務器[M].電子工業出
版社,2010.
[7] Nginx官網[EB/OL].
[8] (法)Clément Nedelcu.Nginx HTTP Server[M].France:Packt Publishing,
2010.6:207-208
[9] 使用多fastcgi進行php負載均衡[EB/OL]. com/in-loading/archive/2012/03/29/ [10] Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建勝過Apache十倍的Web 服務器[EB/OL].< http://blog.s135.com/nginx_php_v6/> [11] 陶利軍.決戰Nginx:高性能Web服務器詳解與運維[M].清華大學出 版社,2012.6:43-48 [12] eAccelerator官網[EB/OL]. [13] httperf官網[EB/OL]. httperf/>