為什么需要測量帶寬、延遲、抖動和丟包率?
當我們說一個網絡環境好時,通常是指我們“感覺”訪問網站立刻就打開了;可是如果反過來,一個網站很久才打開,就一定是網絡環境差嗎?未必,也可能是網站本身有問題。如果這是自己的網站,你一定不希望通過反復刷新頁面,或者多拿幾臺電腦訪問去“感覺”它的速度作為判斷網絡是否良好的依據,我們需要一個更加可靠的技術手段。這些指標便是判斷到服務器的網絡是否良好的基礎指標。
除了故障排查外,以下幾種情況我們也需要了解這些參數:
-
購買
VPS
:在你購買一臺VPS
,特別是外國的VPS
時,你一定會想了解到底在外國和在國內能不能順暢地訪問自己的VPS
,特別是帶寬參數是否跟實際購買的一致; - 性能測試:你希望對自己的網站做性能測試,需要確保自己的網絡環境是滿足指標要求的;
什么樣的指標是合格的?
首先,沒有一個通用的指標,不同的應用場景所需要的指標各不相同,比如 IP電話、視頻與訪問網站的網絡指標要求就各不相同,這里只分析網站訪問的情況。
從服務器環境角度看,服務器只能控制自己的帶寬,但是普通用戶實際訪問的環境是控制不了的,服務器需要做的是在差的環境也能提供較好的體驗,這不是本文的主題,所以我們談指標時并不是指服務器的角度。
從用戶(開發者或者普通用戶)環境角度看,如果一個網站本身是符合要求的(Google Pagespeed Insight
達到90分以上),網絡環境應該滿足什么樣的指標,用戶打開我們的網站才會很快。這本身也是一個經驗指標,并沒有一個定論,下面的指標是我在做性能測試時要求的指標,它的要求高于普通用戶瀏覽網站,因此能夠滿足此指標,網絡環境是沒問題的。
- 帶寬:與服務商提供的最大帶寬接近
-
延遲:
<100ms
-
抖動:
<20ms
-
丟包率:
<1%
測量方法
測量服務器帶寬
使用iperf
工具測試服務器帶寬,它分為服務端與客戶端,兩邊都要安裝iperf
工具。在Linux
通過yum
或者apt-get
即可直接安裝。
服務端(假設IP
為106.14.26.11
)運行iperf
服務:
#iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
這是一臺上下行帶寬都接近100Mbits/sec
的服務器,實測數值不應該與該數值偏離太遠。
客戶端
測試上行和下行帶寬
$iperf -c 106.14.26.11 -t 60 -d
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to 45.32.64.187, TCP port 5001
TCP window size: 197 KByte (default)
------------------------------------------------------------
[ 4] local 104.250.144.8 port 50040 connected with 106.14.26.11 port 5001
[ 5] local 104.250.144.8 port 5001 connected with 106.14.26.11 port 34386
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-60.0 sec 658 MBytes 92.0 Mbits/sec #上行帶寬
[ 5] 0.0-60.4 sec 628 MBytes 87.4 Mbits/sec #下行帶寬
從測試結果看,上行帶寬為92.0Mbits/sec
, 下行帶寬為87.2Mbits/sec
,低于服務器的100Mbits/sec
,但是沒有低得很離譜。
如果你的客戶端無法連接到
iperf
服務端,可能是主機的防火墻擋住或者VPS
提供商做了限制。對于前者,通過iptables -F
即可解決;對于后者,有幾種解法:進VPS
提供商的控制臺修改、聯系VPS
提供商、修改端口為外部可以訪問得到的端口。
測量延遲、抖動和丟包率
延遲,抖動和丟包率,直接使用ping
做測試即可。如果想測量這個值,建議抓100
個包測試:
$ ping -c 100 www.baidu.com
PING www.a.shifen.com (163.177.151.109): 56 data bytes
64 bytes from 163.177.151.109: icmp_seq=0 ttl=55 time=26.639 ms
64 bytes from 163.177.151.109: icmp_seq=1 ttl=55 time=24.329 ms
64 bytes from 163.177.151.109: icmp_seq=2 ttl=55 time=24.794 ms
64 bytes from 163.177.151.109: icmp_seq=3 ttl=55 time=22.709 ms
64 bytes from 163.177.151.109: icmp_seq=4 ttl=55 time=39.994 ms
64 bytes from 163.177.151.109: icmp_seq=5 ttl=55 time=50.786 ms
。。。省略
^C
--- www.a.shifen.com ping statistics ---
100 packets transmitted, 100 packets received, 0.0% packet loss #最后這個百分比就是丟 包率
round-trip min/avg/max/stddev = 21.505/26.743/50.786/6.613 ms #分別表示最小延遲、平均延遲、最大延遲、抖動(抖動就是延遲標準差)
根據上面的結果,我們得到結論:
延遲:26.743ms
抖動: 6.613ms
丟包率: 0.0%
符合指標要求,所以訪問百度一定很快。(這里假設帶寬是沒問題的,測量到服務器的帶寬需要服務器支持,所以是測量不了的)