Рубрики
Uncategorized

DataDog открывает скрытые проблемы с производительностью AWS

В ЛОБ, в настоящее время мы используем COVOX как нашу платформу развертывания, «Roll ваша собственная платформа-AS-A-A-Service» … Теги с программированием, тестированием, дежопами, производительностью.

В ЛОБ мы используем Озвучивать В качестве нашей платформы развертывания «бросьте свою собственную платформу — AS-A-Service», которую вы можете установить для обработки оркестрации контейнера на ECS AWS (упругая контейнер). Конновация показывает свой возраст, и в этом году мы начали процесс замены обозвательства с Hashicorp’s Ночевка , гибкая рабочая нагрузка оркестрататора для развертывания и управления нашими контейнерами на AWS.

Поскольку мы подготовили нашу миграцию к номаду, наша самая большая проблема была выполнена. Мы начали наши тесты со преобразованиями доказательства концепции нашего API в кочевке. Мы сравниваем и сравниваем две системы и нашли кочевшую работу медленнее. Это было чрезвычайно удивительно, так как COVOX (которые используют AWS упругие контейнерные услуги) и NOMAD оба используют контейнеры Docker под крышками. Мы предположили, что поживает со старшего к более новым технологиям, приведет к тому, что некоторые выроды производительности.

Почему наши страдания производительности?

Благодаря ускоренному кластеру NOMAD мы изначально не были настроены с агентом DataDog для сбора следов и профилей приложений.

Наше первоначальное тестирование производительности показало, что каждый запрос плохо выполнен с задержкой четырех второй, независимо от нагрузки, которая была неожиданной. Даже незнакомец, запустив тест нагрузки, показал, что производительность стала лучше и будет идти вверх и вниз со временем. Внутренне мы обсудили, была ли неудачная производительность базы данных была причиной. Однако с почетным временем процесс удаления кода и соблюдения результатов мы обнаружили, что четыре-секундная задержка произошла при сохранении запросов к нашему ведрю AWS S3.

Чтобы определить, был ли проблема в нашем коде или в инфраструктуре, нам нужно было выделить код подозрительного кода и настроить DataDog для эффективного прослеживания взаимодействия между нашим приложением и инфраструктурой. Мы сделали это, извлекли метод загрузки S3 из нашей кодовой базы производства, чтобы устранить шум в нашей трассе, настроив библиотеку Trace Trace DataDog APM для этого кода и включения агента DataDog в нашем кластере Nomad.

Мы нашли 4 последовательных вызовов с восклицами в Datadog. Почему S3 загрузка причина 4 http поставленных запросов? И почему каждый запрос провалился после ровно 1 секунды?

Глядя ближе, мы нашли зависания сокетов и вызывающим IP-адрес.

AWS JavaScript SDK делает 4 попытки позвонить в службу метаданных облака упругих вычислений (EC2) (это IP-адрес 169.254.169.254), затем сдается и пытается что-то еще, прежде чем успешно загружать файл на S3. Это оправдало наших разработчиков, так как ясно не было проблемой с нашим кодом. Что-то не было правильно с нашей инфраструктурой.

Давайте на минуту уменьшим и обсудите, как Amazon Services обменивается информацией друг с другом. Все запросы AWS API должны быть подписаны с учетными данными, которые связывают обратно к роли IAM с конкретными разрешениями, такие как загрузка объектов к нашему ведрю AWS S3. Традиционно эта роль будет связана с ключами доступа, и эти учетные данные будут загружены в ваше приложение — потенциально разоблачать их .

AWS предоставляет более безопасный механизм, когда вызовы происходят от службы AWS. Для наших существующих созванных служб, это был роли экземпляра контейнера ECS. Для служб, работающих на ECS с связанной ролью экземпляра, AWS SDK автоматически вызовет автоматически вызовет API метаданных в нашем кластере ECS, чтобы получить временные учетные данные, которые он может использовать для доступа к другим услугам Amazon, такие как S3. Это означает, что мы не должны включать наши учетные данные AWS в нашем коде, и разрешения IAM могут быть непосредственно привязаны к самому обслуживанию ECS. Для EC2 существуют профили экземпляра EC2, которые функционируют практически одинаково.

Почти.

Почему ок N’t, не могу, не могу, не могу, и, наконец, может получить AWS SDK достичь метаданных API на моем экземпляре EC2?

Итак, почему требуются звонки в службу Metadata EC2, но как-то все еще преуспевают в конце? После нескольких часов разрыва через все JavaScript AWS SDK Documentation и ничего не нахожу, мы обратились к Google. Поиск IP-адреса, который мы видели в Datadog, привели к документации на API метаданных экземпляра EC2:

AWS SDKS использует вызовы IMDSV2 по умолчанию. Если вызов IMDSV2 не получает ответа, SDK повторяет вызов и, если все еще неудачно, использует IMDSV1. Это может привести к задержке.

В контейнерной среде, если ограничение в хоп 1, ответ IMDSV2 не возвращается, потому что переход к контейнеру считается дополнительным сетевым ходом. Чтобы избежать процесса падения на IMDSV1 и полученную задержку, в контейнерной среде мы рекомендуем вам установить лимит прыжка на 2. Для получения дополнительной информации см. Настройте параметры метаданных экземпляра .

Перевод: Для того, чтобы SDK, запущенный в номинационном контейнере, для получения учетных данных оно должно пройти через экземпляр EC2 для достижения API EC2 Metadata. Это считается двумя «хмелями», а ограничение по умолчанию является одним! Мы изменили предел прыжка до двух, и время запроса отброшено с 4 секунд до 85 мс.

Вот трассировка DataDog APM после увеличения лимита прыжка до двух.

Что не так с этой картиной?

Чтобы положить его прямо, профили экземпляра EC2 не являются правильным способом предоставления учетных данных приложениям, работающим в контейнере Orchestrator. Они слишком грубые зернистые. Разрешения предоставляются всем приложениям, работающим на экземпляре EC2, а не конкретным приложением или услугами. В конце концов, вот почему ECS, которая работает на экземплярах EC2, и поэтому может использовать профили экземпляра EC2, вместо этого полагаются на профили экземпляра ECS.

Так почему же мы? Поскольку нам нужно было временному решению, чтобы проверить наш доказательную концепцию кластера NOMAD, а профили экземпляра EC2 были тантализовать аналогичные профилям экземпляра ECS — нашего раствора хлеба и масла в COVOX.

Ох, и они делают работу. Приложение смогло получить доступ к частным ведрю S3. Ну, в конце концов. Главным образом.

Проблема в том, что SDK AWS JavaScript SDK в конечном итоге преуспевает, что маскирует основную проблему. Это нарушает Принцип наименее удивления Отказ В основном, система должна вести себя так, чтобы большинство пользователей ожидают, что это будет вести себя. Поведение не должно удивлять или удивлять пользователям. Вы можете описать поведение SDK как псевдо безмолвной неудачи. Наша производительность приложений была серьезно ухудшенная, и мы не знали, что ничего не так. Как разработчики, мы ожидаем, что вещи добиваются успеха или неудачно, а не в основном терпят неудачу, а затем добиться успеха.

Вам может быть интересно, почему AWS не настраивает ограничение подъема по умолчанию выше? Мы не знаем наверняка, но наше предположение было бы в целях безопасности. Низкий предел хмеля по умолчанию гарантирует, что запросы учетных данных возникают внутри экземпляра EC2 и заставляет разработчиков сделать выбор для увеличения ограничения подъема и осознавать любые связанные с ними риски.

Вывод

Несколько уроков могут быть взяты из нашего опыта отслеживания этой проблемы с производительностью

* Регулярно проверяйте производительность вашего приложения * Используйте современные инструменты, такие как Datadog При расследовании проблем с производительностью * Изолировать код подозреваемого, чтобы удалить шум и соблюдать сигнал * Копай в документацию * Google может помочь вашему расследованию, когда вы раскрыли уникальные подсказки

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

Оригинал: «https://dev.to/lob/datadog-reveals-hidden-aws-performance-problems-2of»