Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
8.4.2. socket 佇列
如同 NIC 硬體佇列,socket 佇列會填滿來自於
softirq
的網路堆疊。接著應用程式便會排出與它們相應的佇列(透過呼叫 read
、recvfrom
等等)。
若要監控此佇列的狀態,請執行
netstat
工具程式;Recv-Q
欄位顯示了佇列大小。一般來講,我們會使用相同的管理方式,來處理 socket 佇列中的溢位問題,以及 NIC 硬體緩衝區溢位問題(例如〈節 8.4.1, “NIC 硬體緩衝區”〉):
- 輸入流量
- 第一個選項就是透過配置佇列填滿的速率,以減慢連入流量的速度。若要這麼做,請篩選 frame,或是先佔式地將它們丟棄。您亦可透過降低 NIC 的裝置權重來減慢連入流量的速度[6]。
- 佇列深度
- 您亦可透過增加佇列深度,以避免 socket 佇列溢位。若要這麼做,請增加
rmem_default
kernel 參數或是SO_RCVBUF
socket 選項的值。欲取得有關於這兩者的相關資訊,請參閱〈節 8.2, “優化網路設定”〉。 - 應用程式呼叫頻率
- 請儘可能優化應用程式使其更頻繁地進行系統呼叫。這包含了修改和重新配置網路應用程式,使其更頻繁地進行 POSIX 系統(例如
recv
、read
)。相對的,這能讓應用程式更快速地排出佇列。
對於許多管理員來說,增加佇列深度是較常用的解決方法。這是最簡單的解決方法,不過以長遠的角度來看,不一定永遠適用。隨著網路技術的速度愈來愈快,socket 佇列也會跟著愈快填滿。這代表管理員必須隨著時間的經過,持續重新調整佇列深度。
最佳的解決方式就是增強或是配置應用程式,使其能更快速地由 kernel 中將資料排出(儘管表示您必須將資料排在應用程式空間中)。這能讓資料以更加靈活的方式儲存,因為它能視需求被 swap 出或是傳回。
[6]
裝置權重可透過
/proc/sys/net/core/dev_weight
進行控制。欲取得更多有關於裝置權重與其調整過後之效應的相關資訊,請參閱〈節 8.4.1, “NIC 硬體緩衝區”〉。