Red Hat Training

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

8.4.2. socket 佇列

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


[6] 裝置權重可透過 /proc/sys/net/core/dev_weight 進行控制。欲取得更多有關於裝置權重與其調整過後之效應的相關資訊,請參閱〈節 8.4.1, “NIC 硬體緩衝區”〉。