Как определить временные зависания, связанные с производительностью

Емкость – это общий объем ресурса (ЦП, графического процессора и т. д.), которым устройство располагает в течение определенного времени. На этой странице рассказывается, как выявлять и устранять проблемы с производительностью, связанные с нехваткой ресурсов.

Губернатор медлит с реакцией

Чтобы избежать временного зависания, регулятор частоты ЦП должен иметь возможность быстро реагировать на пакетные рабочие нагрузки. Большинство приложений с интерфейсом следуют одному и тому же базовому шаблону:

  1. Пользователь читает текст на экране.
  2. Пользователь касается экрана: нажимает кнопку, прокручивает страницу и т. д.
  3. Экран прокручивается, меняется активность или выполняется анимация в ответ на ввод.
  4. Система переходит в режим ожидания при показе нового контента.
  5. Пользователь возвращается к чтению экрана.

На устройствах Pixel и Nexus реализована функция Touch Boost, которая изменяет поведение регулятора частоты процессора (и планировщика) при касании. Чтобы избежать медленного перехода к высокой тактовой частоте (из-за чего устройство может пропускать кадры при касании), функция повышения производительности при касании обычно устанавливает минимальную частоту ЦП, чтобы при касании было достаточно ресурсов ЦП. После прикосновения пол существует ещё некоторое время (обычно около двух секунд).

Pixel также использует группу schedtune, предоставленную Energy Aware Scheduling (EAS), в качестве дополнительного сигнала для повышения чувствительности сенсорного экрана. Популярные приложения получают дополнительный вес через schedtune, чтобы обеспечить им достаточную вычислительную мощность для быстрой работы. У Nexus 5X и 6P разница в производительности между кластерами ЦП (A53 и A57 соответственно) намного больше, чем у Pixel с ЦП Kryo. Мы обнаружили, что малого кластера ЦП не всегда достаточно для плавного отображения интерфейса, особенно с учетом других источников дрожания на устройстве.

Поэтому на устройствах Nexus 5X и 6P функция Touch Boost изменяет поведение планировщика, чтобы активные приложения с большей вероятностью переходили на большие ядра (это концептуально похоже на минимальную частоту ЦП). Без изменения планировщика, которое повышает вероятность переноса активных приложений в большой кластер ЦП, активным приложениям может не хватать мощности ЦП для отрисовки, пока планировщик не решит сбалансировать нагрузку на большое ядро ЦП. Изменяя поведение планировщика во время ускорения при касании, мы повышаем вероятность того, что поток UI будет немедленно запущен на большом ядре и избежит временного зависания, но при этом не заставляем его всегда работать на большом ядре, что могло бы сильно повлиять на энергопотребление.

Ограничение производительности из-за перегрева

Терморегулирование происходит, когда устройство должно снизить общую теплоотдачу, обычно за счет уменьшения тактовой частоты ЦП, графического процессора и DRAM. Неудивительно, что это часто приводит к задержкам, поскольку система больше не может обеспечить достаточную производительность для рендеринга в течение заданного интервала времени. Единственный способ избежать троттлинга – использовать меньше энергии. Существует не так много способов сделать это, но, исходя из нашего опыта работы с SOC, мы можем дать несколько рекомендаций поставщикам систем.

Во-первых, при создании новой системы на кристалле с гетерогенной архитектурой ЦП убедитесь, что кривые производительности/Вт кластеров ЦП пересекаются. Общая кривая производительности/Вт для всего процессора должна быть непрерывной. Разрывы на кривой производительности/мощности заставляют планировщик и регулятор частоты угадывать, что нужно рабочей нагрузке. Чтобы предотвратить задержки, планировщик и регулятор частоты ошибаются в сторону предоставления рабочей нагрузке большей мощности, чем ей требуется. Это приводит к слишком большому расходу энергии, что способствует тепловому троттлингу.

Представьте гипотетическую систему на кристалле с двумя кластерами ЦП:

  • Кластер 1, маленький кластер, может потреблять от 100 до 300 мВт и набирает от 100 до 300 баллов в тесте пропускной способности в зависимости от тактовой частоты.
  • Кластер 2, большой кластер, может потреблять от 1000 до 1600 мВт и набирает от 800 до 1200 баллов в том же тесте пропускной способности в зависимости от тактовой частоты.

В этом тесте более высокий результат означает более высокую скорость. Хотя это и не более желательно, чем медленнее, быстрее == большее энергопотребление.

Если планировщик считает, что для рабочей нагрузки интерфейса требуется эквивалент оценки 310 в этом тесте пропускной способности, то, чтобы избежать задержек, лучше всего запустить большой кластер на самой низкой частоте, потратив значительную мощность. (Это зависит от поведения cpuidle и гонки за бездействие; SOC с непрерывными кривыми производительности/Вт проще оптимизировать.)

Во-вторых, используйте cpusets. Убедитесь, что вы включили cpusets в ядре и в BoardConfig.mk. Вам также необходимо настроить фактические назначения cpuset в файле init.rc, относящемся к вашему устройству. Некоторые поставщики оставляют этот параметр отключенным в своих пакетах поддержки оборудования, надеясь использовать другие подсказки, чтобы влиять на поведение планировщика. Мы считаем, что это не имеет смысла. Наборы CPU полезны для обеспечения балансировки нагрузки между процессорами таким образом, чтобы отражать то, что пользователь на самом деле делает на устройстве.

ActivityManager назначает приложениям разные наборы CPU в зависимости от их относительной важности (верхний уровень, активный режим, фоновый режим). Более важные приложения получают больше доступа к ядрам процессора. Это помогает обеспечить качество обслуживания приложений, работающих на переднем плане и вверху списка.

Наборы cpusets полезны для однородных конфигураций ЦП, но вы не должны поставлять устройство с неоднородной конфигурацией ЦП без включенных наборов cpusets. Nexus 6P – хороший пример того, как использовать cpusets в конфигурациях с разнородными процессорами. Используйте его в качестве основы для конфигурации своего устройства.

Кроме того, cpusets позволяют экономить энергию, поскольку фоновые потоки, не влияющие на производительность, не распределяются по большим ядрам процессора, где они могут потреблять значительно больше энергии без какой-либо пользы для пользователя. Это также поможет избежать троттлинга. Хотя троттлинг – это проблема производительности, улучшение показателя джиттера оказывает значительное влияние на производительность интерфейса при троттлинге. Поскольку система будет работать ближе к своей способности рендерить 60 кадров в секунду, для выпадения кадра потребуется меньше джиттера.