Tcp

由於套接字緩衝區低/溢出,大量數據包被修剪並且數據包崩潰

  • August 9, 2013

我已經設置了一個測試機器(在 linode 2048 機器上的 debian 擠壓 2.6.32)與返回大塊 json 的 api 互動。它非同步呼叫 API 3000/分鐘,API 返回約 450kb 的有效負載。盒子上還有一個 http 伺服器來顯示呼叫結果。

在執行 netstat -s 時(正常執行時間為 20 天):

254329 packets pruned from receive queue because of socket buffer overrun
50678438 packets collapsed in receive queue due to low socket buffer

這對我來說聽起來不太好,所以我按照這些教程來調整 TCP 參數:

http://fasterdata.es.net/fasterdata/host-tuning/linux/test-measurement-host-tuning/

http://www.acc.umu.se/~maswan/linux-netperf.txt

但這似乎沒有幫助。

關於套接字緩衝區的任何建議/教程/解釋可能有助於理解和解決問題?

謝謝

聽起來您正在達到您的 VPS 可以處理的最大網路流量。調整 TCP 參數並不神奇——它可以提供一點幫助,但可能還不夠。一些調整甚至可以通過在虛擬機中執行來抵消 - 流量仍然通過管理程序的真實網卡並受到其設置的影響。

你說傳入的有效負載是每個請求 450kb。那是千還是千字節?大多數工具以字節為單位測量大小,但我會進行這兩種計算。

假設千比特:

  • 3000 個請求/分鐘 = 50 個請求/秒
  • 50*450kbit = 22,500kbit/s = 大約 22Mbit/s

假設千字節,它大約是 176Mbit/s。

如果它是千字節,那麼您將無法在大多數 VPS 伺服器上始終如一地做到這一點。每台伺服器上至少有 10-20 個 VPS。Linode 使用兩個千兆綁定連接到每個伺服器。這意味著您在完整伺服器上的“公平份額”最多約為 100Mbit/s。

即使是千位,對於大多數 VPS 來說,22Mbit 也是一個公平的位。

通過如此快速地執行如此多的請求,您可能正在執行相當於 DOSing 您自己的伺服器的操作。檢查您的實際傳入網路流量應該讓您了解您實際使用了多少。如果您需要真正的 100mbit 甚至千兆速度,您可能需要查看專用伺服器。否則,您需要減慢請求的速度,直到它減慢到伺服器可以處理它為止。

您還需要檢查記憶體和 CPU 使用情況。如果其中任何一個被最大化,您的伺服器將開始丟棄數據包,因為它根本沒有資源來處理它們。首先查看 top 和 ntop 以觀察您的 CPU、記憶體和網路使用情況。

引用自:https://serverfault.com/questions/287157