一种基于LNMP的Moodle 2分布式计算架构*
2013-04-29曾棕根
摘 要: 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/>