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 群組數量、減少廣播流量等等的動作來避免溢位。
- 佇列長度
- 此外,您亦可增加佇列的長度。也就是將特定佇列的緩衝區數量增加到驅動程式所能允許的最大值。若要這麼做,請使用以下指令來編輯
ethX
的rx
/tx
信號參數:ethtool --set-ring ethX
附加適當的rx
或是tx
值至先前提到的指令中。欲取得更多相關資訊,請參閱man ethtool
。 - 裝置權重
- 您亦可增加佇列被排出的速率。若要這麼做,請調整 NIC 的相應「裝置權重」。此屬性代表
softirq
必須微調 CPU 並將其重新排程前,NIC 所能接收的最大 frame 數量。這是以/proc/sys/net/core/dev_weight
變數來進行控制的。
大部份管理員都會選擇第三個選項。然而請注意,這麼做是有風險的。增加 NIC 在一個循環中可接收的 frame 數量,即代表需要額外的 CPU 週期,在這段時間內,無法在該 CPU 上排程任何應用程式。