議光鏈路可靠性設(shè)計(jì):檢測(cè)、隔離與恢復(fù)實(shí)戰(zhàn))
1. 光鏈路可靠性設(shè)計(jì)的整體思路拆解1.1 為什么光鏈路在 scale_up 協(xié)議里是個(gè)“特殊角色”聊 scale_up 協(xié)議里的光鏈路可靠性得先把場(chǎng)景擺清楚。scale_up 通常指的是在同一個(gè)高速互聯(lián)域內(nèi)把幾十甚至上百個(gè)計(jì)算節(jié)點(diǎn)用高帶寬鏈路連成一個(gè)整體讓它們像一臺(tái)機(jī)器一樣協(xié)同工作。這個(gè)域里光鏈路承擔(dān)的是跨機(jī)架、跨柜甚至跨排的高帶寬低延遲傳輸任務(wù)。和傳統(tǒng)數(shù)據(jù)中心里“能通就行”的以太網(wǎng)不同scale_up 域內(nèi)的光鏈路一旦抖動(dòng)或瞬斷影響的不只是某一條流而是整個(gè)并行任務(wù)的同步節(jié)奏。我打個(gè)比方電鏈路像城市里的普通道路偶爾堵一下繞一繞還能走光鏈路在 scale_up 里更像高鐵專線一趟晚點(diǎn)整條線路的調(diào)度表都得重排。所以可靠性設(shè)計(jì)的目標(biāo)不是“永不故障”而是“故障發(fā)生時(shí)系統(tǒng)感知快、切換快、恢復(fù)快且不把上層任務(wù)拖垮”。這里有個(gè)關(guān)鍵認(rèn)知光鏈路的可靠性不能只盯著光模塊本身。它是一條從電芯片、驅(qū)動(dòng)、光器件、光纖、連接器到對(duì)端接收的完整鏈路任何一環(huán)出問(wèn)題都會(huì)表現(xiàn)為鏈路誤碼或閃斷。因此設(shè)計(jì)思路必須是端到端的而不是單點(diǎn)加固。1.2 可靠性設(shè)計(jì)的三層目標(biāo)檢測(cè)、隔離、恢復(fù)我在實(shí)際項(xiàng)目里把光鏈路可靠性拆成三層目標(biāo)這樣拆的好處是每一層都能獨(dú)立驗(yàn)證不會(huì)混在一起扯皮。第一層是快速檢測(cè)。鏈路出問(wèn)題時(shí)最怕的是“半死不活”——誤碼率升高但沒(méi)完全斷上層還在傻等。所以檢測(cè)機(jī)制要能區(qū)分“完全斷鏈”和“高誤碼但仍在通”兩種狀態(tài)前者靠鏈路狀態(tài)信號(hào)后者靠誤碼統(tǒng)計(jì)和前向糾錯(cuò)計(jì)數(shù)。第二層是故障隔離。檢測(cè)到異常后要能快速把問(wèn)題鏈路從可用池里摘出去避免它繼續(xù)參與流量調(diào)度。這里涉及路由收斂速度和鏈路標(biāo)記機(jī)制后面會(huì)細(xì)講。第三層是恢復(fù)與重入。鏈路修好后不能直接全速放回得有個(gè)“觀察期”確認(rèn)誤碼穩(wěn)定在閾值以下再逐步加流量。這個(gè)漸進(jìn)式重入是我踩過(guò)坑之后才加上的早期直接放回導(dǎo)致過(guò)二次抖動(dòng)。提示三層目標(biāo)里檢測(cè)層的誤碼閾值設(shè)定最講究。設(shè)太松壞鏈路拖累全局設(shè)太緊好鏈路被誤殺。后面有具體的參數(shù)計(jì)算過(guò)程。1.3 方案選型為什么不用“全冗余”一刀切有人會(huì)問(wèn)既然光鏈路這么關(guān)鍵為什么不直接每條鏈路配一條備份主備切換不就完了這個(gè)思路在小規(guī)模場(chǎng)景可行但在 scale_up 域里成本會(huì)爆炸。假設(shè)一個(gè)域有 128 個(gè)節(jié)點(diǎn)全互聯(lián)光鏈路數(shù)量是節(jié)點(diǎn)數(shù)的平方級(jí)再翻倍做冗余光模塊和光纖的采購(gòu)、功耗、機(jī)柜空間都扛不住。所以實(shí)際方案是共享冗余 快速重路由。也就是不追求每條鏈路都有專屬備份而是讓流量在檢測(cè)到故障后快速繞到其他可用鏈路上。這要求協(xié)議層支持多路徑和快速收斂同時(shí)對(duì)光鏈路本身的健康度有精細(xì)的度量。另一個(gè)選型點(diǎn)是前向糾錯(cuò)FEC的檔位。FEC 能糾正一定比例的誤碼但檔位越高延遲和功耗越大。scale_up 場(chǎng)景對(duì)延遲敏感所以不能無(wú)腦上最高檔 FEC。我的做法是分場(chǎng)景配置短距離、質(zhì)量好的鏈路用低檔 FEC 保延遲長(zhǎng)距離、經(jīng)過(guò)多個(gè)連接器的鏈路用中高檔 FEC ??煽啃?。2. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)2.1 光鏈路健康度的關(guān)鍵指標(biāo)有哪些要談可靠性先得定義“健康”。我日常盯的指標(biāo)主要有這幾個(gè)誤碼率BER最直接的指標(biāo)但要注意區(qū)分瞬時(shí)值和滑動(dòng)窗口平均值。瞬時(shí)值用于快速告警滑動(dòng)窗口用于趨勢(shì)判斷。前向糾錯(cuò)糾正計(jì)數(shù)FEC 糾正了多少比特這個(gè)數(shù)字比 BER 更早反映鏈路劣化。因?yàn)?FEC 還在糾錯(cuò)時(shí)BER 可能看起來(lái)還行但糾正計(jì)數(shù)已經(jīng)在漲。光功率收發(fā)電平發(fā)送功率和接收功率的絕對(duì)值及差值。接收功率過(guò)低說(shuō)明衰減大過(guò)高可能過(guò)載。鏈路狀態(tài)信號(hào)物理層的鏈路 up/down 信號(hào)用于檢測(cè)完全斷鏈。溫度與電壓光模塊內(nèi)部溫度漂移會(huì)影響波長(zhǎng)和輸出功率是隱性殺手。這些指標(biāo)不是孤立的。我遇到過(guò)接收功率正常但 FEC 糾正計(jì)數(shù)飆升的情況最后查出來(lái)是連接器端面有輕微污染導(dǎo)致信號(hào)質(zhì)量下降但功率沒(méi)明顯變化。所以指標(biāo)要聯(lián)合看。2.2 誤碼閾值怎么定一個(gè)可復(fù)現(xiàn)的計(jì)算過(guò)程誤碼閾值定多少不能拍腦袋。我一般按下面的步驟算第一步確定上層業(yè)務(wù)能容忍的最大丟包率。假設(shè) scale_up 域內(nèi)跑的是集合通信一次 all-reduce 的同步周期是 100 微秒業(yè)務(wù)能容忍的額外延遲是 1 微秒那么鏈路誤碼導(dǎo)致的丟包重傳不能超過(guò)這個(gè)量級(jí)。第二步把丟包率換算成 BER。假設(shè)一個(gè)數(shù)據(jù)包 4KB即 32768 比特丟包率 1e-6 對(duì)應(yīng) BER 大約是 1e-6 / 32768 ≈ 3e-11。這是業(yè)務(wù)層面的底線。第三步考慮 FEC 的糾錯(cuò)能力。如果 FEC 能糾正 1e-5 的 BER那么鏈路 BER 在 1e-5 以下時(shí)業(yè)務(wù)基本無(wú)感。但為了留余量我把告警閾值設(shè)在 FEC 糾錯(cuò)能力的 1/10即 1e-6。第四步設(shè)置兩級(jí)閾值警告閾值1e-7觸發(fā)監(jiān)控加強(qiáng)和日志記錄隔離閾值1e-6觸發(fā)鏈路摘除。這樣有個(gè)緩沖帶不會(huì)因?yàn)樗矔r(shí)抖動(dòng)直接摘鏈路。實(shí)際配置時(shí)這些閾值要寫進(jìn)鏈路監(jiān)控模塊的配置文件并且支持熱更新方便現(xiàn)場(chǎng)調(diào)試。2.3 鏈路標(biāo)記與路由收斂的配合檢測(cè)到壞鏈路后怎么讓路由層知道我們用的是鏈路標(biāo)記機(jī)制。每條光鏈路在協(xié)議里有一個(gè)健康狀態(tài)字段取值包括正常、警告、隔離、恢復(fù)中。路由模塊定期讀取這個(gè)字段決定是否把該鏈路加入可用路徑集合。這里有個(gè)坑路由收斂速度要和檢測(cè)速度匹配。如果檢測(cè)很快但路由收斂慢壞鏈路還會(huì)被用一段時(shí)間如果路由收斂快但檢測(cè)慢壞鏈路已經(jīng)造成丟包了才被摘除。我的經(jīng)驗(yàn)是讓檢測(cè)周期和路由更新周期保持在同一量級(jí)比如都是 1 毫秒級(jí)這樣兩者不會(huì)互相拖后腿。另外隔離動(dòng)作要先通知再執(zhí)行。也就是先把鏈路標(biāo)記為隔離等路由模塊確認(rèn)不再使用該鏈路后再真正關(guān)閉光模塊發(fā)送。這個(gè)順序能避免正在傳輸?shù)臄?shù)據(jù)包突然中斷。3. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)3.1 監(jiān)控模塊的部署與參數(shù)配置監(jiān)控模塊我一般部署在每個(gè)節(jié)點(diǎn)的管理核上獨(dú)立于數(shù)據(jù)面運(yùn)行避免影響轉(zhuǎn)發(fā)性能。它通過(guò)帶外通道讀取光模塊的寄存器采集前面說(shuō)的那些指標(biāo)。配置上采樣周期設(shè)為 100 微秒滑動(dòng)窗口設(shè)為 1 秒。為什么是這兩個(gè)數(shù)100 微秒能捕捉到瞬時(shí)抖動(dòng)1 秒窗口能平滑掉正常波動(dòng)。如果采樣太慢閃斷會(huì)被漏掉如果窗口太短正常的光功率波動(dòng)會(huì)觸發(fā)誤告警。配置文件的關(guān)鍵字段如下optical_link_monitor: sample_interval_us: 100 sliding_window_ms: 1000 ber_warning_threshold: 1e-7 ber_isolate_threshold: 1e-6 fec_correction_warning: 1000 fec_correction_isolate: 10000 rx_power_min_dbm: -10 rx_power_max_dbm: 2 temperature_max_c: 70這些值不是通用的要根據(jù)具體光模塊型號(hào)和鏈路長(zhǎng)度調(diào)整。比如長(zhǎng)距離鏈路接收功率下限要放寬短距離鏈路溫度上限可以收緊。3.2 故障注入測(cè)試驗(yàn)證可靠性設(shè)計(jì)的唯一手段設(shè)計(jì)完不測(cè)等于沒(méi)設(shè)計(jì)。我每次做完光鏈路可靠性配置都會(huì)做一輪故障注入測(cè)試。測(cè)試項(xiàng)包括拔纖測(cè)試直接拔掉光纖看檢測(cè)延遲和路由切換時(shí)間。衰減測(cè)試在鏈路中串入可調(diào)衰減器逐步加大衰減看誤碼告警是否按預(yù)期觸發(fā)。誤碼注入用測(cè)試儀注入特定 BER 的誤碼驗(yàn)證 FEC 和隔離邏輯。溫度拉偏用溫箱改變光模塊環(huán)境溫度看溫度告警和性能降級(jí)是否合理。實(shí)測(cè)下來(lái)拔纖測(cè)試的檢測(cè)延遲能控制在 200 微秒以內(nèi)路由切換在 1 毫秒以內(nèi)。衰減測(cè)試中當(dāng)接收功率降到 -12dBm 時(shí)FEC 糾正計(jì)數(shù)開(kāi)始明顯上升和配置的告警邏輯吻合。注意故障注入測(cè)試一定要在業(yè)務(wù)低峰期做并且提前通知相關(guān)方。我有一次沒(méi)通知就拔纖結(jié)果觸發(fā)了上層任務(wù)的自動(dòng)重試把測(cè)試環(huán)境搞崩了。3.3 漸進(jìn)式重入的實(shí)現(xiàn)細(xì)節(jié)鏈路修好后不能直接標(biāo)記為正常。我的做法是設(shè)一個(gè)“恢復(fù)中”狀態(tài)持續(xù)觀察 10 秒。這 10 秒內(nèi)鏈路只承載少量探測(cè)流量誤碼和 FEC 計(jì)數(shù)都穩(wěn)定后才逐步增加流量權(quán)重。具體實(shí)現(xiàn)是在路由模塊里給每條鏈路一個(gè)權(quán)重值正常是 100恢復(fù)中從 1 開(kāi)始每 2 秒翻倍直到 100。這樣即使鏈路還有隱患也不會(huì)一下子把大量流量壓上去。這個(gè)機(jī)制幫我避免過(guò)一次二次故障一條鏈路修好后直接放回結(jié)果 3 秒后又抖了導(dǎo)致正在跑的任務(wù)超時(shí)。加了漸進(jìn)重入后同樣的問(wèn)題只影響了探測(cè)流量業(yè)務(wù)無(wú)感。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄4.1 誤碼告警頻繁觸發(fā)但鏈路看似正常這是最常見(jiàn)的問(wèn)題。表現(xiàn)是監(jiān)控日志里 BER 告警反復(fù)出現(xiàn)但光功率、溫度都正常。排查思路如下先看 FEC 糾正計(jì)數(shù)。如果糾正計(jì)數(shù)也在漲說(shuō)明鏈路確實(shí)有誤碼只是 FEC 在兜底。這時(shí)候要查連接器端面是否清潔、光纖是否有彎折、光模塊是否插緊。如果糾正計(jì)數(shù)不漲只有 BER 告警那可能是監(jiān)控模塊的采樣噪聲??梢赃m當(dāng)放寬告警閾值或者增加滑動(dòng)窗口長(zhǎng)度。我遇到過(guò)一次最后發(fā)現(xiàn)是相鄰端口的光模塊串?dāng)_換了端口就好了。這種問(wèn)題很難從單條鏈路的數(shù)據(jù)看出來(lái)需要對(duì)比相鄰端口的指標(biāo)。4.2 路由切換后業(yè)務(wù)仍然超時(shí)鏈路摘除了路由也切了但業(yè)務(wù)還是超時(shí)。這通常是路由收斂沒(méi)完成或者備用路徑本身也有問(wèn)題。排查時(shí)先看路由表更新日志確認(rèn)壞鏈路是否真的被移除。然后看備用路徑的負(fù)載如果備用路徑已經(jīng)接近飽和切過(guò)去也會(huì)擁塞。我的經(jīng)驗(yàn)是給關(guān)鍵業(yè)務(wù)預(yù)留至少一條低負(fù)載備用路徑并且在路由策略里設(shè)置優(yōu)先級(jí)避免所有流量都擠到同一條備路上。4.3 光模塊溫度告警但性能未降溫度告警閾值設(shè)得太緊會(huì)導(dǎo)致頻繁告警。光模塊溫度在 70 度以下通常性能穩(wěn)定但有些模塊在 65 度就開(kāi)始告警。這時(shí)候要看性能指標(biāo)是否真的降了如果 BER 和 FEC 都正??梢赃m當(dāng)上調(diào)溫度閾值。但要注意溫度長(zhǎng)期偏高會(huì)加速光模塊老化所以上調(diào)閾值只是臨時(shí)措施根本解決還是要改善散熱。4.4 常見(jiàn)問(wèn)題速查表問(wèn)題現(xiàn)象可能原因排查動(dòng)作解決方向BER 告警頻繁連接器污染或光纖彎折檢查端面清潔度和光纖走向清潔或更換光纖FEC 計(jì)數(shù)飆升鏈路衰減過(guò)大測(cè)量接收功率調(diào)整衰減或換模塊路由切換后超時(shí)備用路徑擁塞查看備用路徑負(fù)載增加備用路徑或限流溫度告警散熱不良或閾值過(guò)緊對(duì)比性能指標(biāo)改善散熱或調(diào)閾值鏈路反復(fù)閃斷光模塊接觸不良重新插拔并檢查卡扣更換模塊或插槽4.5 幾個(gè)我踩過(guò)的坑第一個(gè)坑是忽略連接器清潔。早期我覺(jué)得連接器是標(biāo)準(zhǔn)件插上就行。結(jié)果有一次批量部署后誤碼率居高不下查了兩天才發(fā)現(xiàn)是施工時(shí)端面沾了灰塵。后來(lái)我把清潔步驟寫進(jìn)了部署規(guī)范每次插纖前必須用專用清潔筆處理。第二個(gè)坑是監(jiān)控采樣周期和業(yè)務(wù)周期共振。有一次采樣周期設(shè)成了 1 毫秒正好和某個(gè)業(yè)務(wù)的調(diào)度周期一致導(dǎo)致監(jiān)控?cái)?shù)據(jù)出現(xiàn)周期性波動(dòng)誤判為鏈路抖動(dòng)。后來(lái)把采樣周期改成 100 微秒錯(cuò)開(kāi)了共振點(diǎn)。第三個(gè)坑是恢復(fù)重入沒(méi)有限速。前面提過(guò)直接放回導(dǎo)致二次故障。加了漸進(jìn)重入后這個(gè)問(wèn)題再?zèng)]出現(xiàn)過(guò)。第四個(gè)坑是告警閾值一刀切。不同長(zhǎng)度的鏈路衰減不同用同一套閾值導(dǎo)致短鏈路頻繁誤告警。后來(lái)按鏈路長(zhǎng)度分了三檔配置誤告警率大幅下降。這些經(jīng)驗(yàn)在官方文檔里基本找不到都是現(xiàn)場(chǎng)一點(diǎn)點(diǎn)試出來(lái)的。光鏈路可靠性這件事理論是一回事實(shí)際部署又是另一回事多測(cè)多記才能把坑填平。