151

如何评价2017 ACM/ICPC ECL-Final? - 知乎

 6 years ago
source link: https://www.zhihu.com/question/264077217/answer/278897731
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

如何评价2017 ACM/ICPC ECL-Final?

登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏
一片趴着的培根。

虽然还是想吐槽这个E和I的出题套路,不过google今年的不让选手掏出模板的出题思想值得鼓励,除了E和I外码量都很小,对老寒手的老年人特别友好。

几个无关紧要的点:

算法竞赛真的是个好游戏,希望大家玩的开心。

Rilakkuma

我先澄清一个事情,我的裤裆里藏不下 10 台评测机,谢谢各位大佬啊。

作为今年 ECL-Final 的技术包工头,首先感谢包工队的工友

,战略支援小组的

,以及上海大学的老师们和在一线工作的同学们。我来讲讲今年 ECL-Finals 有关的故事。

准备阶段

我是今年 10 月 22 日向周老师发邮件,说今年 EC 我可以继续帮忙的。把日程啥的定了一下,还是周四晚上到上海,请周老师帮忙订酒店。后面就是长达一个半月的装死。

吐个槽:虽然已经知道今年又改名回 EC 了,但是我给周老师发邮件的时候还是手误写成了去年的 China-Final。But,直到比赛那两天,我才知道原来今年也不是叫 EC-Final,而是叫 ECL-Final。Question:为什么这个名字要改来改去呢?难道黄教授毕业于我大微软的著名的战略改名部?

12 月 2 日晚上,我们在亚洲第四训练委员会(删去)ICPC-Camp 的群里头,讨(吐)论(槽)起今年赛区的各种锅。我扔出了一个问题:要不我们换一个 DOMjudge 吧。大佬们:好顶赞支持!我们便开始行动,大概来说分了三个部分吧:

  1. 在群里继续讨(闲)论(天)关于更换 DOMjudge 的有关事宜,同时我在也咨询了一下刘大师大佬的意见,也阅读了一下 DOMjudge 的沙箱部分的代码。
  2. 昂神开始在命题组那边工作,征得命题组的同意。
  3. 那天晚上,我立刻给周老师发了一个邮件。周老师回邮件非常快,说他们会在第二天讨论更换 Judge 系统对他们的影响(那时候已经是凌晨 12:20 了)。后面的邮件中,我提出了跟 Scoreboard、证书等有关需要定制的系统,我们可以负责适配以往的代码。周一的邮件中周老师同意了更换 PC^2 为 DOMjudge。

同时,教主 from Google 发来邮件,支持我们换跟 Final 一样的系统,我们就非常开心继续啦!备注:根据 icpc.baylor.edu 的文档,明年 World Finals 用 DOMjudge。

我们制定了一个计划,大概就是,下一周六(12 月 9 日)我们要进行联调,我们要压力测试。但是。周六下午我在医院。周日我在睡觉。周一我在医院。周二我在睡觉。周三我在休息+上班,勉强干了一些事情。周四我在休息+上班,勉强干了一些事情。然后,周四晚上,我就上飞机飞上海啦!

现场安装阶段:周五

不得不感叹,还是上海的空气适合我!周五起床感觉好了一大半了。到体育馆后,设备基本都到位并且安装妥当了。然后我去食堂吃了一顿饭,鞋湿了,感谢上大的同学给我买了一双棉拖鞋并且不愿意收我钱。后面,就正式进入苦逼阶段了。

按照原定的方案,上大使用了去年的机器和操作系统,验证过后就运进场了。我想找到去年我工作机上的一些脚本和数据,结果找了一遍裁判室没有找到。这时候,张录 from 上大来了,说,去年的裁判机都不在裁判室,都在赛场 A 区,于是,我们派出了所有的 Staff 去 A 去找,终于找到了一台他们不知道密码的电脑,我试了一下我自己的密码,进去了,Lucky!

后面干了一些什么事情呢,给一台服务器的 CentOS 换成 Debian(因为我不熟悉 CentOS),再给另一台电脑换成 Debian,收集今年 DHCP 分配的 IP 以及座位表的关系,并根据座位表重新给所有电脑分配上固定 IP(因为我希望今年不要用密码登录了,直接座位绑定队伍就好)。

小技巧,如何关联,我们做了两个事情:

  1. 请志愿者给所有电脑的桌面创建一个叫 seat 的文件,所以我可以关联上 IP & seat no.
  2. 请叉姐给了我一段命令,可以生成一张是座位号的图,并且将这张图换成桌面背景,这样可以方便地检查有没有设置错误。

这当中又有一些小插曲,他们本来安排了 4 点请一波志愿者来做压力测试,但是我觉得这样压力测试没什么意义,因为这些志愿者根本模拟不出真正高压力的情况,因为去年也做压力测试了,根本交不来多少代码,比赛结束前的十来分钟,提交量又远比这个压力测试大,PC^2 根本处理不好。当然这也是次要的,主要的是当时我还没找到 private key,还策划着要重装系统,然而又要装系统又要架 DOMjudge,4 点压根做不完!

这当中又有一些小插曲的小插曲,我们希望志愿者赶紧过来把座位号挂上,但是志愿者负责人那边又坚持说要先压力测试再挂座位号否则座位号会被搞坏了(并搞不懂这个逻辑),但是我们又决定了要取消压力测试了,他们说他们不知道取消压力测试了,这个事情又反复沟通了很久,反正有点囧,还是要感谢张录在那边反复沟通。

装上了 Debian,就要在上面装 Docker,装 DOMjudge 啦,装 MySQL 啦。这里涉及后面反复调试的问题啦,后面再说啦。我开始是想先装上一个 DOMjudge 的 website,然后戴老师就可以做他那部分工作了,事实证明并不行,因为我还没有装上 judgehost。

Update:傍晚的时候,周公子过来了,请他安装上了 NTP server,然后把下面的电脑的 NTP 的 IP 改对了,确保了选手机器时间准确(以及匹配服务器时间)。

晚上吃了个盒饭,继续装这个装那个,又发生了一个意外。这个事情的起因是我们发现有不少电脑的 seat 没有设置对,戴老师帮我下去检查,发现很多电脑上错误地登录了 Guest,所以我希望禁用 Guest 并且删除创建的账号。我本来应该:

deluser `grep guest /etc/passwd | cut -f 1 -d:` 

But!But!But!我写成了:

deluser `tail -n 1 /etc/passwd | cut -f 1 -d:`

然后,interesting!我发现大部分电脑我连不上 SSH 了!经过研究,有一个叫做 sshd 的用户,我删掉了。

然后,我只能请现场工作人员,到每一个电脑,用 tty 登录 root,执行:

cp /var/backup/passwd.bak /etc/passwd

过了半个小时,经过工作人员的辛勤工作,终于修好了所有的电脑。

这段时间我还干了一些啥呢,因为脑子比较混乱,刘大师之前似乎告诉我,最好在 Debian 上安装,否则可能引起一些奇怪的问题,我就给裁判室的一台电脑安装上了 Debian,然后用还原卡同传了另外一些电脑,加起来大概我们就有 13 台评测机了吧。装完以后,要逐个电脑设置 IP,由于我实在太咸鱼啦!我只配置好 8 台。

这些还有一些小细节,DOMjudge 默认会用 debootstrap 来做一个 chroot 的环境,然而我觉得这样不是很好,因为会导致跟选手环境不一样。解决方法是,做了一个 Ubuntu 的启动盘,到选手机上,把 /dev/sda1 挂上,做一个 cd /mnt && mksquashfs /foo/bar/chroot.squashfs,然后把这个 squashfs parallel-scp 到所有的 judgehost 上,mkdir /chroot/domjudge && mount /foo/bar/chroot.squashfs /mnt && cd /mnt && rsync -a . /chroot/domjudge。请不要直接 copy & paste!请根据你的实际情况修改命令!

然后就进入下一个阶段了,就是配置好 DOMjudge。白天的时候,我 cat /proc/cpuinfo && free -m 看了一眼,发现是个 E5+16G 内存(其实是 32G,因为我一开始查的那个机器有点毛病,下面说),yyf 大佬告诉我这是个辣鸡 E5,这个内存也 (虽然后面刘大师马上跟他吵了起来),反正我还是很心虚的。于是呢,还是要执行一下 checklist,请戴老师做一下压力测试。戴老师不知道从哪里掏出了一个压力测试的 php,然后:

loop:试着跑了一下,挂了,请我清理一下数据库,修改一下那个 php

反正 loop 了若干轮,终于能跑了,DOMjudge 果然立马炸了。我看了一下 web server 和 htop 和 mysql server 的 htop,思考了一下,觉得 database 负载这么低,web server 也这么低,一定是因为 worker 不够,立马改 php-fpm 的配置,其实也没干啥,大概就是改了 pm.* 那系列的配置,把 pm.max_children 改到了 128,反正最后还是会有一些 request 挂掉,但是总体来说失败率已经很低了,戴老师和我都觉得可以接受了,这个事情就算过去了。

后面我还干了啥呢,大概就是,戴老师说,我们应该要 https,我觉得很对!但是我总不能挂个 nanometer.io 吧,也不能挂个 icpc.camp 吧,我想还是用一个 contest.acmicpc.cn 吧,自签一个吧。我怕某些选手机的时间掉了,所以我还要签一个 1970 年到 2038 年的证书。然后,自签了一轮,Chrome 始终认为这个证书不对,反正是某个版本后提高了对某些属性的要求,然后开始反复 Google 反复签,干了两三个小时,还是没搞定。我最后刘大师掏出了两个命令给我,Chrome 终于认可了!然而,Firefox 还是不识别。心累。还是等第二天周老师来了,拿到这个域名的解析然后 Let's Encrypt 一下吧。

这个时候大概已经凌晨 3 点多了,还是先回去睡了。走之前,戴老师告诉我,DOMjudge 里头有个 config check 之类的东西,让我记得检查一下配置好。

回到宾馆,继续搞。因为乐乎楼就是上大的网络,赛场的网络是上大信息办配置的,跟校园网是通的,我就继续搞那个 config check 里头的东西,回头又配置来配置去,后面又不是完全睡得着,来来去去的,睡觉的时候都 6 点了吧。

现场准备阶段 & 热身赛:周六

8 点,叉老师打电话来,说他快到了,我只能起床了。在乐乎楼跟裁判们吃了个早饭,然后就去赛场了。叉老师已经到了,需要他把气球打印配置上。然后就怎么给他接上了啥的,我也不是很记得清楚了。

睡醒以后,特别的气,掏出了 namecheap 买了一个 acmicpc.network,请叉老师帮忙 Let's Encrypt 了一下,拿到了 key 和 csr,然后配置到了服务器上,就 work 得很好了。

后面干了啥,我也不是很记得了。大概 1 点进场,反正还是很慌张,进场前我还重启了一下所有电脑,志愿者回来告诉我有一个机器登录不进去了,我去看了一下,硬盘坏了,气炸!到裁判室掏出了一台备机,请一位 13 级的复旦学霸 Google 裁判帮我把电脑搬到外面,然后掏出了我的 Ubuntu U 盘,把昨天做的 squashfs rsync 上去,可算在那个位置的队伍进场前装好了。

开始之前还发生了若干有趣的事情,例如裁判室的门把一根电线蹭破了,导致裁判室跳闸了,如此反复了两次,找到了根源,然后把那个插线板拔掉了,从另一个地方专门接了一路电了,保证了稳定。

Update:上面说到的那个服务器只有 16GB 内存,断电再开以后就发现问题了,BIOS 自检报警,拆开把内存重新插了一下,就恢复到 32GB 了。

这时候大家已经进场了,我又想到一个问题,选手的机器还登录着呢!我还没锁呢!去年的选手数据还没清理呢!我慌慌张张跑回裁判室,赶紧 parallel-ssh -h all_seats -l root -p 330 'passwd -l icpc && /etc/init.d/lightdm restart' 把他们全锁掉,并又上了一系列命令删掉把数据删掉。Tip:除了 /home 下面要清理一下,/tmp 和 /var/tmp 也要清理。

后面又折腾了好久,我又想不起来干啥了,大概是把热身赛的环境啊 数据 啊配置好。然后三点啦!然而还没有彻底弄好,又延迟了几分钟,然后就开始了,然而,还是爆炸了!具体是怎么爆炸的,请看戴老师的回答。

晚上吃了教练晚宴,回裁判室继续肝,后面主要是叉姐和戴老师的工作了,我把该改的配置改好,把一些图标给传了下去。尽管裁判们觉得 8 台评测机足够了,我还是很担心,于是又同传了 5 台电脑,最终达到了 18 台评测机。

后面其实我已经没啥事情了,或许我又干了啥反正我已经想不起来了,就是等郭老师和搞学长把东西弄完,最后联调一下,弄完以后,已经三点了吧,实在太饿,还跑到上大门口外面全家吃了个咖喱猪排饭,感觉这个猪排的数量比以前变少了,sad。

这里还有个锅,下午绑定了 IPADDRESS 后,发现了一个锅,DOMjudge 有个奇怪的设定,如果是在 IPADDRESS 模式下,你在一个没有绑定的 IP 登录,又用了用户名密码登录,这个用户就会绑定到这个 IP 上。我用的网线还好,但是别的 Staff & Judge 用的都是一个 NAT 的无线路由,所以大家都登录到了一个账号上,这个事情虽然也 work,但是不是太好,晚上回到乐乎楼后,我又改了一下那个登录函数,把这个行为给 fix 掉,又快 5 点才睡觉。

正式比赛:周日

8点到裁判室,大概把电脑重启了一下,检查了一下,没什么毛病。此时想起来一个问题,今天好像没让打印密码,虽然 DOMjudge 不需要密码了,可是打印系统还需要啊!所以我赶紧掏出了之前的 Excel 找出了密码发布到桌面上,没想到还是发错了。总体来说还是一路和平吧,裁判们在裁判室谈笑风生,我刷刷这刷刷那,感觉良好。后面 12 点我还接上了 WiFi 跑到直播边上坐了一个小时,因为,裁判室没有空调实在太冷了!戴老师提到了一些锅,我来解释一下:

Q:为什么延迟了 5 分钟开始?

A:不是技术问题,主要是因为发题目出现了一些问题,为了安全起见,延迟了 5 分钟。

Q:为什么打印系统登录不上?

A:请阅读上一段。

Update:后面我重新发了一次密码,然而还说有队伍发现没更新,原因是第一次的文件名末尾有个^M,第二次没有,所以就有两个看着文件名相同的文件但实际是不一样的。后来我把两个文件都删掉了再重新发了一次才好。在这里向所有队伍道歉,耽误了大家的时间。

Q:为什么开始比较积攒了一些提交很久才测?

A:这是我的锅,一开始我开了 4 台评测机,感觉可以撑几分钟了,一会儿再开,没想到马上裁判就告诉我有很多 CE 是新装的评测机引起的,赶紧先把他们关掉,准备维修结果又遇到了打印的问题。修好打印的问题,裁判告诉我积攒了太多了,我又赶紧上去先把昨天装好的评测机打开,然后把没有配置好的评测机的维修好(主要是 adduser 和 add cgroup 的问题),马上全打开。18 台评测机打开后,没几分钟立马就好了。还有一个小锅是,DOMjudge 是随机挑选没有测的提交,导致了有一些早交的一直没有测,这在正常情况下是没什么问题的,但是一旦到了高峰,就成了一个问题。

Q:平均要等一分钟才能测完?

A:这种事情不存在的。我一直在刷 submissions 页面,平均刷新几次 judging 的 submission 都会清空掉。还有一些情况,跟以往 PC^2 不同,以往因为 PC^2 老版本不支持,传统上都是一个题目只用一组测试文件的,但是这次因为 DOMjudge 支持,多数题目都有大约 10 组测试文件。尽管如此,除非是一些时限很长的题目,否则通常都很快,如果你们真的普遍觉得评测很慢(刚开始的故障时间和最后 10 分钟除外),请在评论区提出,我再查查到底是为什么。

封榜以后,我回到了裁判室。到了最后 30 分钟,我非常关心服务器压力的测评队列如何。到了最后 web server 和 mysql 的 CPU load 都到了 3-4,可以说是比较高了,但是因为有压力测试在先,这个压力应该说还是可以的。中间有一两分钟压力飚得特别高,可能出现了一些 500 系列错误,这些错误也引起了一些评测机下线,一度有所积压,后来很快就好了,在结束 10 分钟以前,没有形成太大问题,submissions 里头基本都是 Judging,极少的 queue。

Update:想起来了,最后半小时但是不是最后 10 分钟,应该是没有 500 系列错误的,挂了一波是因为上大外网挂了几分钟,引起 DNS 解析失败,然后 judgehost 就解析不出来 acmicpc.network 了。后来我赶紧给 judgehost 们加上了 hosts 就算解决了。

在最后 10 分钟,真的就是 10 分钟,就开始不行了,开始积压了,到了最后结束的时候,高峰积压了 400 个提交。因为 DOMjudge 的特性,结束后还是能提交上来的,只是会标记为 TOO-LATE,并且他还真的会测。又因为他 random judge 的特性,我在结束后没几秒就直接将提交的那个 php 在 nginx 里头仅用了,再也交不上来了。后面看来,这些提交多数都是脏交,有几个队伍不知道出于何种目的,把一份相同的没有 random 的代码交了特别多次,浪费了大量的评测资源,以后可以考虑禁止重复代码提交。

后面裁判室内就是把结果数据导入到各个系统出各种结果啦。因为是新系统,我将新旧系统出来的 Scoreboard 对比了很多次,才出了最终的成绩,并且跟组委会的各位老师反复讨论,定下了金银铜奖牌线。非常感谢组委会及黄金雄教授能同意我们提出的多发两个金牌的建议,使得最后多发了两个金牌,让所有通过 9 题的队伍都获得了金牌。

后面还帮忙出了若干报表和打印表格,例如 Google 的包的表格,也是写了一个小 py 结合了 Office 系列软件生成的表格。这些事情都不难啦,但是我两天就睡了五个小时,脑子实在很糊。

最后我导出备份数据的时候,发现数据库的 size 高达 35G,我 tar acf mysql.tar.gz 花了特别长时间,anyway 最后我和周公子那边都备份了一份 copy 走了。

最后,终于所有都结束了。跟 ICPC-Camp 的大佬们吃了一顿饭,就回北京了。感谢公司的年假制度!欢迎加入微软!感谢家属

的鼎力支持!

后话

我以前也提出过,我认为比赛最重要的是:命题裁判环境,后勤属于比赛那两天的生活保障了,相对比赛来说是次要的,礼品啥的更是锦上添花的。很可惜的是,近年来重视核心三项的主办学校越来越少了,很多主办学校不好好把核心三项的事情做好,整天不知道在糊弄什么。这里一定要表扬上海大学,办好如此大规模的比赛相当不容易,办了如此多年,无论在核心三项还是后勤、礼品等方面,都做得相当好,每年都还在坚持提高,相当不易。在同意我们进行技术革新这方面上,更是多数主板学校所缺乏的必要的魄力。这应当成为国内各赛区的标杆,其他学校主办比赛,确实可以好好参考一下上海大学。

当中出了因为我失误,出了若干事情,尤其是正赛开始的打印系统的问题,我再次向各位道歉,希望没有影响到大家比赛。

借这里,我想说个事情。我在 Facebook 上看到某著名前选手,抱怨说他经手的比赛他都想尽快把题目公开出来,优先挂到 Codeforces 让更多人受益,但是仅仅做点这点遇到那么大阻力云云。这位前选手,在比赛结束后我备份数据过程中,也进入裁判室向我讨要数据,被我断然拒绝。

这个事情我是这样看的:公开题目、数据,甚至是公开选手程序,我认同这是非常正确的事情,确实值得推广支持。但是,不是你觉得正确就可以直接做的,这涉及的问题是什么呢?

  1. 在中国大陆没有这个传统的情况下,大家没有默认这个事情,你应当跟主办方和命题方沟通确认,当主办方和命题方都同意的情况下,才可以公开测试数据。
  2. 同样,在中国大陆没有这个传统的情况下,你需要先征得选手同意,或者经主办方同意在比赛报名前声明,这场比赛我们会公开所有代码不爽不要玩,你才可以公开全部或者部分选手代码。
  3. 这个道理没有什么不能懂的。就像是你觉得开源是个非常好的事情,我也觉得开源是个非常好的事情,并不意味着你进入 Google 以后可以直接把 Big Table 的代码开源到网上。你只是一个经手人,或者说合作伙伴,甚至说什么都不是只是一个碰巧有权限接触到代码或者数据的人,你没有权限随意处理,这是一个基本的道德问题。
  4. 就算是已经形成了公开的传统,或者是主办方或命题方同意了公开代码。但是,在什么时候,在什么地方,由谁以什么形式公开多少,这仍然是一个需要商议确定的问题。你作为一个不知道哪里来的人,拿到了题目数据和选手代码,凭什么你就可以直接公开?你真以为你是什么权威人士或者业界大佬了?

在 12 月 2 日星期六,我们讨论完更换 DOMjudge 以后,昂神回 Google 内部的群讨论,结果第二天某著名前选手就开始在外面到处说 PC^2 不好明年要全换 DOMjudge。或许是我以小人之心度君子之腹,你如果真的觉得应该这样你为什么早不上偏偏我们开始行动你就开始叫嚣?坦白说我非常不喜欢这种屁事不做然后拿着别人做的事情到处叫嚣的人。

Changelog:

12/20 02:02:增加周公子出场安装 NTP 服务器,增加机器 16GB 内存原因,增加正赛打印挂掉的分析,增加最后半个小时中断小规模积压 judge 的原因分析。

12/20 10:04:改正部分表述,增加后话。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK