Каждый следующий прогон упирался в новое место. Мы находили причину, исправляли её и давали нагрузку снова. Узкие места — в том порядке, в котором их нашли:
- Процессор бэкенда. Время отклика подов было неравномерным: под нагрузкой они упирались в процессор. Мы добавили пул более мощных нод и вынесли бэкенд на выделенные ноды с помощью taints и tolerations — механизма Kubernetes, который не пускает на ноду посторонние поды. Ресурсы подов бэкенда подбирали вместе с разработкой заказчика.
- Кэш скомпилированного PHP-кода. Чтобы понять, что именно нагружает процессор, развернули профилировщик Blackfire. С его помощью нашли, что opcache — кэш скомпилированного PHP-кода — был выключен. После включения кэша получили прирост на простом запросе (получение JSON): с 270 запросов в секунду на 8 ядрах до 1800 на 6 ядрах. После этого перешли к расширенным тестам.
- Размер кластера MongoDB. Во время очередного теста попытались увеличить кластер MongoDB, но ни добавить реплики, ни увеличить их размер не получилось: это оказалась ошибка на стороне провайдера. Мы завели обращение в поддержку и временно подняли другой кластер. После исправления проверили, что размер меняется на лету: запросы во время изменения шли без ошибок. Один из следующих тестов упёрся в MongoDB, и по его итогам кластер увеличили.
- Входящий трафик. Ingress-контроллер — точку входа HTTP-трафика в кластер — вынесли на отдельный пул нод, дали ему больше ресурсов и настроили его масштабирование.