两年前博客(+ 微信订阅号)做过一篇特稿,分析了“公开渠道的教务系统 2016 年 1 月选课期间的一些日志”。写那篇文章让我直面了刷课这个事情,还意外地小小采(tiao)访(xi)了下某个同学。

两年过去,变化还是挺大的。比如,我校教务处终于把新的教务系统完整上线了。还比如,自从上个月新教务系统第一次选课开始,更多的人听说了“刷课”这个词。已经不需要抢课的我,只听说了这次选课期间有人卖课啥的。虽然实际上可能并没这么“道德沦丧”,但大家对这个行为的不齿,是多了一些。

我好奇的是,为啥 2018 年的刷课行业发展成这样子了?新的教务系统并没有可以从公开渠道获取的日志,不过从旧教务系统里看过去几年的趋势,还是可以的。于是这次我使用 Elastic Stack 处理了更大跨度的数据(灌数据进去挺折腾的,不过非常高效),从 2014 到 2017 年选课期间的本科选课操作日志中,得到了下面的一些数据。(以下数据均来自旧教务系统,下简称“教务系统”)

如果太长不想看,这是五组数据的梗概:

一. 大二到大三、2016 至今,进入刷课频道:2017 年暑假 2015 级选课期间操作次数人均 496 次,创了记录。
二. “刷课”一直是少数,但这 0.5% 的玩家越来越多:四年来用户操作次数中位数保持在 50 - 65 之间,刷课的人数成倍增加,在 2017 年寒假达到顶峰。
三. 教务系统的压力从来不小,峰值 QPS 95,大多因为“人多”:选课第一天明明不用抢也是挤爆,卡起来就是死 10 秒钟又闪现 20 秒的体验。
四. 单用户刷课平均每秒 17 次,问你怕不怕:靠刷课党们一“己”之力,还是可以把教务系统搞慢的,最疯狂的人连续一分钟操作 1060 次。
五. 午夜档的热闹从第二阶段开始,刷课党也就个位数:如 2017 年暑假第二阶段的第一场午夜档 218 人参加,其中操作频率极高的也就 5 个人。

一. 大二到大三、2016 至今,进入刷课频道

按年级绘图的选课期间人均操作次数,年级指选课时的目标学期,年份为入学年份

先看看每个人选课有关的操作次数的年级平均值。很明显,人进入大二之后,大家开始意识到选课没那么容易,选课操作次数的增加体现出了焦虑感。到了大三,2013 级和以前是下降的趋势,而 2014 级开始,不知是技术增强了还是啥情况,操作次数越来越多,直到大四才回归平静。

按年份绘图的选课期间年级人均操作次数,年份+时间指选课时间,纯年份为入学年份

把线平移一下,改改坐标轴,2016 年成为了刷课次数增加的关键之年。这个图里 2015 级的选课次数冲出了天际,2017 年的两次选课人均 469、496 次,跟 2014 级的最高纪录 318 次相比,真是要冲破天花板了(顺便提示一下 Y 轴是指数坐标轴,所以差距看起来似乎不大)。

二. “刷课”一直是少数,但这 0.5% 的玩家越来越多

提到刷课这个词,大家通常会想到那种技术宅,通过代码达到普通人达不到的手速和耐心。最初我并不敢这么想,毕竟只要有耐心,刷上几百次也很正常嘛,这样的有罪推定还是挺不靠谱的。然而两年前看过具体的日志之后,我对当时选课期间操作超过 5000 次的用户的结论是:

有的是用类似浏览器自动刷新的方法在辅助操作,有的是每秒钟成功刷新五六次(还让不让人活了),最厉害的呢,从下午开始连续刷新了 7 个小时,肯定是开了挂(我就不信您不吃晚饭)。

这些年过来,刷课的人数变多了吗?通过对每次选课的选课操作次数的人均分布统计,结论见下。

把图做完之后我还蛮意外的,曲线统一的形状让我一度以为自己算错了。然后我在 Access 里折腾了好久把中位数算出来,都在 50 - 65 之间,所以应该没错。

图的结论就是,这么多年,选课次数分布没有大的变化,但刷课顶峰值是一年比一年高,尤其从 2016 年暑假那次选课开始。结合第一节的图,2017 暑的回落可能的原因是 2014 级变成大四老油条了,和 2016 级迷之不抢课、选课次数减少。再次提示,这回 X 轴是指数坐标轴。

曲线为每次选课中每人操作次数分布情况(Y 轴为累计百分数),条形图为超过 5000 次操作的人数

再仔细看看顶峰 3% 的三五百人。两年前的“5000 次操作就是刷课”的假设暂且可以沿用下来,因为这部分人数保持在占全体 0.5% 以内。随着年份推进,刷课的人数成倍增加,尤其在 2017 寒达到顶峰。至于说 2018 寒的情况,这里没有数据,不过我猜是少不下来了。

三. 教务系统的压力从来不小,峰值 QPS 95,大多因为“人多”

刷课对教务系统会有多大影响呢?虽然有些不控制频率的刷课行为是很不好的(我方表示强烈谴责),然而目前教务系统的主要压力还是来自“人多”。

各选课阶段中粗略统计的最高 QPS

先介绍一个指标 QPS (Queries Per Second),也就是每秒钟服务器处理的请求数。采用了新的统计工具之后,我终于能快速地从日志中观察这个指标了。

1.1 和 1.2 是第一阶段的两个小阶段,分别进行一次抽签,选课没有先后。2 阶段是先到先得,3 阶段是退换课,也是先到先得。刷课是第 2、3 阶段会出现的。

从表里可以看到,选课刚开始的 1.1 阶段人是最多的(14 寒那个不知道是什么鬼情况)。明明是抽签,登录系统选课并没有先后,但开放选课的第一天就是容易挤爆门。然后旧教务系统的 QPS 极限大概就是 95 了。当然 2017 年寒假第 2 阶段的爆炸挺反常,那一分钟服务器只接待了 12 人,跟之前 200+ 的水平差距太多。看来区区几个人还是有能力把系统刷爆的,我们待会看。

从日志就可以感受到人最多的时候,那种服务器的卡顿,就是死个 10 秒钟又闪现 20 秒的体验。

2016 年寒假 1.1 阶段第一天某时段的请求数曲线,Y 轴为每秒请求数

最糟的莫过于整台服务器“挂了”,就是连续一两分钟服务器都没反应那种。2016 年寒假开放选课第一天,这种情况就出现了三次。

2016 年寒假开放选课第一天的三次低谷,Y 轴为每分钟请求数

四. 单用户刷课平均每秒 17 次,问你怕不怕?

刚才提到 2017 年寒假第 2 阶段的疯狂,究竟是怎么一回事呢,今天让我们走近科学(误)。

2017 年寒假第一、二阶段分年级每小时操作次数曲线

先看上面这个图的高峰时段。1.1 阶段第一天的高峰,主要集中在 10 点和
12 点两拨,基本上可以看出各年级的上课时间(和上课专心程度)。1.1 和 1.2 阶段之间的高峰,主要是因为教务系统抽签结果通常会提前发布、大家迫不及待想知道选上课了没。

回到我们关注的第 2 阶段。还是要接着解释一下曲线,顺便对比一下的。

  • 大一青色曲线的高峰出现在 11 号 17:57,也就是快要开始第二阶段的时候。可以认为是大量萌新出来捡漏。
  • 大二红色曲线可就厉害了,几个非常诡异的顶峰出现在 13 号的白天。最顶峰在当天晚上 9 点左右,基本可以认定是他们把教务系统推到了 QPS 90 的高度
  • 大三黄色的顶峰出现在 13 号 0 点。这是学长学姐熬夜比较强的意思吗。
  • 大四黑色冒出来的那 15 个小时只有一个人操作频繁。我看了下,是个法学院的妹子……

具体看 13 号晚上 8:00 - 9:30 的数据。每分钟操作频率超过 60 次的朋友有 7 位,其中 6 位是大二。他们分别来自软院、法学、机车、数院(这里不跟上次一样挂人了,没意思)。其中最疯狂的朋友在连续的一分钟内刷新了 1060 次,也就是平均每秒 17 次,让我大开眼界。原来靠他们一己之力,还是可以把教务系统搞慢的。

于是在 21:13:20, 教务系统的 QPS 达到 90 之后又坚持了 20 秒,终于撑不住歇了一会。

2017 年 1 月 13 日 21:13 教务系统每秒访问次数曲线,红线为 QPS 90 时刻

五. 午夜档的热闹从第二阶段开始,刷课党也就个位数

2017 年暑假第二阶段操作次数曲线,Y 轴单位 次/半小时

从 2016 年暑假选课开始,午夜档剧场就开始热播了。这时候,午夜档还只在第二阶段最后一天凌晨开播。而到了 2017 年寒假,午夜档从第二阶段开始连播三天(最后一天人少得很)。上面这图是 2017 年暑假的午夜档,也是从第二阶段开始连播两天,最后一天就散场了。

2017 年 8 月 26 日每小时操作次数和在线用户数

基本上,都是第一场午夜档最热闹。比如上面这图,2017 年暑假第二阶段的第一场,218 人参加,不过显然大部分人还是看热闹,还没坚持到 2 点就睡着了。2:00 - 6:59 参加的有 45 人,不过每个小时最多就 17 个人,开个小厅给他们就足够了,因为不少人还会出去看看月亮,找个地方静静。而这四十多人里,操作频率极高的也就 5 个人,整场下来上万次吆喝,对他们来说是再正常不过了。

好多人想趁第 2 阶段换课啥的,在这种情况下似乎挑午夜档也并不保险,操作需要智慧,也需要运气。当然新教务系统是个什么情况我就不知道了。

结语

看完数据,感觉刷课的人还是那么少,虽然数量在增加,但“少数”这个性质没变。可能人数变多了,接着有人得瑟起来之后,大家就都知道这种不齿的行为了。

写这种文章还是得站个队的。两年前写完那篇特稿之后的下一次选课,我用了不到 100 行代码,捡了一门别人的退课(上过课才知道为啥他们退课),说起来也不是那么光彩。不过我的观点依然跟两年前一样,所以直接引用之前写过的话好了:

教务系统没有对刷新频率做限制,这个是很不好的做法。但这也不意味着说,一个网站亦或系统的用户,可以采用非正常的方法,一秒钟连续刷新页面好多次,无端地增加系统负荷,这叫做“滥用”。想彻底避免道德问题,还是得用技术方法来解决。

这个事情,跟抢火车票差不多的道理。技术可以代替人的重复劳动,从对信息的了解和技术的掌握而言,“抢”这个规则本身还是存在不公平的。从反制的角度说,技术可以解决一部分问题,但更重要的是制定规则,这样之后,刷课技术的加成导致的落差就没那么悬殊了。

转过头想,似乎管选课这个事情还是挺难的,难在要面对其他人的态度。或许这就是社会主义初级阶段吧。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. (Find out more about Webmentions.)