Превращаю IT-хаос в систему:
Легаси? Реанимируем.
Команды? Синхронизируем.
Бизнес? Освободим от операционки.
Ваш СТО-наставник с практикой.
Post #41
471
К вам уже приходили в этом году с вопросом "ожидаем х4 трафик, сервер выдержит?"
Новый год к нам мчится, а с ним и сезонные нагрузки.
Самый простой способ ответить на этот вопрос — бахнуть нагрузочный тест.
Посмотреть сколько вообще система переваривает, и как растут метрики под нагрузкой.
А если нет еще сервера, или вы сидите на интервью по систем дизайну, или вам для тех плана "монолит в микросервисы за 3 года!" нужно прикинуть сколько и каких железок нужно, что делать?
Давайте учиться считать. Как минимум на секции систем дизайна пригодится.
Что мы имеем.
Нужно держать 3000 rps, время ответа около 200ms.
1) нам нужно понять сколько CPU способны переваривать такой объем.
Запускаем профилировщик запроса (который будет крутиться на сервере), выкидываем оттуда I/O, обращения по сети, запросы к БД и прочему. Нас интересует только CPU time.
Обычно это 1-20ms на каждый запрос, у нас допустим 10 (для простоты счета). 1000ms / 10ms = 100 запросов в секунду в 1 потоке можем переваривать в идеальных условиях. Но, помните про теорию очередей и кривую утилизации? Умножаем на 0.6 (утилизация не более 60%) и получаем что нам нужно 3000 (rps) / (100 (запросов на ядро) * 0.6 (утилизация)) = 50 vCPU
Важно, 1 vCPU != "1 физическое ядро моего ноутбука". Снимайте профиль на целевой платформе а не у себя на ноуте.
Если CPU time 2ms — нужно 10 vCPU, если 20ms — 100 vCPU. Собственно поэтому так важна каждая миллисекунда CPU.
2) Кроме CPU на серверах еще и оперативная память есть.
Тут тоже все просто, количество запросов в системе в единицу времени умноженное на количество памяти необходимое на 1 запрос. (Вспоминаем закон Литтла, вот тут писал недавно)
У нас 3к rps. Время ответа 200ms. На 1 запрос требуется 80Mb.
Получаем 3000 * 0.2 * 80 =48Gb
А если время ответа 150ms а запрос потребляет 60Mb?
3000 * 0.15 * 60 =27Gb почти в 2 раза меньше, хотя мы поджали 25% задержку и на 20% оптимизировали по памяти (по отдельности не выглядит как что то сверх невероятное).
Модель грубая, в реальности потреблять будет меньше, из-за кэшей, пулов, куч/стеков/горутин (смотря что у вас за язык). Но порядок цифр посчитать удастся. Ну и утилизацию держим в районе 50-70%, остальное съедят I/O, системные/сайдкары, пики, фрагментация, GC.
Итого.
Чтобы держать 3к RPS при задержке 200ms и утилизации 60% нам потребуется 50vCPU и 80Gb памяти. При 10ms CPU time и 80Mb на запрос.
В реальности у вас будут естественно другие цифры, но порядок тот же.
PS. Есть сервисы где требуются экстремальные p99 — там утилизация вообще до 30-40% может опускаться, возможно у вас такой сервис (трейдинг, гейминг, финтех, etc), имейте это ввиду.
Новый год к нам мчится, а с ним и сезонные нагрузки.
Самый простой способ ответить на этот вопрос — бахнуть нагрузочный тест.
Посмотреть сколько вообще система переваривает, и как растут метрики под нагрузкой.
А если нет еще сервера, или вы сидите на интервью по систем дизайну, или вам для тех плана "монолит в микросервисы за 3 года!" нужно прикинуть сколько и каких железок нужно, что делать?
Давайте учиться считать. Как минимум на секции систем дизайна пригодится.
Что мы имеем.
Нужно держать 3000 rps, время ответа около 200ms.
1) нам нужно понять сколько CPU способны переваривать такой объем.
Запускаем профилировщик запроса (который будет крутиться на сервере), выкидываем оттуда I/O, обращения по сети, запросы к БД и прочему. Нас интересует только CPU time.
Обычно это 1-20ms на каждый запрос, у нас допустим 10 (для простоты счета). 1000ms / 10ms = 100 запросов в секунду в 1 потоке можем переваривать в идеальных условиях. Но, помните про теорию очередей и кривую утилизации? Умножаем на 0.6 (утилизация не более 60%) и получаем что нам нужно 3000 (rps) / (100 (запросов на ядро) * 0.6 (утилизация)) = 50 vCPU
Важно, 1 vCPU != "1 физическое ядро моего ноутбука". Снимайте профиль на целевой платформе а не у себя на ноуте.
Если CPU time 2ms — нужно 10 vCPU, если 20ms — 100 vCPU. Собственно поэтому так важна каждая миллисекунда CPU.
2) Кроме CPU на серверах еще и оперативная память есть.
Тут тоже все просто, количество запросов в системе в единицу времени умноженное на количество памяти необходимое на 1 запрос. (Вспоминаем закон Литтла, вот тут писал недавно)
У нас 3к rps. Время ответа 200ms. На 1 запрос требуется 80Mb.
Получаем 3000 * 0.2 * 80 =48Gb
А если время ответа 150ms а запрос потребляет 60Mb?
3000 * 0.15 * 60 =27Gb почти в 2 раза меньше, хотя мы поджали 25% задержку и на 20% оптимизировали по памяти (по отдельности не выглядит как что то сверх невероятное).
Модель грубая, в реальности потреблять будет меньше, из-за кэшей, пулов, куч/стеков/горутин (смотря что у вас за язык). Но порядок цифр посчитать удастся. Ну и утилизацию держим в районе 50-70%, остальное съедят I/O, системные/сайдкары, пики, фрагментация, GC.
Итого.
Чтобы держать 3к RPS при задержке 200ms и утилизации 60% нам потребуется 50vCPU и 80Gb памяти. При 10ms CPU time и 80Mb на запрос.
В реальности у вас будут естественно другие цифры, но порядок тот же.
PS. Есть сервисы где требуются экстремальные p99 — там утилизация вообще до 30-40% может опускаться, возможно у вас такой сервис (трейдинг, гейминг, финтех, etc), имейте это ввиду.
- 👍 10
- ❤ 3
- 🦄 1