Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

8.4. 解決常見的佇列/frame 遺失問題

到目前為止,frame 遺失最常見的原因是「佇列溢出」(queue overrun)。kernel 會對佇列的長度設下限制,並且在某些情況下,佇列填滿的速度會比它所排出的速度還要快。當此狀況持續太久時,frame 便會開始被捨棄。
如〈圖形 8.1, “網路接收路徑圖形”〉中所述,接收路徑中有兩個主要佇列:NIC 硬體緩衝區以及 socket 佇列。這兩個佇列皆需要經過配置,以確保溢出的問題不會發生。

8.4.1. NIC 硬體緩衝區

NIC 會將其硬體緩衝區填滿 frame;緩衝區接著將會被 NIC 透過插斷所插入的 softirq 排出。若要監控此佇列的狀態,請執行以下指令:
ethtool -S ethX
請將 ethX 取代為 NIC 的相應裝置名稱。這會顯示 ethX 中捨棄了多少 frame。通常,因為佇列耗盡了用來存放 frame 的空間時,便會發生捨棄的情況。
用來找出此問題的方法有幾種:
輸入流量
您可藉由減慢輸入流量的速度,以協助避免佇列發生溢位錯誤。您可透過篩選、減少加入的 multicast 群組數量、減少廣播流量等等的動作來避免溢位。
佇列長度
此外,您亦可增加佇列的長度。也就是將特定佇列的緩衝區數量增加到驅動程式所能允許的最大值。若要這麼做,請使用以下指令來編輯 ethXrx/tx 信號參數:
ethtool --set-ring ethX
附加適當的 rx 或是 tx 值至先前提到的指令中。欲取得更多相關資訊,請參閱 man ethtool
裝置權重
您亦可增加佇列被排出的速率。若要這麼做,請調整 NIC 的相應「裝置權重」。此屬性代表 softirq 必須微調 CPU 並將其重新排程前,NIC 所能接收的最大 frame 數量。這是以 /proc/sys/net/core/dev_weight 變數來進行控制的。
大部份管理員都會選擇第三個選項。然而請注意,這麼做是有風險的。增加 NIC 在一個循環中可接收的 frame 數量,即代表需要額外的 CPU 週期,在這段時間內,無法在該 CPU 上排程任何應用程式。