Вопрос с собеседования · System design

Сервис работает на двадцати инстансах. Добавление ещё десяти не уменьшает время ответа. Как вы будете искать причину и что предпримете?

MiddleМасштабирование
Ещё спрашивают так:
  • Почему новые экземпляры не ускорили сервис?
Коротко

Ограничение не в приложении: нужно разложить время запроса и найти насыщенный общий ресурс — чаще всего база или пул соединений.

  • Трассировка показывает, где время: CPU, ожидание базы, внешние вызовы, очередь за соединением
  • Общие ограничения: пул, единственный лидер записи, глобальная блокировка, строка-счётчик, квота внешнего API
  • Исправлять узкое место: запросы, кэш, реплики, шардирование, разбиение счётчиков

А ещё Закон Амдала: последовательная часть ограничивает ускорение

Подробно

Начинать нужно с измерения, а не с гипотез: по трассировке видно, где проведено время — в процессоре приложения, в ожидании базы, во внешних вызовах или в очереди на получение соединения из пула. Если время уходит на ожидание, добавление инстансов бесполезно по определению. Дальше ищем разделяемое ограничение: полностью занятый пул соединений при низкой загрузке процессора, единственный лидер записи, глобальная блокировка или строка-счётчик, которую обновляют все, квота внешнего API. Полезно назвать и общий принцип: последовательная часть работы задаёт потолок ускорения, а координация между узлами способна дать отрицательную отдачу — тридцать инстансов открывают в полтора раза больше соединений и могут ухудшить положение базы. Дальше действуем по найденной причине: убрать запросы в цикле и добавить индексы, включить пакетную обработку, поставить кэш, развести чтения по репликам, при упоре в запись — шардировать, а число соединений ограничить пулером. И обязательно назвать метрику, по которой станет видно, что помогло: задержка на девяносто девятом перцентиле и насыщение пулов, а не средняя загрузка процессора.

Что хотят услышать

  • Измерение до гипотез.
  • Поиск общего насыщенного ресурса с примерами.
  • Меры против конкретного узкого места.

Частые ошибки

  • Добавлять инстансы, не измерив, где проведено время запроса.
  • Смотреть на утилизацию процессора вместо насыщения пулов и очередей.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Добавить ещё двадцать инстансов и включить автомасштабирование
  • ✗Поднять размер кучи и число потоков на каждом инстансе приложения, так как упирается сам код сервиса
  • ✓Искать общий насыщенный ресурс
  • ✗Заменить балансировщик на более быстрый и перейти на HTTP/2

Что спросят дальше

  • Почему при приближении утилизации к ста процентам задержка растёт нелинейно?
  • В каком порядке вы будете применять кэш, реплики и шардинг?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования