近幾天,《英雄聯(lián)盟》MSI可謂風(fēng)波不斷,先是RNG戰(zhàn)隊(duì)因延遲問題被判重賽引發(fā)國內(nèi)網(wǎng)友強(qiáng)烈不滿,RNG頗為給力三場重賽全勝掀起網(wǎng)友熱議。再是昨日T1對(duì)陣SGB的比賽中,T1上單Zeus第一視角畫面顯示其延遲僅有21ms,讓拳頭再次登上熱搜。今日(5月17日)拳頭游戲官方發(fā)長文回應(yīng)本次2022季中冠軍賽出現(xiàn)的一系列技術(shù)問題。
總結(jié):
1.在上海的選手屏幕顯示的 ping值是正確的
2.在釜山場館的選手屏幕顯示的 ping值不正確,并且比實(shí)際延遲低約13ms
3.未能及時(shí)發(fā)現(xiàn)的漏洞影響了比賽,對(duì)ping值顯示錯(cuò)誤問題的溝通也不夠及時(shí)透明。再次對(duì)此造成的問題和困擾致以深深的歉意。
概述
在過去的幾天,拳頭游戲電競技術(shù)團(tuán)隊(duì)在努力解決圍繞著2022季中冠軍賽的一系列技術(shù)問題,尤其在我們用來為線下選手和遠(yuǎn)程參賽選手平衡ping值的工具上。
我們初次發(fā)現(xiàn)的問題是一個(gè)存在于我們稱之為“延遲服務(wù)工具”中的錯(cuò)誤 -這個(gè)工具是用來將所有參賽選手的延遲(ping值)調(diào)整到 35ms范圍, 而該錯(cuò)誤會(huì)使在釜山場館中的選手在比賽時(shí)產(chǎn)生額外的延遲,并使得其實(shí)際延遲高于場館現(xiàn)場電腦屏幕上顯示的延遲(35ms)。因此,在遠(yuǎn)程對(duì)局中,在中國的選手是在 35ms ping值區(qū)間進(jìn)行比賽的,但在釜山的選手ping值則較之更高。很不幸,我們并沒有在季中冠軍賽開始之前發(fā)現(xiàn)這個(gè)問題,其根本原因是一個(gè)代碼漏洞錯(cuò)誤計(jì)算了延遲,導(dǎo)致該數(shù)值在日志中也是錯(cuò)誤的。因此,即使我們的監(jiān)控顯示一切正常,而實(shí)際上卻存在著錯(cuò)誤。
我們?cè)?月13日對(duì)該延遲服務(wù)工具進(jìn)行了配置修改,以解決這個(gè)漏洞。考慮到之前實(shí)際網(wǎng)絡(luò)延遲增加對(duì)釜山場館中的比賽造成的影響,我們做出了艱難但是必要的決定:對(duì)B組對(duì)局ping值不相同的三場比賽進(jìn)行重賽。
然而,5月13日這一配置修改帶來的另一個(gè)問題是,現(xiàn)在在釜山選手電腦屏幕上顯示的是錯(cuò)誤的、低于實(shí)際 ping值的數(shù)字 ——盡管實(shí)際ping值現(xiàn)在已被修正并確保對(duì)等。 其后果是,當(dāng)我們播放選手屏幕畫面時(shí),屏幕上會(huì)呈現(xiàn)一個(gè)錯(cuò)誤的較低的 ping值。同時(shí),由于我們團(tuán)隊(duì)沒能及時(shí)將這個(gè)外顯誤差進(jìn)行有效溝通,故而觀眾會(huì)認(rèn)為在場館里的選手正在以低于他們實(shí)際延遲的ping值進(jìn)行比賽。
本篇文章將從技術(shù)角度復(fù)盤從賽前到現(xiàn)在(小組賽結(jié)束)發(fā)生的整個(gè)情況。
賽前階段
當(dāng)我們開始計(jì)劃今年季中冠軍賽最后階段的技術(shù)設(shè)置時(shí),新冠疫情帶來的持續(xù)挑戰(zhàn)擺在了我們面前。LPL賽區(qū)代表隊(duì),Royal Never Give Up (RNG) 不會(huì)從上海前往釜山,而會(huì)遠(yuǎn)程參賽。
表面上看,簡單的解決方案是讓遠(yuǎn)程參賽的隊(duì)伍連到季中冠軍賽比賽服務(wù)器就行,其他隊(duì)伍在線下進(jìn)行比賽。然而這樣的解決方案也并不理想,存在諸多問題。
問題之一就是釜山和上海之間相隔大概 850 公里(中間隔著黃海)。這意味著,網(wǎng)絡(luò)通信需要在上海和韓國的季中冠軍賽比賽服務(wù)器之間來回傳輸。
數(shù)據(jù)在客戶端和服務(wù)器間往返傳輸所需的時(shí)間就是我們常說的“ping值”(又稱為延遲)。從 RNG 俱樂部所在地到季中冠軍賽的比賽服務(wù)器,大約自然延遲是 35毫秒(ms) 。 而且其他十支參賽隊(duì)伍會(huì)在釜山的比賽場館里參賽,他們的延遲會(huì)低很多,大約在 15ms左右。請(qǐng)注意,我們本文里的ping值通常都指一個(gè)范圍,因?yàn)閜ing值常會(huì)在+/-5ms的極小范圍內(nèi)波動(dòng)。
如果是一名普通《英雄聯(lián)盟》玩家,35ms 到 15ms 之間的差異或許是很難察覺到的。但對(duì)職業(yè)選手來說,這足以改變比賽手感,產(chǎn)生細(xì)微但仍能察覺到的差異。拳頭游戲電競賽事核心原則中的一條,就是保證競賽公平性。我們希望讓所有參賽的隊(duì)伍,能夠在平等競技條件下競賽。
既然說到平等競賽環(huán)境,那我們說明一下ping值差異問題。
讓遠(yuǎn)程參賽成為可能
因?yàn)殡姼傎愂率窃诰W(wǎng)絡(luò)上進(jìn)行的,我們希望能尋找一些遠(yuǎn)程參賽的辦法。
但隨之而來的兩個(gè)問題是:
?。?)上海和釜山之間 35ms 的延遲是否能夠保證最高水準(zhǔn)的競技發(fā)揮?
?。?)我們是否能提供同等競賽環(huán)境,讓所有選手都有相同的延遲?
對(duì)于第一個(gè)問題的回答是:“是”。對(duì)于英雄聯(lián)盟電競賽事來說,在最高級(jí)別的比賽中,我們認(rèn)為最高可忍受的延遲極限為 40ms(上下浮動(dòng)5ms)。 通過與內(nèi)部和外部合作伙伴,包括我們內(nèi)部的游戲分析和設(shè)計(jì)團(tuán)隊(duì)的深入討論和分析,我們?cè)?020年中確認(rèn)了這個(gè)范圍。當(dāng)ping值超過40ms范圍時(shí),大部分職業(yè)選手會(huì)開始注意到延遲,它也開始影響諸如英雄選擇、技能釋放以及對(duì)對(duì)手的操作做出快速反應(yīng)的能力。
對(duì)于第二個(gè)問題的回答,我們考慮了以下幾個(gè)方案:
方案一:每支隊(duì)伍都在自然延遲下進(jìn)行比賽
該方案建議,遠(yuǎn)程參賽隊(duì)可自行選擇所擁有的最快速網(wǎng)絡(luò),直連到季中冠軍賽比賽服務(wù)器。這意味著現(xiàn)場參賽隊(duì)伍會(huì)在低 ping值(~15ms)下比賽,而遠(yuǎn)程參賽隊(duì)伍(以RNG為例)則要在其自然延遲下比賽。從中國連接到釜山的自然延遲約為 35ms。
我們考慮過,但還是否決了這個(gè)方案。因?yàn)榛诟傎惞叫缘脑瓌t,我們希望保證對(duì)每個(gè)參賽隊(duì)伍的公平。
方案二:將服務(wù)器架設(shè)于韓國和中國的中間點(diǎn)
還有一種解決方案是,如果中韓兩國之間的ping值是 35ms,直接把服務(wù)器放在兩地中心點(diǎn),延遲均分,不就各自只有 17.5ms 了嗎?實(shí)際上這個(gè)方案的實(shí)施仍然具有諸多挑戰(zhàn)…其中一個(gè)最大的問題是,要在汪洋大海中間架設(shè)服務(wù)器。
方案三:使用人工延遲
所以如果在韓國參賽的隊(duì)伍ping值很低,而在中國參賽的隊(duì)伍ping值又相對(duì)較高,那給韓國那邊加上一些延遲使兩邊對(duì)等,這可行嗎?我們能做到嗎?
事實(shí)證明,《英雄聯(lián)盟》的開發(fā)團(tuán)隊(duì)已經(jīng)有了一種引入人工延遲的方法,即延遲服務(wù)(Latency Service)。也有人叫它:“假ping”。這是一種客戶端/服務(wù)器功能,旨在解決疫情下,遠(yuǎn)程競賽需要公平競賽環(huán)境的需求。延遲服務(wù)允許我們?cè)O(shè)置一個(gè)目標(biāo)值(如 35ms),它會(huì)在客戶端和服務(wù)器上為每個(gè)玩家加入延遲,使大家保持基本相同的延遲水平。
我們?cè)晒Φ卦谶^去一些英雄聯(lián)盟電競賽事里運(yùn)用了該工具,當(dāng)時(shí)的比賽都是遠(yuǎn)程進(jìn)行的。但這次是首次在全球性賽事上使用這一工具,并且其中部分選手還在釜山本地場館進(jìn)行對(duì)局。雖然我們之前使用過,但環(huán)境中的部分細(xì)微差異總有可能造成我們無法預(yù)見的錯(cuò)誤。在訓(xùn)練賽服務(wù)器上的人工延遲應(yīng)用效果比較理想,再加上我們長期使用的可靠網(wǎng)絡(luò)基礎(chǔ)設(shè)施和測(cè)試方法,我們當(dāng)時(shí)認(rèn)為已經(jīng)有足夠多的應(yīng)用實(shí)例,能在小組賽階段之前發(fā)現(xiàn)所有的重大問題。
我們的選擇
再三衡量各種方案后,我們認(rèn)為最重要的是保證競賽公平性,那么使用方案三 - 人工延遲便是最好的解決方案。
了解人工延遲:它的工作原理
延遲服務(wù)工具內(nèi)置在《英雄聯(lián)盟》的本地客戶端/服務(wù)器端的網(wǎng)絡(luò)協(xié)議棧中。它會(huì)持續(xù)測(cè)量每個(gè)玩家和服務(wù)器之間的實(shí)際網(wǎng)絡(luò)延遲,根據(jù)需要,通過添加延遲進(jìn)行調(diào)整,以達(dá)到目標(biāo)延遲值。這是一種客戶端/服務(wù)器端解決方案,目的是通過引入延遲來保證雙方的延遲均等。
上圖顯示了系統(tǒng)的各個(gè)組件。圖片頂部是游戲服務(wù)器組件,底部是游戲客戶端(選手的電腦)。在目前這種情況下,延遲服務(wù)的目標(biāo)延遲值為 35ms。圖中的紅色箭頭表示存在的實(shí)際網(wǎng)絡(luò)延遲。正如所看到的,釜山的選手 1 和選手 2 顯示為 15ms 的“真實(shí)”ping值,而上海的選手 10 顯示為 35ms的ping值。黃色框表示在客戶端和服務(wù)器端人為添加了多少延遲。在這種情況下,選手 1 和選手 2 分別向客戶端和服務(wù)器端添加了 10ms 的延遲,達(dá)到了目標(biāo)延遲 35 ms。選手 10 已經(jīng)具有等于目標(biāo)延遲 35 ms 的實(shí)際延遲,因此沒有添加延遲(0ms)。
同等競賽環(huán)境還是兩個(gè)不同的競賽環(huán)境?
想要深入了解這一話題,可能要提起我們?cè)?jīng)對(duì)于遠(yuǎn)程環(huán)境和本地環(huán)境所做的一個(gè)決定。
對(duì)于電競賽事技術(shù)團(tuán)隊(duì)來說,我們一直追求把現(xiàn)場賽事的風(fēng)險(xiǎn)降到最低。2012年洛杉磯,第二屆全球總決賽比賽因網(wǎng)絡(luò)問題被迫中斷。這段回憶,將永遠(yuǎn)烙刻在所有拳頭電競?cè)诵闹小?nbsp;
在決定2022 季中冠軍賽的網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)時(shí),我們意識(shí)到必須在兩種不同的策略之間做出決定。
策略一:所有場景下使用同等種網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)
在國際比賽中,我們的競技比賽都是在使用場館內(nèi)的線下服務(wù)器上。這為我們提供了高度的可靠性,因?yàn)樗试S我們直接控制網(wǎng)絡(luò)和服務(wù)器硬件??紤]到有一支隊(duì)伍遠(yuǎn)程參賽,那么就必須構(gòu)筑這樣一個(gè)場景:至少會(huì)有一支隊(duì)伍將通過互聯(lián)網(wǎng)服務(wù)器進(jìn)行比賽。那么如果有一支隊(duì)伍需要通過互聯(lián)網(wǎng)服務(wù)器參賽,一個(gè)策略就是徹底放棄我們的本地部署,轉(zhuǎn)而讓所有隊(duì)伍都通過互聯(lián)網(wǎng)服務(wù)器進(jìn)行比賽。
鑒于穩(wěn)定性原則,我們知道如果必須架設(shè)互聯(lián)網(wǎng)比賽服務(wù)器,那就要選擇十分信得過的部署方案。很顯然,韓國的比賽服務(wù)器是值得考慮的選擇。這是一個(gè)僅供職業(yè)比賽使用的環(huán)境,和韓國公共服務(wù)器位于同一數(shù)據(jù)中心,并常用于LCK韓國聯(lián)賽。同樣這也意味著這個(gè)服務(wù)器有無數(shù)小時(shí)的運(yùn)行數(shù)據(jù)來驗(yàn)證其網(wǎng)絡(luò)的良好連通性和架構(gòu)的可信賴性。所以當(dāng)至少有一支隊(duì)伍需要遠(yuǎn)程參賽時(shí),用這個(gè)節(jié)點(diǎn)是合理的。但接下來的問題是,是應(yīng)該在所有比賽中使用它,還是只針對(duì)遠(yuǎn)程比賽使用。這便引出了策略二:最小化網(wǎng)絡(luò)風(fēng)險(xiǎn)。
策略二:僅在必要時(shí)使用遠(yuǎn)程參賽,最小化網(wǎng)絡(luò)風(fēng)險(xiǎn)
在之前的策略中,考慮到某些比賽需要在互聯(lián)網(wǎng)環(huán)境中進(jìn)行,那么問題就變成了:“何不統(tǒng)統(tǒng)放在這個(gè)環(huán)境下呢?”這個(gè)答案很簡單:互聯(lián)網(wǎng)的可靠性?;ヂ?lián)網(wǎng)有時(shí)候風(fēng)平浪靜,有時(shí)候則未必。如果所有季中冠軍賽比賽都在互聯(lián)網(wǎng)服務(wù)器上進(jìn)行,那么任何網(wǎng)絡(luò)問題都可能導(dǎo)致比賽在進(jìn)行中出現(xiàn)問題。如果只是遠(yuǎn)程比賽通過互聯(lián)網(wǎng)進(jìn)行,那網(wǎng)絡(luò)出現(xiàn)問題的概率就會(huì)大大降低。我們相信通過我們的計(jì)劃,能夠?qū)L(fēng)險(xiǎn)降到最低。由于我們相信我們有能力通過使用人工延遲來實(shí)現(xiàn)ping值在同等競賽環(huán)境,所以這只是一個(gè)復(fù)雜性與可靠性的簡單問題。為了實(shí)現(xiàn)更低的風(fēng)險(xiǎn)(減少互聯(lián)網(wǎng)的不可靠性),我們?cè)黾恿艘稽c(diǎn)復(fù)雜性(兩種網(wǎng)絡(luò)架構(gòu)設(shè)計(jì))。
考慮到這兩種選項(xiàng),并基于我們的評(píng)估,我們決定采用策略二,它能夠?yàn)橘愂碌目煽啃院透傎惞叫詭碜畹偷娘L(fēng)險(xiǎn)。
下方的圖表就是我們所選擇的網(wǎng)絡(luò)架構(gòu)設(shè)計(jì),展示了在不同情況下網(wǎng)絡(luò)是如何鏈接運(yùn)行的。
最合理方案
考慮到以上種種因素,我們決定在使用人工延遲服務(wù)并維持競賽公平性的情況下支持兩種不同的網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)。兩支都在場館的隊(duì)伍比賽時(shí),將使用架設(shè)在季中冠軍賽場地內(nèi)的本地服務(wù)器。而對(duì)上遠(yuǎn)程參賽隊(duì)伍時(shí),對(duì)戰(zhàn)雙方均在韓國數(shù)據(jù)中心的比賽服務(wù)器上進(jìn)行比賽。拳頭游戲電競技術(shù)團(tuán)隊(duì)設(shè)置了系統(tǒng)并進(jìn)行了基礎(chǔ)架構(gòu)測(cè)試,以確保一切運(yùn)轉(zhuǎn)正常。其中包括了各種測(cè)量和監(jiān)控,如 ping值、網(wǎng)絡(luò)抖動(dòng),以及對(duì)丟包的仔細(xì)檢查。我們也讓隊(duì)伍在這個(gè)比賽服務(wù)器上進(jìn)行訓(xùn)練賽,并讓他們來到現(xiàn)場,進(jìn)行技術(shù)測(cè)試。
但在第一比賽日結(jié)束后,選手告訴我們,比賽的時(shí)候感覺很卡。部分選手表示,即便游戲屏幕上顯示 35ms,但實(shí)際體感卻高于 35ms。當(dāng)時(shí)我們所有的日志和基礎(chǔ)架構(gòu)監(jiān)控顯示一切正確,但我們決定繼續(xù)調(diào)查,找出問題的原因。
找尋漏洞
引起這些問題的原因還是不清楚。由于架構(gòu)監(jiān)控工具并沒有匯報(bào)錯(cuò)誤,但我們卻收到報(bào)告說比賽很卡。我們?nèi)鄙偬囟┒椿蛱囟ㄓ螒騼?nèi)情況來定性。于是我們又回到了基礎(chǔ)問題上。哪些數(shù)據(jù)是可用的?我們手里都有哪些日志?我們能收集到什么信息?
對(duì)此我們采取了兩步走的做法。首先是向參賽的職業(yè)隊(duì)伍收集問題,幫我們理解情況,到底哪里出了岔子。你們是在哪兒發(fā)現(xiàn)問題的?是場館服務(wù)器還是比賽服務(wù)器?是場館網(wǎng)絡(luò)環(huán)境還是訓(xùn)練賽環(huán)境?是所有對(duì)局都這樣?還是只是個(gè)別情況?與此同時(shí),因?yàn)闃?biāo)準(zhǔn)報(bào)告沒有顯示任何錯(cuò)誤,所以我們開始查看其他日志和指標(biāo),尋找任何可能的差異。我們也提取了賽事客戶端和服務(wù)器端的日志,并開始深入研究。
更多內(nèi)容:英雄聯(lián)盟專題英雄聯(lián)盟論壇
從來沒見過這么抽象的策劃。
帶著律師身份證明,在法庭上拍下桌子,提出針對(duì)證人證詞的漏洞。此時(shí)此刻,我猜你要大喊一聲“異議!”了,但是稍等,這里不是《逆轉(zhuǎn)裁判》。這里是《無罪之庭》!
深夜看罷《首爾之春》,恍惚間似有軍靴踏過書房的木地板。這部以1979年韓國軍事革命為底色的影片,既非簡單的正邪對(duì)抗,亦非熱血的英雄敘事,倒像一柄冰冷的手術(shù)刀,剖開了權(quán)力肌理中最隱秘的毛細(xì)血管。