APP下载

基于Docker的分布式程序判定系统设计与实现

2018-07-09舒新峰王梦楠

实验室研究与探索 2018年6期
关键词:任务调度评测引擎

舒新峰, 张 文, 王梦楠

(西安邮电大学 计算机学院,西安 710121)

0 引 言

编程能力是信息类专业学生的一个基本技能,掌握的好坏程度对后期专业课程的学习和就业具有重要的影响[1]。程序设计类课程担负着编程能力训练的重任,但是传统纸质作业和卷面考试的课程考核方式需要老师人工评判。一方面,任务繁重且评判效率低下;另一方面,导致了学生“重理论,轻实践”,极大地影响了后期课程的学习[2]。如何用计算机技术解决学生编程能力的培养问题成为计算机实践教学改革的一个研究重点[3]。

对于程序评测系统的研究,可以追溯到1965年Forsythe和Wirth提出的自动评分程序[4]。如今,国内外已经出现了很多在线程序评测系统,如美国计算机奥林匹克竞赛系统(USA Computing Olympiad,USACO)、北京大学在线评测系统(Peking University Online Judge,POJ)和浙江大学在线评测系统(Zhejiang University Online Judge,ZOJ)[5-7]。现有的评测系统一般为浏览器/服务器模式(Browser/Server,B/S)架构,学生通过Web页面提交针对特定题目的解决方案,评测系统在判定服务器的操作系统上对学生提交的源程序进行编译、运行及判定[8]。在线程序评测系统应用于计算机辅助教学中能给教学双方都带来极大的方便。一方面,激发学生编程的兴趣,随时进行编程学习;另一方面,教学人员节省阅读学生代码的时间,降低劳动强度。为防止学生代码影响到判定服务器的安全性,例如盗取数据资源或破坏文件系统,现有评测系统屏蔽了文件操作、多线程使用等重要的系统调用,不能很好的满足程序设计类课程的判定需要[9-10]。

为解决上述问题,本文将Docker虚拟化技术引入到在线程序评测系统的判定引擎核心组件中,利用Docker的沙箱机制实现待测程序隔离于判定服务器的运行,确保了判定服务器的安全。同时,使用了分布式判定处理大规模高并发程序判定任务,提高程序评测系统的评测效率。最终设计实现了基于Docker容器的分布式程序判定系统(Docker Based Distributed Program Judgment System,DOJ)。

1 Docker容器技术

Docker是一个开源的应用容器引擎,它以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,用于构建、发布和运行分布式应用的平台[11-13],模块结构如图1所示。

图1 Docker的模块结构

Docker容器的隔离性主要通过namespace 分别将各容器的进程、网络空间、文件系统和用户隔离开[14]。不同用户的进程通过pid namespace 隔离开,借此实现各容器中的进程互不影响。Docker容器通过Cgroup和Ulimit机制限定CPU、内存等关键资源的使用,防止某个容器过度使用资源[15]。同时,从容器组网、镜像签名、监控和文件系统级防护等方面进行全方位的容器安全保护。

2 DOJ设计方案

DOJ系统定位为一个独立于答题系统的程序判定软件,总体架构如图2所示,系统采用分布式架构,由任务调度器、程序判定引擎和监控中心三部分构成,其中程序判定引擎的数量可以根据待判定任务的多少进行动态的扩缩。任务调度器负责接收来自于答题系统的程序判定任务,并进一步转发给程序判定引擎进行判定;判定引擎对分配的程序基于Docker容器进行运行判定;监控中心以可视化模式展示DOJ的运行状况。

图2 DOJ总体构架

DOJ各组件间采用可扩展标记语言(Extensible Markup Language,XML)数据格式传输数据。本系统设计了DOJ与答题系统间的外部交换数据格式(External data exchange format,EDEF)和组件间的内部交换数据格式(Internal data exchange format,IDEF)两种类型。EDEF的 XML数据格式如表1所示。由于篇幅有限,本文省略了部分辅助信息。同理,IDEF在EDEF的基础上新增程序判定引擎IP和剩余数量等数据标签。

2.1 任务调度器设计

任务调度器在DOJ中起着连接答题系统与程序判定引擎的重要桥梁作用,其详细设计如图3所示。任务调度器由判定引擎注册模块、任务接收模块、任务分配模块、结果处理模块和监控反馈模块组成。

判定引擎注册模块负责维护注册的判定引擎的基本状态,及时处理新注册的判定引擎和长时间得不到回应的判定引擎。任务接收模块接收答题系统提交的待判定任务,加入任务队列。任务分配模块根据判定引擎负载情况使用平滑的加权轮询算法将读取任务队列的待判定任务发送至不同的判定引擎。

当一个程序判定引擎启动时,需携带自己的地址、端口等信息向任务调度器申请注册后,才能接收任务调度器发送的待判定任务。当任务调度器有待判定任务时就可以向这个地址发送待判定任务。若一台程序判定引擎需要停止时,必须向任务调度器申请注销,任务注册模块就会从程序判定引擎队列中删除此引擎。

表1 外部数据交换格式(EDEF)

图3 任务调度器设计

任务调度器在接收到待判定任务后,将任务加入任务队列。任务分配模块读取任务队列,并修改已读取任务的状态为正在判定,通过平滑的加权轮询算法发送至选定的程序判定引擎。程序判定引擎判题结束后将结果发送回任务调度器的结果处理模块,由任务调度器将判题结果反馈给答题系统。

当任务队列中某次任务的状态长时间处于正在判定,DOJ会对此次任务进行重新判定。同时,用户可以通过监控中心来查看判定引擎的状态及判定统计信息,及时发现并处理问题。

2.2 程序判定引擎设计

程序判定引擎是DOJ的核心组成部分,其设计及Docker运行模块和结果判定流程如图4所示。程序判定引擎由任务接收模块、预处理模块、编译模块、Docker运行模块、结果判定模块和发送结果模块组成。预处理模块的职责是解析XML文件并且配置判定环境;运行模块负责运行目标程序,保存运行结果;结果判定模块判定运行结果是否符合预期结果。

图4 程序判定引擎设计及判定流程

当程序判定引擎收到待判定任务后,预处理模块对任务进行解析,然后编译模块开始编译,若编译失败,直接将结果保存到结果发送模块,由此模块将结果返回到任务调度器;若编译成功,编译之后,创建子进程启动Docker容器,父进程等待执行结果。在启动的容器中,主进程创建新的子进程执行用户代码,主进程通过读取子进程信息文件”/proc/子进程PID”,获取子进程运行的实时状态。若用例全部通过则正常结束,反之异常结束。

结果判定模块根据运行的结束状态的异常与否决定是否对运行结果的正确性进行判断。当运行异常结束时,结果判定模块生成判定结果信息,判定结束;反之,对比各组用例执行结果与预期结果是否相同得出判定结果。判定结束后经过结果发送模块将判定结果返回到任务调度器中。

3 实验环境和结果

本系统的运行环境要求64位Linux操作系统,内核版本在3.8及以上。实验使用了4台物理服务器,硬件配置为1核i5 CPU、8GB内存、100MB带宽,操作系统为ubuntu14.04。任务调度器与监控中心部署在一台服务器上,其他3台服务器各自独立运行一个判定引擎。系统启动后,从监控中心监测到的DOJ物理服务器统计如图5所示。

图5 DOJ的物理服务器统计

本实验题目来源于北京大学在线评测系统编号分别为DNA排序(1007)、堆排序(2388)和滑动窗口(2823)的3道题目,且增加了具体文件操作,多线程操作。对每道题目准备了多组测试用例,用来验证用户提交代码的正确性。使用这些题目在西安邮电大学15级软件工程专业组织了一次编程测试,收集到学生102份有效的C语言代码。将学生提交的102份代码经DOJ判定后通过监控中心得到如图6所示的监控结果。

图6 程序判定引擎监控结果

通过监控中心,可以清晰的看到DOJ当前的判题情况,从统计角度可以看到判题数量、判题时间和各个判定引擎的详细信息。

通过上述实验,验证了系统对文件操作、负载均衡等基本功能的支持。系统完成对任务的负载均衡,判定结果与预期结果一致。

4 结 语

“基于Docker容器的分布式程序判定系统”的独立性和安全机制避免了答题系统提交的代码对宿主机造成潜在的危险。有效的解决了在程序判定系统中进行文件操作、多线程的使用等问题。使用了分布式调度处理方式,可以实现任务的负载均衡,提高了系统的处理效率,很好的解决多任务量时的判定等待,缓解系统高负荷运行等情况。总之,既保证了安全、快速、准确的程序判定,又扩展了程序判定系统的应用范围。

参考文献(References):

[1] 何文广, 周 珂, 熊刚强. 程序设计课程实验教学改革与实践[J]. 实验室研究与探索, 2016, 35(6):163-165.

[2] 刘 毓,贾沛沛,刘传明. 现代互联网教学评价信息管理系统设计与实现[J]. 西安邮电大学学报,2015,20(1):119-124.

[3] 刘在英, 杨 平, 张丽晓. 程序设计课程实践教学模式的探讨[J]. 实验室研究与探索, 2013, 32(10):156-159.

[4] Forsythe GE, Wirth N. Automatic grading programs[M]. Stanford University, 1965.

[5] Kolstad R, Piele D. USA computing olympiad(USACO)[J].Olympiads in Informatics, 2007(1):105-111.

[6] 李文新,郭 炜. 北京大学程序在线评测系统及其应用[J]. 吉林大学学报(信息科学版),2005(S2):170-177.

[7] 张浩斌. 基于开放式云平台的开源在线评测系统设计与实现[J]. 计算机科学,2012,39(S3):339-343.

[8] 尤 枫, 史晟辉, 赵瑞莲. 编译程序在线评测系统的实现[J]. 实验室研究与探索, 2010, 29(12):69-72.

[9] 陈 鹏. 在线评判系统的设计和实现[D]. 南京:东南大学,2015.

[10] 黄洪波. 大规模编程题在线评判技术研究[D]. 广州:华南农业大学,2016.

[11] 浙江大学SEL实验室. Docker 容器与容器云[M].北京:人民邮电出版社, 2015.

[12] 张 怡. 基于Docker的虚拟化应用平台设计与实[D]. 广州:华南理工大学, 2016.

[13] 杨保华,戴王剑,曹亚仑.Docker技术入门与实战(第2版)[M].北京:机械工业出版社, 2017:3-9.

[14] FrantišekRadomír Sohlich, Tomáš Dulík.Docker as platform for assignments evaluation [J]. Procedia Engineering, 2015(100):1665-1671.

[15] 刘思尧,李 强,李 斌. 基于Docker技术的容器隔离性研究[J]. 软件, 2015, 36(4):110-113.

猜你喜欢

任务调度评测引擎
次时代主机微软XSX全方位评测(下)
次时代主机微软XSX全方位评测(上)
基于改进NSGA-Ⅱ算法的协同制造任务调度研究
基于时间负载均衡蚁群算法的云任务调度优化
攻坡新利器,TOKEN VENTOUS评测
蓝谷: “涉蓝”新引擎
Canyon Ultimate CF SLX 8.0 DI2评测
云计算环境中任务调度策略
云计算中基于进化算法的任务调度策略
无形的引擎