Настройка максимальной единицы передачи (MTU) для виртуальных машин в Azure

Максимальная единица передачи (MTU) — это измерение, представляющее самый большой размер кадра Ethernet (пакет), передаваемый сетевым устройством или интерфейсом. Если пакет превышает самый большой размер, принятый устройством, пакет фрагментируется на несколько небольших пакетов, а затем повторно собирается в месте назначения.

Фрагментация и повторная сборка могут привести к проблемам производительности и упорядочивания, что приводит к неоптимальному интерфейсу. Оптимизация MTU для решения может обеспечить преимущества производительности пропускной способности сети, уменьшая общее количество пакетов, необходимых для отправки набора данных. Настройка более крупных размеров MTU может повысить пропускную способность сети, так как она уменьшает количество пакетов и затрат заголовков, необходимых для отправки набора данных.

MTU — это настраиваемый параметр в операционной системе виртуальной машины. Значение MTU по умолчанию в Azure равно 1500 байтам.

Виртуальные машины в Azure могут поддерживать более крупный MTU, чем 1500-байтовый по умолчанию только для трафика, который остается в виртуальной сети.

В следующей таблице показан самый большой размер MTU, поддерживаемый в сетевых интерфейсах Azure, доступных в Azure:

Операционная система Сетевой интерфейс Самый большой MTU для трафика между виртуальными сетями
Windows Server Mellanox Cx-3, Cx-4, Cx-5 3900
При задании значения MTU используйте Set-NetAdapterAdvancedPropertyзначение 4088.. Чтобы значение сохранялось после перезагрузки, значение, возвращаемое Test-Connection, также необходимо задать с помощью Set-NetIPInterface.
Windows Server Microsoft Azure Network Adapter MANA 9000
При установке значения MTU с помощью Set-NetAdapterAdvancedProperty используйте значение 9014.Чтобы значение сохранялось после перезагрузки, значение, возвращаемое командой Test-Connection, также должно быть установлено с помощью Set-NetIPInterface.
Линукс Mellanox Cx-3, Cx-4, Cx-5 3900
Линукс Microsoft Azure Network Adapter 9000

Предварительные требования

  • Учетная запись Azure с активной подпиской. Создайте ее бесплатно.

  • Две виртуальные машины Linux в одной виртуальной сети в Azure. Дополнительные сведения о создании виртуальной машины Linux см. в статье "Создание виртуальной машины Linux" в портал Azure. Для завершения статьи требуется удаленный доступ к виртуальным машинам. Дополнительные сведения о безопасном подключении к виртуальным машинам Azure см. в статье Что такое Бастион Azure?

    • В целях этой статьи виртуальные машины называются vm-1 и vm-2. Замените эти значения вашими значениями.

Примеры ресурсов

Следующие ресурсы используются в качестве примеров в этой статье. Замените эти значения вашими значениями.

Ресурс Имя. IP-адрес
Виртуальная машина 1 vm-1 10.0.0.4
Виртуальная машина 2 vm-2 10.0.0.5

Профилактика

  • Виртуальные машины в Azure могут поддерживать более крупный MTU, чем 1500 байтов по умолчанию, только для трафика, который остается в виртуальной сети и напрямую соединившихся пиринговых виртуальных сетей в одном регионе. Трафик, проходящий через шлюзы, глобальные пиринги или Интернет, не поддерживается. Конфигурация большего MTU может привести к фрагментации и снижению производительности. Для трафика, использующего эти сценарии, применяйте для тестирования значение MTU по умолчанию — 1500 байт, чтобы убедиться, что увеличенный MTU поддерживается на всём протяжении сетевого пути.

  • Оптимальное значение MTU зависит от операционной системы, сети и приложения. Максимальный поддерживаемый MTU может быть неоптимальным для вашего варианта использования.

  • Всегда сначала тестируйте изменения настроек MTU в некритической среде, прежде чем широко внедрять их или использовать в критически важных средах.

Обнаружение MTU на пути

Важно понимать, какой MTU поддерживается на всём сетевом пути, который использует ваше приложение или ваши машины. Обнаружение MTU на пути — это способ определить максимальный MTU, поддерживаемый на пути между адресами источника и назначения. Использование большего MTU, чем поддерживается между исходным и целевым адресом, приводит к фрагментации, что может негативно повлиять на производительность.

В этой статье в примерах проверяется путь MTU между двумя виртуальными машинами. Последующие тесты можно выполнять из виртуальной машины в любое маршрутизируемое место назначения.

Чтобы задать размер MTU на исходной и целевой виртуальной машине, выполните следующие действия. Проверьте путь MTU с помощью скрипта оболочки для Linux или PowerShell для Windows. Если более крупный MTU не поддерживается, результаты, отображаемые в тесте обнаружения MTU пути, отличаются от параметров, настроенных в интерфейсе исходной или целевой виртуальной машины.

Скрипт оболочки доступен в коллекции примеров Azure. Скачайте скрипт для Linux со следующей ссылки и сохраните его в vm-1 и vm-2.

Чтобы изменить размер MTU на виртуальной машине Linux, выполните следующие действия.

  1. Вход в vm-1

  2. ip Используйте команду, чтобы отобразить текущие сетевые интерфейсы и их параметры MTU, запишите IP-адрес для последующих шагов. В этом примере IP-адрес равен 10.0.0.4 , а интерфейс ethernet — 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
    
  3. Установите значение MTU на vm-1 на максимальное значение, поддерживаемое сетевым интерфейсом. В этом примере имя сетевого интерфейса — 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.

  4. 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
    
  5. Войдите в vm-2 , чтобы повторить предыдущие шаги, чтобы задать значение MTU самым высоким значением, поддерживаемым сетевым интерфейсом.

  6. Войдите в vm-1.

  7. Используйте следующий пример, чтобы выполнить скрипт оболочки Linux, чтобы проверить самый большой размер MTU, который можно использовать для определенного сетевого пути. Замените значение целевого хоста на IP-адрес vm-2.

    ./GetPathMtu.sh 10.0.0.5
    
  8. Результат будет похож на следующий пример. Если выходные данные скрипта не отображают параметр в сетевом интерфейсе, он указывает, что размер MTU не задан правильно. Кроме того, это может означать, что сетевое устройство вдоль пути поддерживает только размер MTU, возвращаемый скриптом GetPathMTU.

    azureuser@vm-1:~/GetPathMTU$ ./GetPathMtu.sh 10.0.0.5
    destination: 10.0.0.5
    startSendBufferSize: 1200
    interfaceName: Default interface
    Test started ....................................................................................................................................................................................................
    3900
    
  9. Проверьте размер MTU в сетевом интерфейсе с помощью PING. Для Linux используйте флаги -M, -s и -c. Параметр -M указывает утилите ping не выполнять фрагментацию, -s задает размер пакета, а -c — количество отправляемых эхо-запросов. Чтобы определить размер пакета, вычтите 28 из значения параметра MTU, равного 3900.

    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
    
  10. Войдите в vm-2.

  11. Используйте следующий пример для запуска скрипта оболочки Linux для тестирования наибольшего размера MTU, который можно использовать для определенного сетевого пути:

    ./GetPathMtu.sh 10.0.0.4
    
  12. Результат будет похож на следующий пример. Если выходные данные скрипта не отображают параметр в сетевом интерфейсе, он указывает, что размер MTU не задан правильно. Кроме того, это может означать, что сетевое устройство вдоль пути поддерживает только размер MTU, возвращаемый скриптом GetPathMTU.

    azureuser@vm-1:~/GetPathMTU$ ./GetPathMtu.sh 10.0.0.4
    destination: 10.0.0.4
    startSendBufferSize: 1200
    interfaceName: Default interface
    Test started ....................................................................................................................................................................................................
    3900
    
  13. Проверьте размер MTU в сетевом интерфейсе с помощью PING. Для Linux используйте флаги -M, -s и -c. Параметр -M указывает утилите ping не выполнять фрагментацию, -s задает размер пакета, а -c — количество отправляемых эхо-запросов. Чтобы определить размер пакета, вычтите 28 из значения параметра MTU, равного 3900.

    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
    

Отменить изменения

Чтобы вернуть изменения, внесенные в эту статью, выполните следующие действия.

  1. Войдите в vm-1.

  2. Используйте следующий пример, чтобы задать значение MTU значением по умолчанию 1500:

    echo '1500' | sudo tee /sys/class/net/eth0/mtu || echo "failed: $?"
    

    Внимание

    Изменения MTU, внесенные в предыдущие шаги, не сохраняются во время перезагрузки. Чтобы внести изменения, ознакомьтесь с соответствующей документацией по дистрибутиву Linux.

  3. 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
    
  4. Войдите в vm-2 , чтобы повторить предыдущие шаги, чтобы задать значение MTU значением по умолчанию 1500.

  • Обзор сетевого адаптера Microsoft Azure (MANA).