Какие порядки задержек нужно знать разработчику?
- Насколько память быстрее диска?
- Сколько стоит запрос в другой дата-центр?
- Latency numbers every programmer should know
Наносекунды — процессор и кэши, ~100 нс — оперативная память, десятки–сотни микросекунд — SSD и сеть внутри дата-центра, миллисекунды — диск HDD и другой город, ~100 мс — другой континент.
- Каждый уровень дальше от процессора — в 10–1000 раз медленнее
- Последовательный доступ намного быстрее случайного — и к памяти, и к диску
- Сетевой вызов внутри ДЦ ≈ 0,5 мс — в тысячи раз дороже обращения к памяти
А ещё Отсюда кэши, пакетная обработка и «не ходить в сеть в цикле»
Подробно
Абсолютные цифры меняются с железом, порядки — нет. Приблизительно:
| Операция | Время |
|---|---|
| обращение к кэшу L1 | ~1 нс |
| неудачное предсказание перехода | ~3 нс |
| кэш L2 | ~4 нс |
| захват свободного мьютекса | ~20 нс |
| оперативная память | ~100 нс |
| сжатие 1 КБ быстрым алгоритмом | ~2 мкс |
| случайное чтение 4 КБ с NVMe SSD | ~20–100 мкс |
| последовательное чтение 1 МБ из памяти | ~10 мкс |
| последовательное чтение 1 МБ с SSD | ~0,3 мс |
| оборот по сети внутри дата-центра | ~0,2–0,5 мс |
| поиск на HDD | ~5–10 мс |
| Москва — Санкт-Петербург и обратно | ~10 мс |
| Москва — Франкфурт и обратно | ~40 мс |
| через океан и обратно | ~100–150 мс |
Как применять:
- кэш в памяти против базы — обращение к памяти ~100 нс, к базе по сети с запросом — миллисекунда: разница в 10 000 раз;
- запросы в цикле — 1000 последовательных вызовов по 1 мс — секунда; одним пакетным запросом — несколько миллисекунд. Это проблема N+1;
- последовательный доступ — и память (кэш-линии, предвыборка), и диски (особенно HDD) быстрее читают подряд. Поэтому журналы, Kafka и LSM-деревья пишут последовательно;
- география — скорость света в оптоволокне ~200 000 км/с: из Москвы во Владивосток и обратно физически не быстрее ~65 мс. Синхронная репликация между континентами прибавляет это к каждой записи;
- оценки на собеседовании — «сервис делает 5 последовательных походов в другие сервисы и 3 запроса в базу» — уже 5–10 мс без всякой работы.
Пропускная способность — отдельная ось: память — десятки ГБ/с, NVMe — единицы ГБ/с, сеть 10–100 Гбит/с. Задержка говорит, сколько ждать один запрос, пропускная способность — сколько данных пройдёт за секунду.
Пример
Страница делает 30 запросов к базе последовательно, по 0,8 мс: 24 мс
То же одним запросом с IN (...): 1,5 мс
Тот же ответ из локального кэша в памяти: < 0,01 мсЧто хотят услышать
- Порядки величин по уровням: кэш, память, SSD, сеть ДЦ, межгород, континент.
- Последовательный доступ против случайного.
- Выводы: кэши, пакетирование, меньше сетевых обходов.
- Разница задержки и пропускной способности.
Частые ошибки
- Заучивать точные цифры, не понимая отношений между уровнями.
- Считать SSD «почти как память».
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Наносекунды — диск, микросекунды — оперативная память, миллисекунды — кэш процессора; сеть внутри ДЦ быстрее, чем чтение из памяти
- ✗Случайный доступ к диску быстрее последовательного
- ✓Наносекунды — кэши, ~100 нс — оперативная память, сотни микросекунд — сеть в ДЦ, ~100 мс — другой континент
- ✗SSD быстрее оперативной памяти
Что спросят дальше
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.