У меня есть набор серверов внутри Amazon VPC, задача которых - получать файлы изображений из S3 и обрабатывать их. Загрузка S3 часто останавливалась, иногда более чем на 2 минуты, но в конечном итоге все удавалось. Чтобы исключить проблемы с приложением, я создал простой список URL-адресов в текстовом файле и передал их по конвейеру через curl:
time <images.txt xargs -I% curl -O %
В файле 352 изображения, размер которых варьируется от 13 КБ до 1,3 МБ. Повторное выполнение сценария вызывало те же проблемы, что и приложение. Мне не удалось воспроизвести проблему при запуске сценария непосредственно на экземпляре NAT, а также я заметил значительное улучшение общей производительности при запуске его на NAT.
После некоторого исследования я нашел этот вопрос о сбое сервера: "Amazon EC2 VPC: падение скорости загрузки инстанса NAT". Решением было использование ethtool для отключения опции режима разброса-сбора TCP Offload Engine. Это решило проблему зависания для меня, но не исправило общую разницу в производительности между NAT и клиентами, находящимися за NAT. После многих при вызовах среднее время выполнения сценария на NAT составляет около 15 секунд, а на клиентах за NAT - около 35 секунд.
Тип инстанса NAT - стандартный Amazon NAT t2.small (3.14.26-24.46.amzn1.x86_64). Несмотря на то, что загрузка процессора при NAT была крошечной, я пробовал разные типы инстансов, включая m1.medium и m3.2xlarge. Ни один из них не оказал существенного влияния на производительность NAT. Я попытался настроить несколько различных параметров, включая отключение дополнительных функций TOE и увеличение размера хэша ip_conntrack_max и conntrack. Я действительно не ожидал, что это будет иметь большое значение, и мои тесты не показали значительных изменений.
Ожидается ли в этом сценарии снижение скорости загрузки на ~ 50% при прохождении через NAT? Я понимаю, что NAT / PAT добавляет дополнительный переход и некоторую дополнительную обработку пакетов, но мне все равно кажется, что производительность сильно падает. Если этого не следует ожидать, что я могу сделать, чтобы диагностировать проблему?