網路瓶頸(network bottleneck)
一條鏈條的強度只等於它最弱的一環,而供水也只能以最窄的管子那麼快地流。由許多連結串成一列的網路路徑也是如此:資料移動的速度不可能快過沿途最慢的那條連結。那條最慢的連結就是瓶頸(bottleneck),單憑它就設下了傳輸能跑多快的上限,無論其他每一條連結有多快。
想像一條由數條連結組成的路徑,容量為 R1、R2、R3 等等。單一傳輸所能達成的端對端吞吐量,至多是這些速率中的最小值——min(R1, R2, R3, ...)。如果一條 1 Gbps 的光纖匯入一條 50 Mbps 的家用線路、再匯入一條 10 Gbps 的資料中心連結,整條路徑的上限就是 50 Mbps,因為那條 50 Mbps 的連結就是瓶頸。資料會堆在瓶頸前面——那裡正是佇列形成、佇列延遲增長之處,因為封包抵達的速度比瓶頸能排出的速度更快。升級瓶頸以外的任何連結都改變不了什麼;你必須把最窄的那條拓寬。
兩個誠實的修正。第一,瓶頸是逐路徑的,而且會移動:它位於目前最慢或最壅塞的那條連結,而在一條共用連結上,你有效的瓶頸是你分到的那一份,而非它的全部容量。第二,一個慢的傳輸根本不見得是網路的錯——限制可能是慢的磁碟、忙的 CPU、小的 TCP 視窗,或遠端的伺服器,而不是任何連結。診斷真正的瓶頸在哪——連結、主機、DNS,還是路徑——正是網路除錯這門藝術的核心,也是為什麼「升級前先量測」能省錢又省去挫折。
即使你的辦公室有一條 1 Gbps 的連結,下載卻只爬到 50 Mbps。一次 traceroute 加上幾次 iperf 測試揭露,路徑跨越了兩個站點之間一條壅塞的 50 Mbps 廣域網路電路。升級你那台本來就很快的辦公室交換器毫無作用;唯一的解法是拓寬 min(R1, R2, ...)——那條 50 Mbps 的瓶頸。
端對端吞吐量至多為 min(R1, R2, ...);升級瓶頸以外的任何連結都改變不了什麼。
一個慢的傳輸不見得是連結的錯:真正的限制可能是慢的磁碟、忙的 CPU、小的 TCP 視窗,或遠端的伺服器。在花錢升級任何東西之前,先量測找出瓶頸實際在哪。