摘 要: Moodle 2需要運(yùn)行在PHP 5.3平臺(tái)上,如何利用PHP 5.3通過(guò)PHP-FPM服務(wù)器管理PHP FastCGI進(jìn)程的特性來(lái)提升Moodle 2系統(tǒng)性能是一個(gè)亟待解決的關(guān)鍵問(wèn)題。為此,提出了一種基于LNMP的Moodle 2分布式計(jì)算架構(gòu),并成功研制出樣機(jī)。經(jīng)功能測(cè)試和性能測(cè)試表明,該系統(tǒng)較單服務(wù)器系統(tǒng)提高了5倍的并發(fā)訪問(wèn)能力,而CPU使用率卻降低了26.2%,實(shí)現(xiàn)了Moodle 2的高并發(fā)和高速訪問(wèn),并具有負(fù)載均衡、彈性伸縮和容錯(cuò)性強(qiáng)的特點(diǎn),為PHP系統(tǒng)特別是Moodle 2系統(tǒng)的大規(guī)模推廣應(yīng)用提供了重要技術(shù)參考。
關(guān)鍵詞: Moodle; LNMP; 分布式系統(tǒng); 高并發(fā); 高性能
中圖分類號(hào):TP302.7 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):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博士主持研發(fā)的第二代Moodle免費(fèi)開(kāi)源網(wǎng)絡(luò)課程平臺(tái)[1],其功能之強(qiáng)大使得在全球范圍內(nèi)掀起了一股Moodle 2升級(jí)、應(yīng)用熱潮。
但由于Moodle 2要求運(yùn)行在PHP 5.3以上,而PHP 5.3是PHP技術(shù)發(fā)展的分水嶺,它采用PHP-FPM[2]服務(wù)方式管理PHP FastCGI進(jìn)程,如何利用這一特性來(lái)有效提高M(jìn)oodle 2訪問(wèn)速度和并發(fā)處理能力是一個(gè)亟待解決的關(guān)鍵問(wèn)題。
本文經(jīng)過(guò)深入研究與實(shí)驗(yàn),成功研制出一種Moodle分布式計(jì)算架構(gòu),使用源代碼編譯方式成功編譯、安裝、優(yōu)化了LNMP[3],并在LNMP上安裝了Moodle 2系統(tǒng),樣機(jī)連接地址為http://61.164.87.150:5483/,經(jīng)httperf測(cè)試證實(shí),該樣機(jī)實(shí)現(xiàn)了Moodle 2的高性能。
1 Moodle 2分布式計(jì)算架構(gòu)
Moodle過(guò)去多運(yùn)行在WAMP[4]或LAMP[5]架構(gòu)上,性能方面表現(xiàn)得總是不太理想。而采用LNMP分布式計(jì)算架構(gòu),即CentOS+Nginx+MySQL+PHP,能有效解決上述問(wèn)題,主要原因:
⑴ 高并發(fā)下CentOS操作系統(tǒng)(Linux 2.6+內(nèi)核)的epoll網(wǎng)絡(luò)模型CPU利用率較Windows操作系統(tǒng)僅有的select網(wǎng)絡(luò)模型高很多[6];
⑵ Nginx是由俄羅斯人Igor Sysoev設(shè)計(jì)的開(kāi)源、高并發(fā)HTTP和反向代理服務(wù)器[7],據(jù)業(yè)界測(cè)算,它可支持單臺(tái)服務(wù)器超過(guò)3萬(wàn)的純PHP腳本并發(fā)訪問(wèn),性能超過(guò)Apache服務(wù)器的10倍之多;
⑶ PHP 5.3以FastCGI這一目前公認(rèn)為效率最高的方式運(yùn)行,并由PHP-FPM服務(wù)器集中管理,實(shí)現(xiàn)了PHP高效率、高并發(fā)和分布式處理,其通信示意圖[8]如圖1所示。
圖1 Nginx+PHP-FPM通信示意圖
圖1中,如果客戶端瀏覽器發(fā)出HTML請(qǐng)求,則Nginx直接將HTML文件發(fā)送給客戶端;如果客戶端瀏覽器發(fā)出PHP請(qǐng)求,則Nginx將此請(qǐng)求轉(zhuǎn)發(fā)給PHP-FPM服務(wù)去處理,PHP-FPM服務(wù)與MySQL數(shù)據(jù)庫(kù)服務(wù)通信,處理完成后,PHP-FPM將處理結(jié)果以HTML的形式返回給Nginx服務(wù),Nginx服務(wù)再把此HTML文檔返回給客戶端瀏覽器。
⑷ 由于Nginx、PHP-FPM和MySQL都是獨(dú)立的服務(wù),所以可以將這幾個(gè)服務(wù)分別安裝在不同物理服務(wù)器上,分?jǐn)倖闻_(tái)服務(wù)器的負(fù)載,這就實(shí)現(xiàn)了分布式和高性能的Moodle。
研究表明,PHP處理是高性能LNMP的瓶頸,因此,應(yīng)安裝多臺(tái)PHP-FPM服務(wù)器,以實(shí)現(xiàn)PHP-FPM負(fù)載均衡[9],并安裝NFS文件服務(wù)器來(lái)同步PHP文件和session共享(也可將session寫到數(shù)據(jù)庫(kù)中來(lái)解決session共享問(wèn)題),統(tǒng)一訪問(wèn)同一臺(tái)MySQL數(shù)據(jù)庫(kù)。圖2為本文提出的分布式LNMP架構(gòu)。
圖2 分布式LNMP架構(gòu)示意圖
圖2的分布式計(jì)算架構(gòu)中,Moodle的程序文件分別拷貝在每臺(tái)PHP-FPM服務(wù)器中,Moodle的數(shù)據(jù)文件即moodledata文件夾放在NFS文件服務(wù)器中供所有PHP-FPM服務(wù)器共享,Moodle的數(shù)據(jù)庫(kù)則存放在MySQL服務(wù)器中供所有PHP-FPM服務(wù)器統(tǒng)一調(diào)用,而Moodle的session則保存在MySQL數(shù)據(jù)庫(kù)中。當(dāng)用戶訪問(wèn)Moodle網(wǎng)站時(shí),PHP請(qǐng)求被Nginx服務(wù)器接收后,它的upstream模塊按輪詢方式將此請(qǐng)求發(fā)送給一臺(tái)PHP-FPM服務(wù)器去處理,或采用ip_hash方式確定一個(gè)訪問(wèn)者發(fā)出的請(qǐng)求總是由一臺(tái)固定的PHP-FPM服務(wù)器來(lái)處理,例如:
Upstream phpfpm {
ip_hash; //如果采用輪詢方式選擇PHP-FPM服務(wù)器則注釋掉此行
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服務(wù)器接收到PHP請(qǐng)求后,則編譯執(zhí)行本機(jī)中的Moodle程序,如果需要存取Moodle數(shù)據(jù)就從NFS文件服務(wù)器中的moodledata程序文件中去存取文件,如果需要存取數(shù)據(jù)庫(kù)就去訪問(wèn)MySQL數(shù)據(jù)庫(kù)服務(wù)器,最后,PHP-FPM服務(wù)器把運(yùn)行結(jié)果以HTML方式返回給Nginx服務(wù)器,Nginx服務(wù)器則將結(jié)果返回給客戶端瀏覽器,完成一次Moodle請(qǐng)求。
2 編譯安裝LNMP架構(gòu)和Moodle 2
確定了分布式架構(gòu)后,需要在服務(wù)器中將LNMP架構(gòu)和Moodle程序安裝好。由于Moodle 2需要LNMP架構(gòu)特定模塊支持,必須采用編譯LNMP各部件源代碼方式來(lái)安裝LNMP架構(gòu)而不能安裝二進(jìn)制發(fā)行版。另外,通過(guò)本機(jī)編譯源碼方式安裝的部件會(huì)更好地發(fā)揮硬件性能。本文采用的部件及版本如表1所示。
表1 LNMP架構(gòu)各部件版本一覽表
[部件\&文件名或版本要求\&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穩(wěn)定版\&PHP\&php-5.4.8.tar.gz\&eAccelerator\&eaccelerator-42067ac.tar.gz for php 5.4\&Moodle\&moodle-latest-22.tgz\&]
由于編譯安裝LNMP架構(gòu)和部署Moodle程序是Linux程序員的基本功,本節(jié)對(duì)此過(guò)程不再贅述,讀者可以參考LNMP一鍵安裝包官方網(wǎng)站http://lnmp.org/或張宴老師的博文《Nginx 0.8.x+PHP 5.2.13(FastCGI)搭建勝過(guò)Apache十倍的Web服務(wù)器(第6版)》[10]。
3 優(yōu)化LNMP架構(gòu)參數(shù)
編譯安裝好LNMP和Moodle 2后,還需要對(duì)各項(xiàng)服務(wù)進(jìn)行優(yōu)化,使得服務(wù)器性能得以充分發(fā)揮。優(yōu)化服務(wù)器的主要思路是:調(diào)高系統(tǒng)參數(shù)、關(guān)閉不必要的日志讀寫、使用緩存、使用加速器等。
3.1 Linux內(nèi)核優(yōu)化方法[11]
⑴ 調(diào)高Linux內(nèi)核打開(kāi)文件數(shù)量為102400。
Linux默認(rèn)打開(kāi)文件數(shù)是1024,調(diào)高linux內(nèi)核打開(kāi)文件數(shù)量(必須是root帳號(hào)):
a、在/etc/profile文件最后加上:ulimit -HSn 102400
b、在/etc/rc.local文件最后加上:ulimit -HSn 102400
c、在/etc/security/limits.conf文件最后添加下面兩行內(nèi)容(CentOS 6.2需要在此文件里修改,否則無(wú)效):
* hard nofile 102400
* soft nofile 102400
d、在/usr/include/bits/typesizes.h文件中,修改__FD_SET_SIZE宏定義值為102400。
⑵ 調(diào)整單個(gè)用戶最多擁有的進(jìn)程數(shù)。
a、在/etc/security/limits.conf文件最后添加下面兩行內(nèi)容
* hard nproc 102400
* soft nproc 102400
b、在/etc/security/limits.d/90-nproc.conf文件中修改soft nproc為102400。
⑶ 優(yōu)化Linux內(nèi)核的TCP選項(xiàng),增加以下設(shè)置:
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優(yōu)化方法
⑴ 使用my-innodb-heavy-4G.cnf作為生產(chǎn)環(huán)境下的配置文件。
⑵ 調(diào)整/etc/my.cnf中的幾個(gè)參數(shù),增加數(shù)據(jù)庫(kù)的打開(kāi)文件數(shù)量和各種緩存:
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優(yōu)化方法
⑴ 訪問(wèn)日志會(huì)造成頻繁磁盤訪問(wèn)并占用大量磁盤空間,對(duì)于Moodle這樣的安全性要求并不是非??量痰膽?yīng)用,應(yīng)當(dāng)關(guān)閉Nginx訪問(wèn)日志,或者定時(shí)切割Nginx訪問(wèn)日志(如每天0點(diǎn)0分切割一次),以避免單個(gè)日志文件太大而影響系統(tǒng)性能。
⑵ 使用epoll網(wǎng)絡(luò)I/O模型,epoll網(wǎng)絡(luò)模型只內(nèi)建于Linux內(nèi)核2.6以上的OS中。該模型有別于Windows操作系統(tǒng)上僅有的select網(wǎng)絡(luò)模型,在高并發(fā)連接下,CPU利用率會(huì)提高很多。
⑶ 打開(kāi)keepalive_timeout,使TCP連接保持65秒,連續(xù)訪問(wèn)時(shí)避免頻繁重建連接。
⑷ 充分發(fā)揮CPU多核心性能,指定Nginx的工作進(jìn)程數(shù)worker_processes,一般為總核數(shù)或總核數(shù)的兩倍,這里的總核數(shù)是指CPU線程總數(shù)。
⑸ 開(kāi)啟Nginx的gzip壓縮功能,提高傳輸速度,改善用戶體驗(yàn)。啟用gzip壓縮后,Nginx在向客戶端傳送網(wǎng)站的.html的文件、.css和.js等文件時(shí),會(huì)先采用gzip壓縮,使文件體積大為減小,傳輸耗時(shí)就少了,而常用的客戶端瀏覽器都內(nèi)建了gzip解壓縮程序,會(huì)自動(dòng)解壓。
3.4 PHP-FPM優(yōu)化方法
⑴ 指定PHP-FPM允許打開(kāi)最多文件數(shù),將rlimit_files設(shè)為102400,這個(gè)參數(shù)與Linux內(nèi)核參數(shù)要吻合。
⑵ 根據(jù)每個(gè)PHP FastCGI進(jìn)程大約消耗20MB內(nèi)存計(jì)算,4GB內(nèi)存可一次性開(kāi)啟128個(gè)PHP FastCGI進(jìn)程,并行等待客戶端PHP腳本請(qǐng)求。指定PHP-FPM以靜態(tài)方式創(chuàng)建PHP FastCGI進(jìn)程,一次性啟動(dòng)128個(gè)PHP FastCGI進(jìn)程,再設(shè)置每個(gè)進(jìn)程在重置之前能夠執(zhí)行的最多請(qǐng)求數(shù)為65535。在終端通過(guò)鍵入#pstree命令,可以查看到PHP-FPM服務(wù)靜態(tài)創(chuàng)建的PHP FastCGI進(jìn)程的數(shù)量為128個(gè),如圖3所示。
圖3 PHP-FPM服務(wù)靜態(tài)創(chuàng)建的PHP FastCGI進(jìn)程
3.5 PHP優(yōu)化方法
使用eAccelerator for PHP 5.4來(lái)對(duì)PHP進(jìn)行加速。eAccelerator是一個(gè)自由開(kāi)放源碼的PHP加速器,通過(guò)動(dòng)態(tài)內(nèi)容緩存,使PHP腳本在編譯的狀態(tài)下,對(duì)服務(wù)器的開(kāi)銷幾乎完全消除。它還能優(yōu)化腳本,以加快其執(zhí)行效率,使PHP腳本執(zhí)行效率能提高1~10倍[12]。
安裝好eAccelerator后,重新啟動(dòng)PHP-FPM和Nginx,再運(yùn)行phpinfo.php程序,可以看見(jiàn)這條信息,說(shuō)明eAccelerator生效了:with eAccelerator v1.0-dev, Copyright (c) 2004-2012 eAccelerator, by eAccelerator。
4 樣機(jī)性能測(cè)試
經(jīng)過(guò)上述的編譯、安裝和優(yōu)化,成功研制了LNMP + Moodle 2服務(wù)器樣機(jī),網(wǎng)址為http://61.164.87.150:5483/。該服務(wù)器硬件配置如表2所示。
表2 Moodle 2服務(wù)器樣機(jī)硬件配置
[硬件\&參數(shù)\&內(nèi)存\&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 功能測(cè)試
經(jīng)過(guò)三個(gè)月“JAVA程序設(shè)計(jì)”網(wǎng)絡(luò)課程的教學(xué)使用證實(shí),該樣機(jī)在開(kāi)設(shè)課程、上傳用戶、注冊(cè)用戶、用戶授權(quán)、上傳文件、上傳圖像、上傳用戶、討論板、作業(yè)模塊、考試模塊、主題選擇、郵件自動(dòng)發(fā)送、模塊升級(jí)和卸載等方面都能正常使用,無(wú)任何bug, Moodle 2軟件質(zhì)量非常高,系統(tǒng)響應(yīng)速度也非???,無(wú)任何延遲感,學(xué)生普遍反映非常滿意。
4.2 性能測(cè)試
采用HP實(shí)驗(yàn)室研發(fā)的服務(wù)器負(fù)載測(cè)試工具h(yuǎn)ttperf[13]對(duì)單服務(wù)器和分布式服務(wù)器樣機(jī)進(jìn)行對(duì)比測(cè)試。
【測(cè)試樣例】#httperf --server 10.61.0.2 --port 80 --uri/index.php --rate 100 --num-conn 1000 --num-call 1 --timeout 5。
【測(cè)試含義】測(cè)試機(jī)以每秒100個(gè)并發(fā)連接的速度向服務(wù)器(服務(wù)器的IP是<10.61.0.2>,端口為80)發(fā)起連接(Connection),每個(gè)連接產(chǎn)生1個(gè)請(qǐng)求(Request),請(qǐng)求的網(wǎng)頁(yè)是index.php,如果此連接5秒內(nèi)還未從服務(wù)器返回處理結(jié)果,就記為一次錯(cuò)誤(連接失敗),共要完成1000個(gè)連接。
測(cè)試結(jié)果見(jiàn)表3。
表3 單服務(wù)器與分布式服務(wù)器性能測(cè)試對(duì)比表
[ \&單服務(wù)器\&分布式服務(wù)器\&完成總連接(個(gè))\&230\&1500\&連接速度(連接數(shù)/秒)\&18.1\&107.3\&CPU用戶時(shí)間(秒)\&5.12\&1.97\&CPU系統(tǒng)時(shí)間(秒)\&7.6\&12.01\&]
從以上的對(duì)比測(cè)試可以看出,在同等條件下,采用單服務(wù)器部署方式,Moodle系統(tǒng)平均每秒僅能處理18.1個(gè)有效請(qǐng)求,CPU用戶時(shí)間占用率高達(dá)40.3%;而采用分布式計(jì)算的部署方式,Moodle系統(tǒng)平均每秒能處理107.3個(gè)有效請(qǐng)求,CPU用戶時(shí)間占用率卻低至14.1%。由此可以看出,此分布式系統(tǒng)較單服務(wù)器系統(tǒng)并發(fā)處理能力提高了近5倍,而CPU用戶時(shí)間卻降低了26.2%,系統(tǒng)非常輕松,響應(yīng)敏捷。
5 結(jié)束語(yǔ)
本文在PHP 5.3最新技術(shù)的基礎(chǔ)上,提出了一種基于LNMP的Moodle 2分布式計(jì)算架構(gòu),研制出了一套樣機(jī),并經(jīng)過(guò)了實(shí)踐檢驗(yàn)和服務(wù)器負(fù)載測(cè)試,證明該系統(tǒng)性能得到了很大提升,并具有容錯(cuò)功能和彈性伸縮的特征。當(dāng)一臺(tái)PHP-FPM服務(wù)器當(dāng)機(jī)時(shí),并不會(huì)影響整套系統(tǒng)的正常運(yùn)行;隨著系統(tǒng)應(yīng)用規(guī)模的逐步擴(kuò)大,還能夠任意將新的PHP-FPM服務(wù)器接入到該系統(tǒng)中,分擔(dān)計(jì)算負(fù)載,實(shí)現(xiàn)彈性伸縮。限于目前實(shí)驗(yàn)條件所限,本文只針對(duì)3臺(tái)PHP-FPM服務(wù)器進(jìn)行了實(shí)驗(yàn)。
另外需要指出的是,本文研制的由1臺(tái)Nginx服務(wù)器、3臺(tái)PHP-FPM服務(wù)器、1臺(tái)NFS文件服務(wù)器和1臺(tái)MySQL服務(wù)器等6臺(tái)2核心4線程的服務(wù)器組成的Moodle 2分布式計(jì)算系統(tǒng),每秒能處理107.3個(gè)有效請(qǐng)求,按以10秒產(chǎn)生一次做題請(qǐng)求來(lái)計(jì)算,該系統(tǒng)能支持至少1073個(gè)學(xué)生同時(shí)在線考試,能滿足一所2000~3000人訪問(wèn)的中等學(xué)校的應(yīng)用需求。如果要滿足一所上萬(wàn)人大學(xué)的使用需求,那就需要增加服務(wù)器的硬件性能(如CPU超過(guò)24線程)和PHP-FPM服務(wù)器數(shù)量,具體數(shù)量應(yīng)當(dāng)以httperf服務(wù)器負(fù)載測(cè)試結(jié)果為準(zhǔn)。
本文提出的LNMP分布式計(jì)算構(gòu)架,適用性廣,不僅適用于Moodle 2系統(tǒng),也能滿足其他PHP系統(tǒng)的大規(guī)模訪問(wèn)需求。
參考文獻(xiàn):
[1] Moodle官網(wǎng)[EB/OL].
[2] php-fpm[EB/OL].
[3] LNMP官網(wǎng)[EB/OL].
[4] 曾棕根.基于WAMP的簡(jiǎn)體中文Moodle架設(shè)與性能優(yōu)化[J].現(xiàn)代教
育技術(shù),2011,21(4):136-139.
[5] 曾棕根.源程序在線評(píng)測(cè)系統(tǒng)技術(shù)改進(jìn)[J].計(jì)算機(jī)工程與應(yīng)用,
2011.47(4):68-71.
[6] 張宴.實(shí)戰(zhàn)Nginx:取代Apache的高性能Web服務(wù)器[M].電子工業(yè)出
版社,2010.
[7] Nginx官網(wǎng)[EB/OL].
[8] (法)Clément Nedelcu.Nginx HTTP Server[M].France:Packt Publishing,
2010.6:207-208
[9] 使用多fastcgi進(jìn)行php負(fù)載均衡[EB/OL]. com/in-loading/archive/2012/03/29/ [10] Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建勝過(guò)Apache十倍的Web 服務(wù)器[EB/OL].< http://blog.s135.com/nginx_php_v6/> [11] 陶利軍.決戰(zhàn)Nginx:高性能Web服務(wù)器詳解與運(yùn)維[M].清華大學(xué)出 版社,2012.6:43-48 [12] eAccelerator官網(wǎng)[EB/OL]. [13] httperf官網(wǎng)[EB/OL]. httperf/>