Частота процессора в Linux, tickless kernel, Powertop

Алаверды О сохранении энергии, батареях и процессорах. Модуль ядра Linux cpufreq отвечает за изменение частоты и напряжения процессоров. Не все процессоры это умеют делать, но большинство мобильных процессоров для ноутбуков а также VIA С3 и С7 определяются при загрузке ядра и cpufreq подгружается сам. После загрузки модуля в каталоге /sys/devices/system/cpu/cpu0/ появляются файлы, читая из которых можно просматривать информацию о работе модуля. В некоторые файлы можно писать, тем самым управляя частотой и другими параметрами. Например cat /sys/devices/system/cpu/cpu0/scaling_available_governors выведет доступные режимы автоматического управления частотой. У меня обычно стоит ondemand, что для моего ноута означает работу на 600MHz в обычном режиме с временным повышением частоты до 1600MHz при повышении нагрузки на процессор. Чтобы не делать echo в эти файлы в консоли есть масса разных GUI для управления процессором. Я сейчас пользуюсь KPowersave, хотя он и показывает, что у меня две батарейки вместо одной :)

Кроме частоты процессора, на его энергопотребление влияет насколько часто прерывания выводят камень из спящего режима. Это зависит от того, какие программы и драйвера оборудования запущены. Начиная с версии 2.6.21 ядро Linux уже не тикает 1000 раз в секунду. Ядро реже будит процессор -- процессор чаще отправляется в Idle-режим. Это называется tickless kernel. Поиграться с ним можно используя программу Powertop из одноименного пакета Debian. Делаем aptitude install powertop и потом запускаем powertop под рутом. Спустя 5 секунд видим потребляемую по данным ACPI мощность, статистику по нахождению процессора в различных спящих режимах, количество пробуждений в секунду и рабочих частотах а также программы, виновные в пробуждении процессора. У меня будится 120-150 раз в секунду, если ничего не делать. Вот некоторые цифры с моего ноутбука, во всех случаях гувернёр решил работать на 600MHz, подсчитано очень приблизительно:

Что делаем Wakeup-from-idle процессора в секунду Потребляемая мощность согласно ACPI, Ватт Часов батареи осталось согласно powertop Время нахождения процессора в режиме сна (С2), проценты Время нахождения процессора в режиме работы (С0), проценты
Ничего 135 16.3 1,5 99 1
Xine на паузе 415 16,5 1,4 98 2
Xine на паузе, KTorrent бешено качает и сидирует 800 17,5 1,3 70 30
Xine на паузе, KTorrent бешено качает и сидирует, AC97 и Wi-Fi в режиме энергосбережения 660 16,6 1,4 70 30
Xine показывает DVD, KTorrent бешено качает и сидирует, AC97 и Wi-Fi в режиме энергосбережения 830 19,6 1,2 55 45

Еще такие интересные цифры:

Что делаем Wakeup-from-idle процессора в секунду
Xine на паузе 415
VLC на паузе 550
Xine играет DVD 950
VLC играет DVD 450

Несмотря на разницу в цифрах, разницы в нагрузке на процессор и потребляемой мощности не видно.

Выводы. Заметной экономии от перехода на tickless kernel я не обнаружил, примерно те же 16 Ватт если ничего не делать. От того, насколько часто программа будит процессор, потребляемая мощность не зависит, зависит от того, что программа делает. Самое ценное в powertop -- советы о том, что можно сделать, чтобы уменьшить энергопотребление применительно к конкретной конфигурации. Программа выдает готовые команды с коротким описанием. Например, как перевести AC97 в энергосберегающий режим, включить энергосбережение Wi-Fi, выключить опрос cdrom с помощью HAL. Выполнение первых двух рекомендаций экономит мне примерно 1 Ватт, что уже ощутимо. Надо бы вписать в скрипты laptop-mode. Авторы powertop в будущем обещают расширить анализ возможностей отключения внепроцессорных компонентов системы.

Еще powertop показывает какие-то режимы глубокой спячки C3 и летаргического сна С4, куда мой процессор никогда не попадает. Интересно что это. Есть идеи?

Блог: RU Linux

Переход с Gnome на XFCE экономит 10 минут батареи ноутбука.