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

Поэтому программисту полезно уметь отвечать на практические вопросы. Почему два варианта одного алгоритма отличаются по скорости в разы? Почему последовательный доступ обычно быстрее случайного? Когда HDD рациональнее SSD? Почему перемещение данных иногда обходится дороже самих вычислений? И как заранее оценить задержку, а затем проверить оценку измерениями?

Часть этих тем встретится вам на АКОС или появятся на курсах специализации «Распределённые системы». Сегодня мы соберём их в единую инженерную картину.

Зачем программисту знать железо

Разработка вычислительных систем — одна из самых сложных и наукоёмких инженерных областей. Даже обычный ноутбук или сервер объединяет результаты работы множества команд. В упрощённом виде нам понадобятся следующие компоненты:

Это не набор независимых деталей: итоговая скорость определяется их взаимодействием и узким местом конкретной нагрузки. Поэтому прежде чем обсуждать отдельные компоненты, введём две базовые характеристики производительности.

Задержка и пропускная способность

При разговоре о производительности почти всегда нужно различать две характеристики.

Задержка

Latency, или задержка, — время выполнения одной операции или прохождения одного запроса. Её измеряют, например, в наносекундах, микросекундах или миллисекундах.

Корректные вопросы:

  1. Сколько занимает обращение к данным, если они находятся в L1-кэше, оперативной памяти или на SSD?
  2. Каково время ответа сервиса на медиане, а также на p95, p99 и p99.9?