Back-of-the-Envelope Calculations (BOTECs)
Основная идея Back-of-the-Envelope Calculations (BOTECs)
Back-of-the-envelope calculations (BOTECs) — это быстрые, приблизительные и упрощенные оценки или вычисления, которые обычно выполняются на бумаге или, фигурально выражаясь, "на обратной стороне конверта". Эти расчеты не предназначены для получения точных результатов, но служат для быстрой и предварительной оценки ключевых параметров и осуществимости системы.
BOTECs в системном дизайне
Современная система представляет собой сложную сеть вычислительных ресурсов, соединенных через сеть. В системе могут быть разные типы узлов, такие как load balancers, web servers, application servers, caches, in-memory databases и storage nodes, которые совместно обслуживают клиентов. Такая система может быть спроектирована по-разному, включая monolithic architecture, modular monolith architecture или microservices architecture.
В процессе проектирования (особенно на интервью) не всегда целесообразно или возможно учитывать все детали и сложности системы. BOTECs помогают нам игнорировать эти детали и сосредоточиться на более важных аспектах, таких как оценка осуществимости сервиса с точки зрения вычислительных ресурсов.
Примеры, где часто используются BOTECs:
- Оценка количества одновременных TCP-соединений, которые может поддерживать сервер.
- Оценка количества запросов в секунду (RPS), которые могут обрабатывать web, database или cache servers.
- Оценка требований к хранилищу для сервиса.
Используя BOTECs, мы абстрагируемся от сложных деталей, таких как различия в типах серверов, задержки доступа, пропускная способность компонентов системы и различные типы запросов. Затем, абстрагируясь от этих деталей, мы учимся оценивать количество RPS, которое сервер может обработать, а также делаем примеры оценки пропускной способности, серверов и хранилища.
Типы серверов в дата-центре
Дата-центры не ограничиваются одним типом серверов. Корпоративные решения используют стандартное оборудование (commodity hardware) для снижения затрат и создания масштабируемых решений. Ниже мы обсудим типы серверов, которые часто используются в дата-центре для обработки различных типов нагрузок.
Web servers (Веб-серверы)
Для обеспечения масштабируемости веб-серверы отделены от серверов приложений (application servers). Веб-серверы являются первой точкой контакта после балансировщиков нагрузки (load balancers). В дата-центрах есть стойки, заполненные веб-серверами, которые обычно обрабатывают API-запросы от клиентов. В зависимости от предоставляемой услуги, память и хранилище на веб-серверах могут быть от небольших до средних по размеру. Однако такие серверы требуют хороших вычислительных ресурсов. Например, Facebook использовал веб-серверы с 32 ГБ оперативной памяти и 500 ГБ места для хранения.
Application servers (Серверы приложений)
Серверы приложений запускают основное программное обеспечение и бизнес-логику. Различие между веб-серверами и серверами приложений несколько размыто. Серверы приложений в основном предоставляют динамический контент, тогда как веб-серверы в основном обслуживают статический контент клиенту. Серверы приложений могут требовать значительных вычислительных и хранилищных ресурсов. Хранилище может быть как оперативным, так и постоянным. Facebook использовал серверы приложений с оперативной памятью до 256 ГБ и двумя типами хранилищ — традиционные вращающиеся диски и флеш-накопители — с ёмкостью до 6,5 ТБ.
Storage servers (Серверы хранения)
С ростом числа пользователей Интернета объем данных, хранимых крупными сервисами, многократно увеличился. Кроме того, различные типы данных теперь хранятся в различных хранилищах. Например, YouTube использует следующие хранилища данных:
- Blob storage: Используется для хранения закодированных видео.
- Temporary processing queue storage: Хранит несколько сотен часов видео, загружаемого на YouTube каждый день для обработки.
- Bigtable: Специализированное хранилище для хранения большого количества миниатюр видео.
- Relational database management system (RDBMS): Хранит метаданные пользователей и видео (комментарии, лайки, каналы пользователей и т.д.).
Другие хранилища данных, такие как Hadoop HDFS, используются для аналитики. Серверы хранения в основном включают в себя системы управления данными как структурированными (например, SQL), так и неструктурированными (NoSQL).
Возвращаясь к примеру Facebook: они использовали серверы с ёмкостью до 120 ТБ. С учётом количества используемых серверов Facebook способен хранить эксабай ты данных (один эксабайт — это (10^18) байт). При этом оперативная память этих серверов составляет всего 32 ГБ.
Важно помнить
Для того чтобы планировать и реализовывать сервисы, необходимо иметь базовые знания о том, какие нагрузки могут обрабатывать машины. Задержки (latencies) играют важную роль в определении объема нагрузки, которую может обработать машина. В таблице ниже показаны важные числа, которые системные архитекторы должны знать для оценки ресурсов.
Важные задержки (Important Latencies)
| Компонент | Время (наносекунды) | Категория |
|---|---|---|
| Ссылка на кэш L1 | 0.9 | CPU-bound |
| Ссылка на кэш L2 | 2.8 | CPU-bound |
| Ссылка на кэш L3 | 12.9 | CPU-bound |
| Ссылка на основную память | 100 | Memory-bound |
| Сжатие 1 КБ с помощью Snzip | 3,000 (3 микр осекунды) | CPU-bound |
| Чтение 1 МБ последовательно из памяти | 9,000 (9 микросекунд) | Memory-bound |
| Чтение 1 МБ последовательно из SSD | 200,000 (200 микросекунд) | IO-bound |
| Round trip в том же дата-центре | 500,000 (500 микросекунд) | IO-bound |
| Чтение 1 МБ последовательно из SSD с скоростью ~1ГБ/сек SSD | 1,000,000 (1 миллисекунда) | IO-bound |
| Поиск диска | 4,000,000 (4 миллисекунды) | IO-bound |
| Чтение 1 МБ последовательно с диска | 2,000,000 (2 миллисекунды) | IO-bound |
| Отправка пакета SF->NYC | 71,000,000 (71 миллисекунда) | IO-bound |
Важно помнить, что разница в порядке величин между различными компонентами и операциями важнее, чем запоминание точных чисел. Например, важно знать, что выполнение операций, связанных с вводом-выводом (например, чтение 1 МБ данных последовательно с SSD-диска), на два порядка медленнее, чем операции, зависящие от процессора (например, сжатие 1 КБ данных с помощью snzip). Вы можете задаться вопросом, почему в этом сравнении используются разные размеры данных!
Пока данные для сжатия доступны процессору из кэшей L1, L2 или L3, время на сжатие будет относительн о постоянным. Данные размером до L3-кэша сервера (который обычно составляет несколько мегабайт — около 45 МБ для типичного сервера, как упоминалось выше) полностью помещаются в кэш, и поэтому сжатие данных до этого предела займет почти одинаковое время. Это происходит потому, что процессор может быстро получить доступ к данным из кэша без дополнительных задержек, связанных с извлечением данных из более медленных уровней памяти или хранилища.
Помимо перечисленных выше задержек, числа пропускной способности измеряются как количество запросов в секунду (QPS), которые может обработать типичный односерверный хранилище данных.
Важные скорости (Important Rates)
| Количество запросов в секунду (QPS) | Описание |
|---|---|
| 1000 | Обрабатывает MySQL |
| 10,000 | Обрабатывает key-value store |
| 100,000–1 M | Обрабатывает cache server |
Эти числа являются приблизительными и могут значительно варьироваться в зависимости от множества факторов, таких как тип запроса, спецификация машины, дизайн базы данных, индексация, нагрузка на сервер и т.д.
Примечание: Для реальных проектов начальные этапы проектирования используют BOTECs, аналогичные тем, которые применяются на интервью по системному дизайну. По мере того как дизайн проходит итерации для создания реальных продуктов, мы можем использовать справочные числа, полученные из синтетических нагрузок, которые соответствуют нашим запросам (например, spec int для характеристики процессоров и TPC-C для измерения транзакций баз данных за единицу времени). Начальные прототипы используются для проверки предположений на уровне дизайна. Позже встроенный мониторинг ресурсов и нагрузки тщательно анализируется, чтобы выявить узкие места и планировать будущие потребности в мощностях.