在 Azure 中設定虛擬機器的傳輸單元最大值 (MTU)
傳輸單元最大值 (MTU) 是一種測量值,代表網路裝置或介面所傳輸的最大乙太網路框架 (封包) 大小。 如果封包超過裝置所能接受的大小上限,就會將該封包分割成多個較小的封包,然後稍後在目的地重新組合。
分割和重新組合可能造成效能和排序問題,因而產生不盡理想的體驗。 針對您的解決方案將 MTU 最佳化,可藉由減少傳送資料集所需的封包總數來提供網路頻寬效能優點。 設定較大的 MTU 大小可能改善網路輸送量,因為其可減少傳送資料集所需的封包數目和標頭額外負荷。
MTU 是可在虛擬機器作業系統中進行的設定。 Azure 中 MTU 設定的預設值為 1500 個位元組。
Azure 中的 VM 僅針對停留在虛擬網路內的流量,支援大於預設 1,500 個位元組的 MTU。
下表顯示 Azure 中可用的 Azure 網路介面上支援的最大 MTU 大小:
作業系統 | 網路介面 | 虛擬網路間流量的最大 MTU |
---|---|---|
Windows Server | Mellanox Cx-3、Cx-4、Cx-5 | 3900 使用 Set-NetAdapterAdvancedProperty 設定 MTU 值時,使用值 4088 。 若要在重新開機期間持續保存,也必須使用 Set-NetIPInterface 設定 Test-Connection 傳回的值。 |
Windows Server | (預覽) Microsoft Azure 網路介面卡 MANA | 9000 使用 Set-NetAdapterAdvancedProperty 設定 MTU 值時,使用值 9014 。若要在重新開機期間持續保存,也必須使用 Set-NetIPInterface 設定 Test-Connection 傳回的值。 |
Linux | Mellanox Cx-3、Cx-4、Cx-5 | 3900 |
Linux | (預覽) Microsoft Azure 網路介面卡 | 9000 |
必要條件
具有有效訂用帳戶的 Azure 帳戶。 免費建立一個。
Azure 上相同虛擬網路中的兩部 Linux 虛擬機器。 如需建立 Linux 虛擬機器的詳細資訊,請參閱在 Azure 入口網站中建立 Linux 虛擬機器 (部分機器翻譯)。 您需要虛擬機器的遠端存取權,才能完成此文章。 如需安全連線到 Azure 虛擬機器的詳細資訊,請參閱什麼是 Azure Bastion? (部分機器翻譯)
- 基於此文章的目的,會將虛擬機器命名為 vm-1 和 vm-2。 以您的值取代這些值。
資源範例
在此文章中,使用下列資源作為範例。 以您的值取代這些值。
資源 | 名稱 | IP 位址 |
---|---|---|
虛擬機器 1 | vm-1 | 10.0.0.4 |
虛擬機器 2 | vm-2 | 10.0.0.5 |
預防措施
Azure 中的虛擬機器僅針對停留在虛擬網路內的流量,支援大於預設 1,500 個位元組的 MTU。 針對虛擬網路內部 VM 對 VM 流量以外的案例,不支援較大的 MTU。 透過閘道、對等互連或網際網路周遊的流量可能不受支援。 較大 MTU 的設定可能導致分割並降低效能。 針對使用這些案例的流量,利用預設的 1,500 個位元組 MTU 進行測試,以確保整個網路路徑支援較大的 MTU。
最佳 MTU 是作業系統、網路和應用程式特有的。 最大支援的 MTU 可能不適合您的使用案例。
一律先在非關鍵性環境中測試 MTU 設定變更,然後再廣泛套用至關鍵性環境。
路徑 MTU 探索
務必了解應用程式或機器所使用之網路路徑所支援的 MTU。 路徑 MTU 探索是找出來源和目的地位址之間所支援最大 MTU 的方法。 使用比來源和目的地位址之間所支援還大的 MTU 會導致分割,這可能對效能造成負面影響。
在此文章中,使用的範例會測試兩部虛擬機器之間的 MTU 路徑。 您可以從虛擬機器到任何可路由的目的地執行後續測試。
使用下列步驟,在來源和目的地虛擬機器上設定較大的 MTU 大小。 針對 Linux 使用殼層指令碼或針對 Windows 使用 PowerShell 來驗證路徑 MTU。 如果不支援較大的 MTU,路徑 MTU 探索測試中顯示的結果就會與設定於來源或目的地虛擬機器介面上的設定不同。
殼層指令碼可在 Azure 範例資源庫中取得。 從下列連結下載適用於 Linux 的指令碼,並儲存至 vm-1 和 vm-2。
使用下列步驟來變更 Linux 虛擬機器上的 MTU 大小:
登入 vm-1
使用
ip
命令來顯示目前的網路介面及其 MTU 設定,記錄 IP 位址以供後續步驟使用。 在此範例中,IP 位址為 10.0.0.4,而乙太網路介面為 eth0。ip address show
azureuser@vm-1:~$ ip address show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0d:3a:c5:f3:14 brd ff:ff:ff:ff:ff:ff inet 10.0.0.4/24 metric 100 brd 10.0.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::20d:3aff:fec5:f314/64 scope link valid_lft forever preferred_lft forever 3: enP46433s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master eth0 state UP group default qlen 1000 link/ether 00:0d:3a:c5:f3:14 brd ff:ff:ff:ff:ff:ff altname enP46433p0s2 inet6 fe80::20d:3aff:fec5:f314/64 scope link valid_lft forever preferred_lft forever
將 vm-1 上的 MTU 值設定為網路介面所支援的最高值。 在此範例中,網路介面的名稱為 eth0。 以您的值取代此值。
- 針對 Mellanox 介面卡,使用下列範例來將 MTU 值設定為 3900:
echo '3900' | sudo tee /sys/class/net/eth0/mtu || echo "failed: $?"
- 針對 Microsoft Azure 網路介面卡,使用下列範例來將 MTU 值設定為 9000:
echo '9000' | sudo tee /sys/class/net/eth0/mtu || echo "failed: $?"
重要
在先前步驟中進行的 MTU 變更不會在重新開機期間持續保存。 若要進行永久變更,請參閱 Linux 發行版本的適當文件。
使用
ip
命令來驗證 MTU 設定是否已套用至網路介面:ip address show
azureuser@vm-1:~$ ip address show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 3900 qdisc mq state UP group default qlen 1000 link/ether 00:0d:3a:c5:f3:14 brd ff:ff:ff:ff:ff:ff inet 10.0.0.4/24 metric 100 brd 10.0.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::20d:3aff:fec5:f314/64 scope link valid_lft forever preferred_lft forever 3: enP46433s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 3900 qdisc mq master eth0 state UP group default qlen 1000 link/ether 00:0d:3a:c5:f3:14 brd ff:ff:ff:ff:ff:ff altname enP46433p0s2 inet6 fe80::20d:3aff:fec5:f314/64 scope link valid_lft forever preferred_lft forever
登入 vm-2 並重複執行上述步驟,以將 MTU 值設定為網路介面所支援的最高值。
登入 vm-1。
使用下列範例來執行 Linux 殼層指令碼,以測試可用於特定網路路徑的最大 MTU 大小。 以 vm-2 的 IP 位址取代目的地主機的值。
./GetPathMtu.sh 10.0.0.5
輸出類似於下列範例: 如果指令碼的輸出未顯示網路介面上的設定,則表示 MTU 大小未正確設定。 或者,這可能表示沿著路徑的網路裝置只支援 GetPathMTU 指令碼所傳回的 MTU 大小。
azureuser@vm-1:~/GetPathMTU$ ./GetPathMtu.sh 10.0.0.5 destination: 10.0.0.5 startSendBufferSize: 1200 interfaceName: Default interface Test started .................................................................................................................................................................................................... 3900
使用
PING
來驗證網路介面上的 MTU 大小。 針對 Linux,使用 -M、-s 和 -c 旗標。 -M 選項會指示 ping「不要」分段、-s 會設定封包大小,而 -c 會設定要傳送的 ping 數目。 若要判斷封包大小,從 MTU 設定 3900 中減掉 28。ping 10.0.0.5 -c 10 -M do -s 3872
azureuser@vm-1:~/GetPathMTU$ ping 10.0.0.5 -c 10 -M do -s 3872 PING 10.0.0.5 (10.0.0.5) 3872(3900) bytes of data. 3880 bytes from 10.0.0.5: icmp_seq=1 ttl=64 time=3.70 ms 3880 bytes from 10.0.0.5: icmp_seq=2 ttl=64 time=1.08 ms 3880 bytes from 10.0.0.5: icmp_seq=3 ttl=64 time=1.51 ms 3880 bytes from 10.0.0.5: icmp_seq=4 ttl=64 time=1.25 ms 3880 bytes from 10.0.0.5: icmp_seq=5 ttl=64 time=1.29 ms 3880 bytes from 10.0.0.5: icmp_seq=6 ttl=64 time=1.05 ms 3880 bytes from 10.0.0.5: icmp_seq=7 ttl=64 time=5.67 ms 3880 bytes from 10.0.0.5: icmp_seq=8 ttl=64 time=1.92 ms 3880 bytes from 10.0.0.5: icmp_seq=9 ttl=64 time=2.72 ms 3880 bytes from 10.0.0.5: icmp_seq=10 ttl=64 time=1.20 ms --- 10.0.0.5 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 9014ms rtt min/avg/max/mdev = 1.051/2.138/5.666/1.426 ms
來源和目的地之間設定不相符的指示,會在輸出中顯示為錯誤訊息。 在此情況下,不會在來源網路介面上設定 MTU。
azureuser@vm-1:~/GetPathMTU$ ping 10.0.0.5 -c 10 -M do -s 3872 PING 10.0.0.5 (10.0.0.5) 3872(3900) bytes of data. ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 --- 10.0.0.5 ping statistics --- 10 packets transmitted, 0 received, +10 errors, 100% packet loss, time 9248ms
登入 vm-2。
使用下列範例來執行 Linux 殼層指令碼,以測試可用於特定網路路徑的最大 MTU 大小:
./GetPathMtu.sh 10.0.0.4
輸出類似於下列範例: 如果指令碼的輸出未顯示網路介面上的設定,則表示 MTU 大小未正確設定。 或者,這可能表示沿著路徑的網路裝置只支援 GetPathMTU 指令碼所傳回的 MTU 大小。
azureuser@vm-1:~/GetPathMTU$ ./GetPathMtu.sh 10.0.0.4 destination: 10.0.0.4 startSendBufferSize: 1200 interfaceName: Default interface Test started .................................................................................................................................................................................................... 3900
使用
PING
來驗證網路介面上的 MTU 大小。 針對 Linux,使用 -M、-s 和 -c 旗標。 -M 選項會指示 ping「不要」分段、-s 會設定封包大小,而 -c 會設定要傳送的 ping 數目。 若要判斷封包大小,從 MTU 設定 3900 中減掉 28。ping 10.0.0.4 -c 10 -M do -s 3872
azureuser@vm-2:~/GetPathMTU$ ping 10.0.0.4 -c 10 -M do -s 3872 PING 10.0.0.4 (10.0.0.4) 3872(3900) bytes of data. 3880 bytes from 10.0.0.4: icmp_seq=1 ttl=64 time=3.70 ms 3880 bytes from 10.0.0.4: icmp_seq=2 ttl=64 time=1.08 ms 3880 bytes from 10.0.0.4: icmp_seq=3 ttl=64 time=1.51 ms 3880 bytes from 10.0.0.4: icmp_seq=4 ttl=64 time=1.25 ms 3880 bytes from 10.0.0.4: icmp_seq=5 ttl=64 time=1.29 ms 3880 bytes from 10.0.0.4: icmp_seq=6 ttl=64 time=1.05 ms 3880 bytes from 10.0.0.4: icmp_seq=7 ttl=64 time=5.67 ms 3880 bytes from 10.0.0.4: icmp_seq=8 ttl=64 time=1.92 ms 3880 bytes from 10.0.0.4: icmp_seq=9 ttl=64 time=2.72 ms 3880 bytes from 10.0.0.4: icmp_seq=10 ttl=64 time=1.20 ms --- 10.0.0.4 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 9014ms rtt min/avg/max/mdev = 1.051/2.138/5.666/1.426 ms
來源和目的地之間設定不相符的指示,會在輸出中顯示為錯誤訊息。 在此情況下,不會在來源網路介面上設定 MTU。
azureuser@vm-2:~/GetPathMTU$ ping 10.0.0.4 -c 10 -M do -s 3872 PING 10.0.0.4 (10.0.0.4) 3872(3900) bytes of data. ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 ping: local error: message too long, mtu=1500 --- 10.0.0.4 ping statistics --- 10 packets transmitted, 0 received, +10 errors, 100% packet loss, time 9248ms
還原變更
若要還原此文章中所做的變更,請使用下列步驟:
登入 vm-1。
使用下列範例來將 MTU 值設定為預設值 1500:
echo '1500' | sudo tee /sys/class/net/eth0/mtu || echo "failed: $?"
重要
在先前步驟中進行的 MTU 變更不會在重新開機期間持續保存。 若要進行永久變更,請參閱 Linux 發行版本的適當文件。
使用
ip
命令來驗證 MTU 設定是否已套用至網路介面:ip address show
azureuser@vm-1:~$ ip address show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0d:3a:c5:f3:14 brd ff:ff:ff:ff:ff:ff inet 10.0.0.4/24 metric 100 brd 10.0.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::20d:3aff:fec5:f314/64 scope link valid_lft forever preferred_lft forever 3: enP46433s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master eth0 state UP group default qlen 1000 link/ether 00:0d:3a:c5:f3:14 brd ff:ff:ff:ff:ff:ff altname enP46433p0s2 inet6 fe80::20d:3aff:fec5:f314/64 scope link valid_lft forever preferred_lft forever
登入 vm-2 並重複執行上述步驟,以將 MTU 值設定為預設值 1500。
相關內容
- Microsoft Azure 網路介面卡 (MANA) 概觀 (部分機器翻譯)。