低延遲網路上線之後,要確認延遲沒有變慢,靠的是可重現的量法、實測的基線,以及依基線訂出的門檻。這份手冊把 30 天的實測整理成這三部分,涵蓋量測儀器、交換器、伺服器與防火牆,文末附上主題索引。維運上有三個原則:
- 先驗儀器,再量待測物:量延遲要用硬體時戳(hardware timestamping),每次正式量測前先跑直連校正,結果要跟儀器自己的基線一致(這套環境是 3 m DAC、中位數 60.0 ns);對不上代表儀器或線材變了,這時量到的數字都不能用。
- 看分布,不看平均:延遲要看中位數、p99、p99.9 跟抖動,平均值會被少數極慢的請求拉高,看不出大多數請求的狀況;判定門檻要大於同一組設定重複量測的起伏,不然設定沒變也會被判成變慢。
- 設定失效不會出現錯誤或斷線:設定被改掉或重開機後沒套用,服務照常運作,只有延遲變長,例如 kernel bypass 沒生效時,程式會改走 kernel 的網路堆疊,收發延遲變成好幾倍(這套環境從 1.21 µs 變成 4.16 µs)。這類問題只能靠巡檢跟變更驗證抓到。
量法與基線
| 量什麼 |
怎麼量 |
這套環境的基線 |
| 量測儀器 |
以 3 m DAC 直連 ExaNIC X25 的兩個 port,用硬體時戳量 |
中位數 60.0 ns(網卡收發加上這條線) |
| 交換器 port-to-port |
過交換器的中位數 − 直連的中位數 − 多接那條 DAC 的傳播延遲(每公尺約 4.96 ns) |
363 ns(容許範圍 351~375 ns) |
| 轉發模式 |
分別量 64 與 1518 bytes 的中位數,兩者相減 |
cut-through 0 ns,store-and-forward 1120 ns |
| 伺服器收發延遲 |
量測網卡送出多播請求,交換器同時送給伺服器跟量測網卡的另一個 port,伺服器的回覆也送到這個 port,兩個硬體時戳都由它打,數字包含回覆經過交換器一次跟線材 |
X4522 上 kernel 4.16 µs,Onload 輪詢模式 1.21 µs(程式在隔離的 CPU) |
| 防火牆 |
同一個請求在防火牆前後各打一次硬體時戳,相減後扣掉不經過防火牆的基準組 |
硬體加速約 4.1 µs,改由 CPU 處理約 18.5 µs |
評估一項設定調整(例如改網卡參數、換中斷綁定)的效果時,前後比較照這四點做:
- 能來回切換設定的環境(實驗室或維護時段),照「調整前、調整後、調整後、調整前」的順序各量一輪,前後對稱,基準值隨時間的變動會在兩邊互相抵消;正式環境不會只為了量測把設定改回去,就在調整前緊接著量一輪當基準,調整後再量一輪。
- 不能拿幾天前的數字當基準:即使設定沒有任何改動,基準值也會隨時間變動,這套環境隔不到一小時再量一次,中位數就差了約 2%。
- 調整前後用同一支量測腳本、同一組參數,結果跟當下的設定(開機參數、網卡參數、中斷綁定)存成同一份紀錄,數字變了才查得出是哪個設定改了。
- 驗證流量的封包速率要照正式環境的尖峰設,有些設定只在封包密的時候才有影響。例如 interrupt coalescing(讓多個封包共用一次中斷),這套環境每 1 ms 一個請求時量不出差別;請求改成每 20 µs 一個、關掉 busy poll 之後,rx-usecs 從 0 調到 100,中位數就從 4.35 µs 拉長到約 150 µs。要關掉 busy poll,是因為封包間隔比它的輪詢時間(這台 50 µs)短時,程式在輪詢中就把封包收走,不用等中斷,coalescing 影響不到延遲。
告警等級
後面三張檢查表的等級分兩級:
| 等級 |
哪些情況 |
處理時限 |
| P1 |
丟包、封包損毀、link 斷線、佇列到上限、kernel bypass 沒生效,或行情、下單的流量沒有被防火牆加速 |
交易時段由 NOC(網路維運中心)立即處理;交易時段以外降為 P2 |
| P2 |
設定跟基線不同,或指標超過門檻,例如超過過去 30 天同一時段的最大值、防火牆 CPU 使用率超過 70% |
下次開盤前處理完 |
P2 裡的「同一時段」是把開盤那幾分鐘跟盤中分開比:開盤的尖峰混進整天的數字,盤中的門檻會被拉高,盤中的異常就抓不到。
交換器的檢查與門檻
| 項目 |
正常 |
異常 |
等級 |
| 介面錯誤計數(Rx、Tx)、link 狀態變化次數 |
增量 0 |
增量大於 0 |
P1 |
| 出口佇列(LANZ)、discards |
佇列沒到上限,discards 增量 0 |
丟包,或佇列到上限 5615 segments |
P1 |
| LANZ 擁塞次數、最長佇列深度 |
不超過過去 30 天同一時段的最大值 |
超過 |
P2 |
| 已知問題鏈路的錯誤率 |
錯誤率(錯誤數 ÷ 收到的封包數)不超過過去 30 天同一時段的最大值 |
超過 |
P2 |
| 轉發模式 |
1518 減 64 bytes 的中位數差約 0 ns |
超過 100 ns |
P2 |
| IGMP querier、訂閱表 |
每個多播 VLAN 都有 querier(pruning active 為 True),訂閱的群組與 port 跟基線一致 |
沒有 querier(多播洪泛到所有 port),或訂閱表跟基線不同 |
P2 |
表中幾項的判讀方式:
- LANZ 是 Arista 交換器的佇列監看功能,佇列深度以 segment 計(這台一個 segment 是 480 bytes),超過門檻才會留下紀錄。
- 錯誤計數不設累積門檻,增加就告警,因為 cut-through 在收完整個 frame、驗完 CRC 之前就開始轉發,壞掉的 frame 不會在這台交換器被擋下,會一路轉送到後面的設備跟伺服器。已知有問題、還在等待維修的鏈路例外,改用錯誤率門檻,不然每個錯誤都通報會造成告警疲勞;鏈路修好之後,門檻要改回增量大於 0。
- 計數器要看兩次讀數的差值;Uptime 比兩次讀數的間隔短,代表中間重開過,Last clearing 的時間比間隔短,代表計數器被清過,這兩種情況的差值都不能用。
- 換線、換模組這類計畫內的作業,事先在監控系統標上維護時段,時段內 link 狀態變化跟錯誤計數只記錄、不通報,作業完成後照頻率表把設定跟核准過的基線比,再跑直連校正並重新量受影響的延遲基線。
伺服器的檢查與門檻
| 項目 |
正常 |
異常 |
等級 |
開機參數、BIOS 的 C-state 設定、CPU 頻率、tuned、ethtool 的 -c、-g、-k 輸出 |
跟核准過的基線一致,這台是 idle=poll、isolcpus=1-3、BIOS 停用 MWAIT 與 C1E 自動升級、封裝 C-state 上限 PC0,頻率固定 4.7 GHz,tuned network-latency,rx-usecs 0 |
跟基線不同 |
P2 |
| 中斷綁定、程式綁核 |
跟綁定基線一致,隔離的 CPU 上只跑延遲敏感的程式;kernel 跟 Onload 預設模式的中斷跟程式放同一顆(這台是隔離的 CPU 1),exasock 的網卡中斷放別顆 |
綁定改變,或隔離的 CPU 上有其他程式 |
P2 |
| 程式有沒有換 CPU(走 kernel 送出、網卡只給這支程式用時) |
送出的封包只走程式那顆 CPU 對應的 TX queue(要設 xps_cpus) |
其他 TX queue 也有送出 |
P2 |
網卡丟包(Solarflare 網卡的 port_rx_nodesc_drops) |
增量 0 |
增量大於 0 |
P1 |
| kernel bypass |
onload_stackdump、exasock-stat 列得出程式 |
列不出來 |
P1 |
Onload 的 EF_NO_FAIL |
0 |
不是 0(沒設時預設是 1) |
P2 |
表中幾項的判讀方式:
- 這些參數在重新開機、更新 kernel、驅動或 BIOS 之後可能被重設為預設值,延遲變長卻不會出現錯誤或斷線,這幾種事件都要列為比對設定基線的觸發條件。
- kernel 跟 Onload 預設模式靠中斷喚醒程式,中斷跟程式放同一顆 CPU 延遲比較低,通常是因為不用跨 CPU 喚醒;exasock 從程式啟動就一直輪詢,kernel 的網卡驅動卻照樣為每個封包觸發中斷,放在程式那顆會打斷輪詢,所以網卡中斷要放別顆。
- irqbalance 開著會重新分配中斷,綁好的位置會被改掉,要停用或把這些中斷排除。
- Onload 在資源不夠、建不起加速的 socket 時,預設會自動改用 kernel 的 socket,程式收不到錯誤,延遲卻回到 kernel 的水準;
EF_NO_FAIL 設成 0,建不起來時才會把錯誤回報給程式。
- 輪詢模式的程式會讓所在的 CPU 使用率一直接近 100%,這是正常的,CPU 使用率告警要排除這幾顆。
防火牆的檢查與門檻
| 項目 |
正常 |
異常 |
等級 |
| 加速狀態 |
行情、下單的 session 已加速 |
沒加速 |
P1 |
| policy 設定 |
auto-asic-offload 開啟,沒有套用 proxy 模式的安全檢查 |
跟基線不同 |
P2 |
| 防火牆 CPU |
70% 以下 |
超過 70% |
P2 |
| session 建立速率 |
不超過過去 30 天同一時段的最大值 |
超過 |
P2 |
表中幾項的判讀方式:
- 有硬體加速的防火牆,新 session 開頭的封包通常由 CPU 處理(這台 UDP 是前兩個),建立完成後才交給加速晶片轉發,所以行情與下單的連線要在開盤前完成建立並確認加速狀態。
- policy 關掉硬體加速,或套用 proxy 模式的安全檢查(例如防毒、網頁過濾),session 都不會被加速,所以這兩項要列進設定基線。
- UDP session 閒置超過逾時(這台是 180 秒)會被刪掉,下一個封包要重新建立 session,開頭的封包又改由 CPU 處理。交易時段可能閒置這麼久的 UDP 單播流量,要把防火牆上這類流量的閒置逾時調得比最長的閒置時間長(這台是在對應的 firewall service custom 上設 udp-idle-timer);行情多播通常會定時送 heartbeat,不會閒置這麼久。
- 防火牆 CPU 跟 session 建立速率是間接指標:沒被加速的封包都要由 CPU 處理,這兩項突然升高,代表可能有大量流量沒被加速。
檢查頻率與變更驗證
| 時機 |
查什麼 |
負責人 |
| 即時(監控系統每分鐘取樣) |
錯誤、link 狀態變化、出口 discards、LANZ、網卡丟包、防火牆 CPU、session 建立速率 |
NOC |
| 程式部署、重啟之後 |
kernel bypass 有沒有生效、程式綁核、防火牆 session 的加速狀態 |
執行部署的工程師 |
| 每天開盤前 |
全部項目:設定跟核准過的基線比,計數器跟前一天比 |
網路維運工程師 |
| 每次變更前後 |
全部項目,加直連校正跟一輪延遲量測 |
變更執行者與審核者 |
| 換線、拔插光模組、換 port、重開機、更新 kernel、驅動或 BIOS 之後 |
設定跟核准過的基線比,再跑直連校正、重新量受影響的延遲基線 |
執行該作業的工程師 |
變更前後的延遲照下表判定(交換器 port-to-port 照量法表的容許範圍):
| 統計量 |
門檻 |
超過時 |
| 中位數 |
比基準高 5% |
不通過 |
| p99 |
比基準高 10% |
不通過 |
| p99.9 |
比基準高 10% |
再量一輪,仍超過才不通過 |
| 抖動(PDV,p99.9 減最小值) |
基準的 1.5 倍 |
再量一輪,仍超過才不通過 |
| 卡頓(不算前兩個請求,超過中位數 10 倍的筆數) |
大於 0 |
不通過 |
門檻怎麼訂、判定之後怎麼做:
- 門檻取重複量測起伏的兩倍以上:同一組設定、什麼都沒改,再量一輪本來就會有起伏,這組門檻是依這套環境程式放在隔離的 CPU 時的起伏訂的(中位數 2.1%、p99 3.3%、p99.9 4.6%、PDV 18.7%)。
- 程式所在的 CPU 還跑著其他工作時,起伏會大很多(這套環境 p99.9 差到 12.2%),門檻不能照抄,要在那台機器上重複量幾輪,用實測的起伏來訂。
- 判定通過,就把變更後存下的設定跟量測紀錄核准為新基線;沒通過就 rollback,並確認所有項目都回到變更前的狀態。
常見的判讀錯誤
- 平均值描述不了分成兩群的分布:延遲分成兩群時(例如程式在量測途中換了 CPU),平均值會落在兩群中間,不代表任何一群的實際延遲;要先找出分群的原因,再分開統計。
- 最大值容易被量測剛開始的請求拉高:剛開始時快取、位址解析或連線狀態通常還沒建立,前幾個請求特別慢;看最慢的延遲之前,要先排除開頭的幾個請求(這套環境是每輪最前面兩個)。
- discards 是 0 不代表沒有擁塞:discards 只算被丟掉的封包,佇列堆積造成的延遲不會留在 discards 裡,要看交換器的佇列紀錄(Arista 是 LANZ)。
- 設定檔只代表意圖,量到的才是實際行為:變更設定或 rollback 之後,都要重新量測,確認延遲符合預期。
- ping 不適合判斷低延遲網路:ping 最小只顯示到 1 µs,比低延遲交換器數百 ns 的轉發延遲還大,ping 通也只代表對方的 kernel 有回應。延遲要用網卡在收發封包當下打的硬體時戳量,不受伺服器軟體排程影響;服務能不能用,要對服務實際使用的 TCP 或 UDP port 送出請求,確認程式有回應。
- tcpdump 抓不到封包不代表沒有流量:走 kernel bypass 的程式收發不經過 kernel,tcpdump、ss 都看不到,要改用
onload_stackdump、exasock-stat 跟交換器的 port 計數器確認。
結論與導入步驟
這 30 天的實測顯示,交換器轉發一個封包約 363 ns,伺服器收發是 1.21 到 4.16 µs,防火牆加速時也要約 4.1 µs,延遲主要花在伺服器跟防火牆,調校的重點也在這兩段;交換器轉發的延遲幾乎固定,監控重點是錯誤、丟包跟佇列。這份手冊的基線與門檻都來自這套實驗環境(Arista 7150、ExaNIC X25、Solarflare X4522、FortiOS 7.6.7 的 FortiGate 201G),不能直接套用到其他環境。要在其他環境建立同樣的量測與監控,建議依下列步驟導入:
- 準備有硬體時戳的量測網卡,先跑直連校正,確認儀器本身的延遲。
- 照上面的量法,量出交換器、伺服器、防火牆各自的基線,連同當時的設定一起存。
- 同一組設定重複量幾輪,用實測的起伏訂變更驗證的門檻;跟過去 30 天比的告警門檻,要先收集滿 30 天的紀錄才能啟用。
- 把設定比對跟計數器檢查寫成巡檢腳本,每天開盤前執行;計數器另外交給監控系統每分鐘取樣。
- 每次變更前後先跑直連校正,再各量一輪延遲,照前面的門檻判定,通過後把變更後的設定跟量測紀錄核准為新的基線。
設備、韌體版本或線材一有變更,就回到第 2 步,重新建立基線並調整門檻。
索引