基于集群技术的源代码自动评测系统研究

2009-06-18 04:42管赋胜
新媒体研究 2009年16期
关键词:源代码评测集群

管赋胜

[摘要]在分析源代码自动评测系统设计的基础上,进一步阐述如何实现系统的高可用性和高性能。从以下三个方面:评测系统、集群技术和性能测试介绍实践经验。

[关键词]评测系统集群技术响应时间吞吐量

中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0820048-02

在程序设计语言、数据结构、算法设计与分析教学中,程序设计上机练习是必不可少的。由此带来教师在平时辅导中批改学生源代码作业量大,并且也存在一些个人主观因素或者不能注意到学生一题多解的情况,导致反馈的效率不高,影响学生学习的积极性。

目前国内提供的练习网站,往往只是针对部分群体的训练使用,无法在自己课堂上充分利用。为此研究开发了基于集群技术的源代码自动评测系统,它是在Linux 2.6内核操作系统上,JVM1.6.x,Apache 2.2.x,Tomcat6.0.x环境中,使用JAVA编写Servlet,用JSP编写动态网页,结合Linux系统编程完成的。综合运用了多种编程技术如:多线程、系统调用、管道技术等。

下面介绍一下系统的实现过程。

一、源代码自动评测系统

系统需要完成以下任务:学生注册登录后,浏览题目,选择自己熟悉的编程语言完成试题要求,提交答案源代码。系统接受提交命令后,把源代码生成为临时文件(一般存于系统临时目录,文件名为系统解题id号,扩展名为自己选择语言的标准名,如code_1234.cpp,然后等待评测。

系统在检查到有源代码生成后,会执行编译命令,如果编译不成功则转到错误处理程序,汇报编译错误类型,停止执行,反馈信息。编译成功,则转到执行模块,根据生成答案和系统标准答案(均是文件形式)比对,确定提交答案的实际执行情况。一般会有“答案错误”、“超时”、“超内存”等情况。同时系统把编译和执行情况反馈给用户。

由此可以看出,源代码自动评测系统至少应该包括这样几个模块:WEB服务模块、自动编译模块、自动评测模块或者其它可以扩展模块。其中前端服务是注册模块,后端服务是自动编译和评测模块。后台数据库服务选择MySQL作为支持。

1.数据库设置。

根据系统的分析设计,至少需要建立以下表:用户信息表,题目表,比赛表,状态表,日志表。

2.WEB服务模块。

使用JAVA编写Servlet,用JSP编写动态网页,在页面中调用Servlet服务。

3.自动编译模块。

系统支持C,C++,JAVA,Pascal编译。为了防止编译过程时间过长,可以分配给每一待编译源代码时间最大值(可以根据需要调整)。

4.自动评测模块。

(1)时间计算。使用以下简短代码即可测试,如果精度再放宽点可以用Date().getTime()获得时间,精度要求更高,需要读取CPU的时钟周期数再根据频率换成时间。

long starttime=System.currentTimeMillis(); //获取最初时间

doSth(); //测试的代码段,通常可以将主要算法封装在这里

long endtime=System.currentTimeMillis();//获取运行结束时间

System.out.println("程序运行时间:"+(endtime-starttime)+"ms”);

当然为了限制时间资源的无限制占用,可以加入Thread.sleep(delay),

到达指定的时间立即停止答案程序的运行,并返回超时信息等。

(2)结果反馈。评测系统运行结果存储在后台数据库中,如程序运行时长,占用内存空间等。特殊结果给出提示,方便用户修改源代码。

(3)执行安全。有一些文件需要通过WEB程序执行或者删除,但这些文件JSP又没有权限访问,给用户使用程序带来不便,这时需要借助于sudo来提高权限。

一般当前的Apache的用户是nobody,Tomcat服务的用户是谁呢?这取决启动时的执行startup.sh命令的用户。何不把用户统一设置成root?这样太不安全,而sudo运行用户程序过程中,只需要注意其运行权限的分配问题。例如,限制用户程序网络使用权限,限制用户程序非法调用系统函数关机、重启、格式化硬盘等操作。当然,在编译阶段,编译模块也同时在头文件中将有关危险系统调用函数屏蔽掉。

另一个安全上的考虑是代码作弊,系统提供了一个相似度的检查程序,可以有效地查出作弊代码。

5.扩展模块(竞赛管理,课程管理)

必要时的考试或者竞赛可以有效地促进学生检验当前阶段的学习,所以在系统中增加了竞赛管理模块。对于用户而言,一旦参加竞赛,权限就会受到一些限制,并且无法自行脱离参赛状态。必须等到竞赛结束才能回复到完整权限。计分方式以每一个问题的最后一次发送代码为评分依据。

在几百人比赛中部分学生反映页面打不开,或者提交代码后系统1分钟内无法回馈信息。针对以上问题,查看了Tomcat日志,Linux系统日志,评测系统日志发现,在集中提交时段如一题临近结束时间2分钟内200个左右的提交,有20个左右没有处理。这给系统设计者提了一个更高要求的,如何在并发提交量较大时保证服务的可用性和性能。

经过实践发现,解决这个问题,可以采用集群技术。

二、集群技术的应用

(一)编译、评测模块服务器集群

以Linux核心层集群技术和安全技术为基石,构建一个在Internet服务器中将负载分给多个服务器分担,以解决Internet服务器面临的大量并发访问造成的CPU或I/O的高负载问题。

每一台计算机上安装Linux操作系统,并要在Linux操作系统中安装C编译器和C的LIB库。在配置TCP/IP时,给计算机配置IP地址使集群服务器的计算机能进行相互通讯。

在进行配置服务器时推荐使用MPICH软件去执行分布式的并行处理应用。mpich是由Argonne National Laboratory和Mississippi State University合作开发的。这样在修改编译模块程序时记得 #include "mpi.h"库。

(二)Tomcat集群

Tomcat 6中的集群使一组局域网上的Tomcat实例(称为集群)在用户看起来是单一服务器。这使不同的服务器之间能分布地工作,称为负载平衡。Tomcat 6处理集群的方式利用了便宜的高速LAN互联来共享多个服务器的计算资源。这就是按比例扩展(scaling out)和线性扩展方法。通过使集群服务器明显地处理更多的并发请求,可以解决可扩展性问题。Tomcat服务器通过使用AJP连接器和Apache Web服务中mod_proxy(更低版本使用的是mod_jk)插件来支持线性扩展。Tomcat 6集群可用来实现一个高可靠性问题,在这种情况下会出现以下情况:

1.指定给崩溃服务器的请求转寄到集群中另一台功能正常的服务器。

2.最初的请求由功能正常的服务器处理。

3.失败的Tomcat服务器逻辑上从集群删除,请求不再会传给它。

4.当失败的Tomcat服务器恢复逻辑上它被添加集群中,再一次用来处理输入的请求。

但如何知道,原来的“服务器停在哪里”呢?并要继续从停止的地方开始。这要求信息的同步和共享。在JAVA EE兼容的Servlet/JSP容器中,有个普遍认可的约定可以利用来跟踪WEB应用程序的状态信息。Tomcat 6集群实现利用它来提供故障转移能力。

(三)MySQL服务器集群

MySQL Cluster技术允许在无共享的系统中部署“内存中”数据库的Cluster。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。

MySQL Cluster由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB Cluster的数据节点,管理服务器,以及(可能)专门的数据访问程序。

数据保存在“NDB存储服务器”的存储引擎中,表(结构)则保存在“MySQL服务器”中。源代码自动评测系统通过“MySQL服务器”访问这些数据表,集群管理服务器通过管理工具(ndb_mgmd)来管理“NDB存储服务器”。

三、性能测试

到目前为止,只是探讨了如何安装、配置一个集群服务系统,无论在哪个环节中的安装与调整,源代码自动测评系统的性能提升如何,有效的性能测试是至关重要的。

性能对一个WEB站点意味着什么,从用户视角WEB性能可归结为WEB页面处理有多快。而对于一个设计者,需要准确量化WEB站点性能。

重点从以下两个性能方面来测试:响应时间、吞吐量。测试分类为3类:负荷测试、压力测试、连续时间的运行测试。需要指出的是负荷测试和压力测试往往被错误地互换使用。负荷测试是在正常工作状态能承担的“最高负荷”,而压力测试意味者超负荷,直至系统崩溃,获得的错误类型可能是WEB服务器拒绝连接,JAVA虚拟机耗光内存,数据库连接失败或其它现象。

有很多这样的性能测试应用程序,以JMeter为例,尽管它是开源软件,仍然是出色的可解决方案之一,尤其是对JDBC数据源和JAVA对象进行负荷测试。任何JMeter会话核心是测试计划,每个测试计划中第一个元素是线程组,线程组是一组元素的集合,每个线程有自己的一组JAVA线程,可以进行相关测试配置,形成一个完整的计划。启动测试后结束后,可以在窗口显示响应中接收的数据和负荷时间(毫秒)、HTTP响应代码等。默认测试运行一次,可以将线程组改为更高值如200个线程(也就同时模拟200个用户),在它们之间有1s的ramp up period(即模拟1s内200个用户同时访问)。

在完成初步的性能测试后,发现集群服务下的源代码自动测评系统web应用程序运行不理想,不要急着丢弃多余硬件等,此时主要是分析导致性能提升幅度不大原因,可以分环节测试如JDBC部分。并查看各服务部分的日志,最后确定影响系统性能的瓶颈,就可以明确处理,从而更有效地建立基于集群技术的源代码自动测评系统。

参考文献:

[1]鲁静轩、孙晶、李元嵩,程序在线评测系统的设计与实现.

[2]孙敏,基于Linux的集群.

[3](美)Vivek Chopra、Sing Li、Jeff Genender著,Aapache Tomcat 6高级编程.

[4]徐千洋,Linux C函数库参考手册.

猜你喜欢
源代码评测集群
基于TXL的源代码插桩技术研究
勤快又呆萌的集群机器人
保护好自己的“源代码”
集群品牌是集群整体的品牌还是集群产品的品牌?
解密别克安全“源代码”
从北京奥运走来联想IdeapadY530长期评测
为商务人士减负联想IdeaPad U350试用手记
MI评测产品排行榜
6款网络电视直播软件横向评测