0. 前言 - 洛谷评测机的前世今生


snowboots系统评测(洛谷第四代评测系统技术分析)(1)

自2013年洛谷创立以来,已经陆续更新了4代评测技术。

在2013-2015年的洛谷1、洛谷2时代,使用的是基于 Windows 系统的评测机。

当时的评测机技术架构十分简单,原理大概是每秒钟自动从数据库获取未评测的程序,在 Windows 系统上进行评测,甚至直接在 Windows 的最高管理员 Administrator 账户下运行,程序运行环境上没有任何的安全限制,也不支持多线程评测等减少用户等待时间的重要功能,不过对于当时还只是小作坊 OJ 的洛谷来说,也算是比较够用了。

当时,lzn 站长想了一个比较聪明的办法来保证评测安全:

我们知道gcc -E指令可以调用gcc编译器的预处理器,即输出处理了#include#define等定义之后的代码。通过检查预处理之后的代码,隐藏在宏定义中的危险函数调用将无所遁形。洛谷第一代评测系统采用的便是对预处理后的代码进行关键字检查的安全措施,虽然不是万无一失,但至少可以防住大部分小学生————直到当时本文作者 lin_toto 和 kkksc03 打了一个赌,说可以用5种不同的办法在评测机上弹计算器。(结果最后只找到4种)

  • 智能优先级。并不是所有的评测任务都会被评测机一视同仁,公平地按照先来后到受到安排。例如,对于本身时限就较长的题目,可以适当降低其评测优先级,因为本身评测就需要花费较久时间,此时多等一些也无妨。又例如被系统认为正在对评测机进行恶意攻击的用户,则会被分配很低的评测优先级,甚至直接拒绝评测。

  • 智能扩容。因为洛谷不像 Codeforces 服务来自世界五湖四海的用户,用户群主要来自中国,因此评测量有明显的波动。如果购买大量评测机并在平峰的时候闲置则非常的浪费。因此,第四代评测系统具有自行监测评测拥挤度的功能。当发现评测机的负载过大,或用户出现较长时间等待的情况下,便会自动向云服务器厂商提交订单,在1-2分钟内,新的评测机即可上线服务。在高峰结束之后,多余的评测机则会被自动关闭,以节省不必要的资金花费。

    同时同以往一样,四代评测系统的所有输入、输出文件,均放置在虚拟内存盘中,因此不存在磁盘速度带来的输入输出速度瓶颈。

  • 3. 沙箱


    洛谷第四代评测机采用了基于lrun(https://github.com/quark-zju/lrun)且自行研发改进的评测沙箱技术。该沙箱技术不再限制系统调用,其原理与近年大火的容器技术 docker 类似,利用 Linux 内核的 cgroup、rlimit 等功能,对用户程序进行全方位的限制。

    因此直接可见的效果便是你现在可以随意在洛谷上提交所有你在网上找到的所谓“卡评测机程序”而不会影响洛谷评测机的正常运行。你的程序看到的是一个完整的 Linux 操作系统,然而你所看到的文件系统只是一个经过我们筛选的只读镜像,只包含对于评测必要的文件,而包括评测数据、其他人的程序等敏感数据,都在用户程序无权也无法读取的镜像外的文件系统,因此类似于“AC自动机”的事件的发生可能性被彻底斩断。程序运行时可申请的内存、磁盘空间等资源受到严格的限制,如有超出则会自动被系统停止运行。你无法看到运行在同一台机器上的其他进程,因为 pid namespace 不被共享。基于同样的原因,以及随机的评测用户 uid/gid ,攻击者也无法施展利用 ptrace 逃出镜像文件系统等等的奇技淫巧。

    同时,由于第四代评测系统的沙箱本质是创建了一个一模一样的镜像操作系统并全方位限制其权限,我们可以非常轻易地使其支持各种各样的编程语言。作为对比,使用 ptrace 或 seccomp 的传统方案则不得不使用一些非常蹩脚、且安全性值得怀疑的手法来进行安全审查,如系统调用计数等。

    4. 比较器


    第四代评测系统的比较器全面接入了 Testlib 。包括默认的 NOIP 风格比较器也实现成了类似 SPJ 的形式。简单来说,在第四代评测系统里所有的比较器都是 Special Judge;如果你上传的题目并没有设置 SPJ,评测机则会自动分配默认的 NOIP 风格比较器作为你的 SPJ 。

    5. 评测数据管理


    所有题目的评测数据被放置在一个统一的仓库中,评测机根据需要自行获取。为了降低网络 IO ,评测机在本地磁盘对评测数据进行缓存。同时,评测机维护每道题目的评测数据被最后一次使用的时间,当磁盘空间不足时,自动从本地删除最近没有被使用过的缓存评测数据。

    当评测机需要使用某个测试点时,系统将对应的测试点从磁盘复制到虚拟内存盘中,同时将输入绑定到用户评测程序的 stdin 上。因此,在镜像文件系统中是找不到输入文件的————它存在于外部的文件系统。

    6. 结语


    虽然洛谷评测机至今有一些 Bug 还需要解决,但是对于如此大的提交量,我们选择了比较合理的方案,并且一直不断改进。洛谷的评测机系统是凝结了洛谷开发者智慧的结晶,具有诸多创新点。我们之所以要不断地更新换代洛谷评测机,是为了让满足越来越多的用户通过洛谷学习提升的需求,并且增强用户体验。虽然新版本的洛谷还是咕咕咕,但是洛谷生态圈(大家看得到的和看不到的地方)依然是每天都有在改进。一切改进都是为了我们用户。


    本文发布于洛谷日报,特约作者:lin_toto

    原文地址:https://t.blog.luogu.org/luogu-judger-4-analysis

    ,