Оптимизация производительности
Оптимизация производительности (англ. performance tuning) — это процесс повышения производительности системы. В компьютерных системах стимулом для таких действий обычно служит проблема производительности, которая может быть как реальной, так и предполагаемой. Большинство систем реагирует на увеличение нагрузки заметным снижением производительности. Способность системы справляться с возрастающей нагрузкой называется масштабируемостью, а модификация системы для поддержки большей нагрузки синонимична оптимизации производительности[1].
Оптимизация производительности обычно включает в себя следующие этапы:
- Оценка проблемы и определение числовых критериев приемлемого поведения.
- Измерение производительности системы до внесения изменений.
- Идентификация части системы, наиболее критичной для повышения производительности, так называемого узкого места.
- Модификация этой части системы с целью устранения узкого места.
- Измерение производительности системы после изменений.
- Если производительность улучшилась, принять изменения; если ухудшилась — вернуть в изначальное состояние.
Этот цикл является примером процесса измерения-оценки-улучшения-изучения, применяемого в обеспечении качества.
Проблемы производительности могут проявляться в виде медленной или неотзывчивой системы. Обычно это связано с высокой нагрузкой, которая приводит к достижению системой предела реакции. Такой предел называется узким местом.
Существует ряд распространённых методов повышения производительности, включая оптимизацию кода, балансировку нагрузки, кэширование, распределённые вычисления и самонастройку.
Анализ производительности
Анализ производительности (англ. performance analysis), также известный как профилирование, — это исследование поведения программы на основании данных, собранных во время её выполнения. Цель анализа — определить, какие участки программы нуждаются в оптимизации.
Профилировщик — это инструмент анализа производительности, который измеряет, как ведёт себя программа при выполнении, особенно частоту и длительность вызова функций. Инструменты анализа производительности применялись ещё с начала 1970-х годов[2]. Профилировщики классифицируются по типам результатов или по способам сбора данных.
Инженерия производительности
Инженерия производительности (англ. performance engineering) — область, включающая роли, навыки, действия, практики, инструменты и продукты, необходимые для удовлетворения неконфункциональных требований проектируемой системы, таких как увеличение дохода, снижение отказов системы, предотвращение задержек проектов и избыточного расхода ресурсов.
Наиболее часто встречающиеся этапы в различных методологиях:
- Идентификация критически важных бизнес-процессов.
- Детализация процессов в вариантах использования и оценка объёмов данных.
- Построение системы, включая оптимизацию производительности.
- Внедрение построенной системы.
- Сопровождение и обслуживание после внедрения системы.
Оптимизация кода
Некоторые оптимизации включают перестановку вычислений за пределы цикла (то есть выполнение работы вне цикла, а не внутри него) или замену простых алгоритмов сортировки, например сортировка выбором, на более эффективные, такие как быстрая сортировка[3].
Оптимизация конфигурации
Современные программные решения, например системы Big Data, состоят из множества фреймворков (например, Apache Storm, Spark, Hadoop). Каждый из них содержит сотни конфигурационных параметров, значительно влияющих на производительность приложений. Оптимизация (тюнинг) может заключаться в подборе наилучшей конфигурации для конкретного приложения.
Кэширование
Кэширование — базовый способ устранения узких мест, возникающих из-за медленного доступа к данным. Кэширование повышает производительность за счёт хранения часто используемой информации в быстрой памяти, уменьшая время доступа и избегая повторных вычислений. Этот метод эффективно работает в условиях применимости принципа локальности. Совокупность методов выбора данных для хранения в более быстром хранилище называется стратегией кэширования. Примеры: кеш ASP.NET, кеш процессора и другие.
Балансировка нагрузки
Система может состоять из независимых компонентов, каждый из которых способен обслуживать запросы. Если все запросы поступают к одной или нескольким частям системы, в то время как остальные простаивают, теряется драгоценное время. Равномерное распределение запросов между компонентами называется балансировкой нагрузки и позволяет повысить общую производительность.
Балансировка нагрузки часто используется для того, чтобы дополнительно повысить производительность распределённых систем за счёт интеллектуального выбора машины для выполнения операции в зависимости от текущей загрузки и типа задачи.
Распределённые вычисления
Распределённые вычисления используются для увеличения потенциала параллельного выполнения на современных архитектурах ЦП. Использование распределённых систем необходимо для получения эффективности от параллелизма. Высокопроизводительные кластерные вычисления — один из известных способов применения распределённых систем для повышения производительности.
Однако распределённые вычисления и кластеризация могут увеличивать задержки и способствуют повышенной нагрузке на общий ресурс, например, базы данных. Чтобы уменьшить задержки и избежать узких мест, распределённые системы часто используют распределённые кэши.
Самонастройка
Самонастраивающаяся система (англ. self-tuning system) способна самостоятельно подбирать внутренние рабочие параметры для максимизации или минимизации достижимости некоторой целевой функции, например, повышение эффективности или минимизация ошибки. Такие системы, как правило, проявляют себя как нелинейные адаптивные управляющие структуры. В аэрокосмической отрасли самонастраивающиеся системы применяются десятилетиями, поскольку такого типа обратная связь необходима для оптимального многопараметрического управления нелинейными процессами.
Узкие места
Узким местом называют ту часть системы, которая работает на пределе своей производительности. Остальные части системы могут простаивать, ожидая завершения работы узкого места.
В поиске и устранении узких мест важно документально подтвердить их наличие (обычно с помощью измерений) до того, как предпринимать действия по их устранению. Часто существует соблазн угадывать узкое место — такие догадки нередко оказываются ошибочными.
Примечания
Литература
- Donald E. Knuth. An Empirical Study of FORTRAN Programs // Software: Practice and Experience. 1971. Vol. 1, no. 2. pp. 105–133. doi:10.1002/spe.4380010202.