Предпосылки / Обзор:
У нас есть веб-приложение Python с тремя средами в двух проектах: staging / dev и production. Они размещаются в GCP с использованием гибкой среды Google App Engine, Cloud SQL и корзины GCP для статических файлов. Эти среды работают хорошо и очень отзывчивы. Мы решили разбить среду подготовки / разработки на два отдельных проекта, чтобы можно было настроить среду подготовки так, чтобы она была ближе к производственной.
Эта проблема:
Мы настраиваем проект разработчика таким же образом, как и наша тестовая среда. Однако экземпляр перестает отвечать после того, как несколько запросов от рабочих Gunicorn в конечном итоге истекло. При дополнительном исследовании с использованием Stack Driver и top мы заметили, что экземпляр App Engine тратит много времени на ожидание ввода-вывода. Top постоянно сообщает, что время ожидания процессора (wa) составляет около 90%. Кроме того, когда мы пытаемся подключиться к экземпляру по SSH, мы обнаруживаем, что подключение занимает много времени, иногда 5 или более минут, а иногда вообще не удается подключиться. Как только мы попадаем внутрь, опыт работы с оболочкой сильно отстает. Используя команды докера, такие как docker container ls
Иногда для возврата списка контейнеров требуется несколько минут, а иногда результаты не возвращаются, что приводит к перезапуску экземпляра, с другой стороны, использование top работает хорошо. Когда мне удается попасть в контейнер докеров, в котором запущено наше приложение, опыт почти такой же, но трудно отследить, какие операции ввода-вывода вызывают проблемы, поскольку оболочка быстро перестает отвечать. Кроме того, если мы дадим приложению простаивать около получаса, мы сможем последовательно запустить оболочку в экземпляр, но после обстрела (docker exec -it [id] /bin/bash
) в контейнер докеров приложения, вещи быстро перестают отвечать.
Что наблюдается
Мысли / TL; DR
У нас что-то не так с конфигурацией нашей новой среды разработки / проекта, которая, похоже, вызывает медленную скорость ввода-вывода. Ранее эта конфигурация работала параллельно с нашей промежуточной средой в другом проекте. Наши утки кажутся стоящими в ряд из всего, что мы видим и можем придумать, но мы явно чего-то упускаем. Мы будем благодарны за любую помощь и идеи.
Решением было создать новый проект. Настраиваем точно так же, за исключением использования AppEngine Standard вместо Flex. Затем мы просто обновили переменные среды, чтобы использовать новый идентификатор проекта, идентификатор корзины и ключ учетной записи службы, и все заработало.
Либо у нас где-то была неверная опция конфигурации в нашем старом проекте, либо на стороне GCP произошло что-то странное. Мне все еще кажется очень странным, что новый экземпляр без трафика (и поэтому ни один из наших кодов не выполнялся) умирает, просто запустив apt-get
при обстреле в тару.