Назад | Перейти на главную страницу

Amazon EC2 VPC: падение скорости загрузки инстанса NAT

У меня есть набор серверов внутри Amazon EC2 в VPC. Внутри этого VPC у меня есть частная подсеть и общедоступная подсеть. В публичной подсети я установил NAT-машину на экземпляре t2.micro, который в основном запускает этот сценарий NAT при запуске, внедрение правил в iptables. Загрузка файлов из Интернета с компьютера в частной подсети работает нормально.

Однако я сравнил скорость загрузки файла на внешнем FTP-сервере с высокой пропускной способностью непосредственно с моей машины NAT со скоростью загрузки с машины в моей частной подсети (через ту же машину NAT). Была действительно значительная разница: около 10 МБ / с с машины NAT против 1 МБ / с при загрузке с машины внутри частной подсети.

На машине NAT нет загрузки ЦП, поэтому это не может быть узким местом. При проведении того же теста на машинах большего размера (m3.medium с «средней производительностью сети» и m3.xlarge с «высокой производительностью сети») я также не смог получить скорость загрузки выше 2,5 МБ / с.

Это общая проблема NAT, которую можно (и нужно) настраивать? Откуда падение производительности?

Обновить

Проведя небольшое тестирование, я смог бы сузить эту проблему. Когда я использую Ubuntu 12.04 или Amazon Linux NAT с 2013 года, все работает без сбоев, и я получаю полную скорость загрузки даже на самых маленьких инстансах t2.micro. Не имеет значения, использую ли я машины PV или HVM. Проблема, похоже, связана с ядром. Эти старые машины имеют версию ядра 3.4.x, тогда как новые машины Amazon Linux NAT или Ubunut 14.XX имеют версию ядра 3.14.XX. Есть ли способ настроить новые машины?

Наконец-то мы нашли решение. Вы можете исправить скорость загрузки, запустив на машине NAT (как root):

ethtool -K eth0 sg off

Это отключает режим разброса-сбора, который (насколько я понимаю) останавливает разгрузку некоторой сетевой работы на самой сетевой карте. Отключение этой опции приводит к более высокой загрузке ЦП на клиенте, поскольку теперь ЦП должен делать всю работу сам. Однако на машине t2.micro при загрузке образа DVD мы увидели только около 5% использования ЦП.

Обратите внимание, что это не выдержит перезагрузки, поэтому обязательно установите это в rc.local или хотя бы до настройки NAT.

Я также использую блоки NAT в аналогичной настройке на производстве, поэтому очень заинтересован в ваших результатах. У меня не было подобных результатов до производства, но, возможно, это проблема, на которую я раньше не обращал внимания.

Давайте займемся наукой!

================================================== ==========================

Теория: блоки NAT могут загружаться и выгружаться быстрее, чем клиент, использующий NAT.

Эксперимент: сопоставьте эксперимент с вопрошающими. t2.micros с Amazon NAT 2014.09 2 подсети, при этом NAT идет на IGW, а частная подсеть указывает на NAT. (Общая аренда. SSD общего назначения)

Процедура:

# install speedtest
$ sudo yum install python-pip -y --enablerepo=epel; sudo pip install speedtest-cli
# run against the same server
$ speedtest-cli --server 935 --simple
# run it many times
$ for ((n=0;n<10;n++)); do speedtest-cli --simple --server 935; done

Данные:

          Nat:     Client
Download  727.38   157.99
Upload    250.50   138.91

Вывод: ОП не врет.

================================================== ==========================

Теория: разные версии ядра приводят к разным результатам.

Эксперимент: установите 3 ящика с физическими данными, каждый с магнитным SSD, m3.medium (без разрывов) и выделенной арендой. Проведите тест скорости.

Порядок действий: см. Последний эксперимент. Кроме того, настройте таблицу маршрутизации для каждого блока NAT. Использовал таблицу маршрутизации «черная дыра», чтобы доказать, что изменения распространяются, когда я менял местами таблицы маршрутизации.

  1. Используя NAT.
  2. curl google.com работает.
  3. Переключитесь на черную дыру.
  4. Ждать curl google.com потерпеть неудачу на клиенте.
  5. Переключитесь на новый NAT.
  6. curl google.com работает.

Вот мои 3 нац ящика: 2014.09 3.14.20-20.44.amzn1.x86_64 2014.03 3.10.42-52.145.amzn1.x86_64 2013.09 3.4.62-53.42.amzn1.x86_64

Данные:

Все 3 коробки дают очень похожие результаты при запуске speedtest-cli --server 935

09/14   03/14   09/13
355.51, 356.55, 364.04
222.59, 212.45, 252.69

От клиента:

09/14   03/14   09/13
351.18, 364.85, 363.69
186.96, 257.58, 248.04

Вывод: есть ли деградация? Нет. Есть ли разница между версиями ядра? Нет.

================================================== ==========================

Теория: Выделенная аренда или совместная аренда имеет значение.

Эксперимент: 2 ящика NAT. Оба используют NAT 2014.09. Один с общей арендой, другой с выделенной арендой.

Данные: Оба блока имеют одинаковую производительность:

Shared Nat   Dedicated Nat
387.67       387.26
296.27       336.89

У них также есть похожие стандартные отклонения:

$ python3
>>> import statistics
>>> shared_download = [388.25, 333.66, 337.44, 334.72, 338.38, 335.52, 333.73, 333.28, 334.43, 335.60]
>>> statistics.stdev(shared_download)
16.858005318937742
>>> dedicated_download = [388.59, 338.68, 333.97, 337.42, 326.77, 346.87, 336.74, 345.52, 362.75, 336.77]
>>> statistics.stdev(dedicated_download)
17.96480002671891

И когда вы запускаете комбинации 2x2:

      Shared Client/Sh. NAT  Sh. Client/Dedicated Nat  Ded. Client/Sh. Nat  Ded. Client/Ded. NAT
Upload       290.83                      288.17                283.13              340.94
Download     260.01                      250.75                248.05              236.06

Вывод: действительно непонятно, какое значение имеет общий или выделенный.

Мета выводы:

Тест, который, вероятно, стоит повторить, будет тест OP с m3.mediums. Мне удалось скопировать результаты t2.micro, но мой m3.medium, похоже, противоречит результатам OP m3.medium.

Мне было бы интересно увидеть ваши данные о версиях ядра.

Возможно, самая интересная часть - это то, как мне не удалось быстро настроить NAT m3.medium.

Мои тесты показали, что это ухудшило мои загрузки.

m3.large speedtest server m3.medium выделенный NAT-сервер.

Никакого другого трафика в этой среде.

sg в среднем Скорость загрузки: 292,19 sg ниже среднего Скорость загрузки: 259,21

Мой тест был таким: для ((n = 0; n <10; n ++)); сделать speedtest-cli --simple; сделано