Энергосбережение Ubuntu на ноутбуке

/www/pages/modesco/ubuntovod

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

О том, как заставит ноутбук работать под линуксами как можно дольше, написано немало, в том числе и на хабре. В какой-то степени я еще раз соберу все советы воедино, от очевидных до обскурных, заодно опишу несколько проблем и решений, которые у меня оказались достаточно «индивидуальными».

Устанавливал я Ubuntu 10.10 на ноутбук Acer Aspire Timeline 5810TG. Эта машина обладает экраном в почти 16 дюймов и относительно производительным железом, зато батарея достаточно емкая, чтобы ставить с ней личные рекорды.

Содержание поста

  1. Отключаем дискретную видеокарту
  2. Полезные команды для энергосбережения
  3. Проблемы ноутбука (связанные с энергосбережением) и их решения
  4. Автоматизация
  5. Дополнительные советы

Отключаем дискретную видеокарту

В моем ноутбуке имеется возможность переключаться между встроенным графическим чипом от Intel, маломощным и малотребовательным к электроэнергии, и сравнительно сильной и энергоемкой карте ATI Radeon HD4330. Многие обладатели ноутбуков с переключаемой графикой испытывают проблемы в работе с Linux-системами. Поиск по «ubuntu switchable graphics» на убунтуформус выдает больше 50 страниц тем.
Мне производительная графическая карта нужна редко, поэтому я задался целью отключить ее по умолчанию с возможностью быстрого и безболезненного включения.
Очень много читал те самые 50 страниц форумных тем. А надо было всего лишь заглянуть в убунту-вики или даже попробовать воспользоваться хабрапоиском.

В версиях ядра, начиная с 2.6.34, присутствует механизм vga_switcheroo, позволяющий переключаться между видеокартами. То есть в Ubuntu 10.10 он есть по умолчанию. О том, как им пользоваться, хорошо было написано здесь (см. второй способ) почти год назад, я по-быстрому напомню, что к чему.

Вначале выполним:

lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07)
01:00.0 VGA compatible controller: ATI Technologies Inc M92 LP [Mobility Radeon HD 4300 Series] (rev ff)

Зная, какой GPU как обозначается, посмотрим, какой из них в каком состоянии:

cat /sys/kernel/debug/vgaswitcheroo/switch
0: :Pwr:0000:01:00.0
1:+:Pwr:0000:00:02.0

Плюсик стоит на против видеочипа, который используется в данный момент, Pwr означает, что видеокарта включена и потребляет энергию.
Важно: у всех моих немногих знакомых, обладающих ноутбуками с двумя видеокартами, картина одинаковая: что бы вы не делали, при загрузке системы обе карты работают, при этом для вывода используется встроенная «слабая» графика. Это нам на руку, ибо обесточивание неактивной видеокарт происходит бескровно.

Команда

echo OFF > /sys/kernel/debug/vgaswitcheroo/switch

отключает неиспользуемую GPU сразу же. Поэтому мы обратимся к файлу /etc/rc.local, добавив в него вышеуказанную команду (перед строчкой exit 0). Так, при загрузке систему дискретная видеокарта уже будет отключена и мне не нужно будет беспокоиться ни о чем.

1
2
0: :Off:0000:01:00.0
1:+:Pwr:0000:00:02.0

Важно: насколько я могу судить, vga_switcheroo не работает, если установлены проприетарные драйверы на дискретную видеокарту.

Кстати, если вы хотите переключаться между видеокартами через графический интерфейс, установите Ubuntu Control Center. Программа представляет собой панель управления параметрами Ubuntu, но нас она интересует исключительно из-за опции переключения между GPU (естественно, здесь это тоже происходит средствами vga_switcheroo).

Будьте аккуратны с UCC: во-первых, работает кривовато, например, мне необходимо было вначале переключиться на дискретную видеокарту, а лишь затем на встроенную, чтобы обесточить дискретную (либо вначале выполнить echo OFF > /sys/kernel/debug/vgaswitcheroo/switch, а затем переключаться на встроенную GPU). Но работает. Во-вторых, переключение происходит сразу, то есть без спросу выполняется завершение сеанса и приходится вновь залогиниваться.

Полезные советы по энергосбережению

Собирались эти советы с lesswatts, ubuntuforums, учитывались хинты от powertop, кое-что было найдено случайно.

1) Если у вас стоит убунту на ноутбуке, стопроцентно у вас установлен пакет laptop_mode, оптимизирующий работу компьютера в зависимости от источника питания. Значение 0, посылаемое в /proc/sys/vm/laptop_mode, отключает режим энергосбережения, 5 устанавливает самый агрессивный. Подробнее о том, как именно laptop_mode сберегает энергию, можно прочесть где угодно.

echo 0 > /proc/sys/vm/laptop_mode #выключает laptop_mode
echo 5 > /proc/sys/vm/laptop_mode #активирует laptop_mode

2) Режим энергосбережение для SATA-устройств.

echo min_power > /sys/class/scsi_host/host0/link_power_management_policy
echo min_power > /sys/class/scsi_host/host1/link_power_management_policy
echo min_power > /sys/class/scsi_host/host2/link_power_management_policy
echo min_power > /sys/class/scsi_host/host3/link_power_management_policy
echo min_power > /sys/class/scsi_host/host4/link_power_management_policy
echo min_power > /sys/class/scsi_host/host5/link_power_management_policy

Не знаю, почему у меня в /sys/class/scsi_host/ целых шесть устройств. 🙂 Для включения максимального быстродействия выполнить команды с max_performance вместо min_power.

3) По умолчанию в Ubuntu есть четыре профиля работы процессора:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
conservative ondemand userspace powersave performance

conservative: медленно повышает частоту процессора в зависимости от нагрузки на систему и резко сбрасывает частоту к минимальной при простое.
ondemand: быстро повышает частоту процессора при возрастании нагрузки и медленно сбрасывает частоту к минимуму при простое.
powersave и performance, очевидно, соответствуют минимальной и максимальной частотам CPU.

#для производительности; выполнять сие для каждого ядра (у меня их два)
echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo ondemand > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
#для энергосбережения
echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo powersave > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor

Многие независимые пользователи крайне не советуют использовать режим performance, поэтому даже для работы от сети, когда экономить на ваттах нет смысла, я использую режим ondemand.

4) Параметр `sched_mc_power_savings` из /sys/devices/system/cpu/ позволяет использовать энергосберегающий режим работы процессора в случае, если у того более одного ядра, благодаря особому распределению нагрузки между ядрами.

echo 1 > /sys/devices/system/cpu/sched_mc_power_savings #включаем энергосбережение
echo 0 > /sys/devices/system/cpu/sched_mc_power_savings #выкл

5) Встроенные аудио-чипы от Intel (которые принадлежат к т. н. High Definition Audio — HDA) также имеют возможность экономии ватт, если звуковой чип не используется

echo 0 > /sys/module/snd_hda_intel/parameters/power_save #выключаем энергосбережение
echo 10 > /sys/module/snd_hda_intel/parameters/power_save #вкл

6) Для того, что выиграть еще чуть-чуть времени работы батареи, можно запретить системе время от времени «опрашивать» cd/dvd-привод на предмет наличия там диска.

hal-disable-polling --device /dev/cdrom #запрещаем
hal-disable-polling --enable-polling --device /dev/cdrom #делаем как было

7) Можно выключить к черту веб-камеру вместе с драйвером. Не проверял отдельно, но сообщают, что дело очень хорошее при работе от батареи.

modprobe -r uvcvideo #выключаю
modprobe uvcvideo #включаю обратно

Естественно, пропустите этот шаг, если вам придется использовать скайп или еще для чего-то понадобится камера.

8 ) Dirty ratio — максимальный размер памяти (в процентах), для хранения грязных данных прежде чем процесс, их сгенерировавший, будет принужден записать их. Чем выше значение, очевидно, тем реже производится запись и тем меньше активность жесткого диска и системы.

echo 10 > /proc/sys/vm/dirty_ratio
echo 90 > /proc/sys/vm/dirty_ratioe #при работе от батареи

9) Dirty background ratio — минимальное число памяти (в процентах), где позволено хранить гразные данные вместо записи на диск. Этот параметр должен быть намного меньше чем dirty_ratio что бы позволить записывать куски грязных данных за один проход.

echo 5 > /proc/sys/vm/dirty_background_ratio #в нормальном режиме
echo 1 > /proc/sys/vm/dirty_background_ratio #в режиме энергосбережения

10) Dirty Writeback sentisecs — как часто ядро должно проверять есть ли «грязные» (измененные) данные для записи на диск (в сантисекундах). Чем выше значение, очевидно, тем реже используется диск для записи грязных данных.

echo 6000 > /proc/sys/vm/dirty_writeback_centisecs
echo 60000 > /proc/sys/vm/dirty_writeback_centisecs #для энергосбережения

11) Включение режима энергосбережения PCI Express, как говорят люди, позволяет экономить достаточно много энергии батареи.

echo default > /sys/module/pcie_aspm/parameters/policy
echo powersave > /sys/module/pcie_aspm/parameters/policy

Некоторые проблемы ноутбука (связанные с энергосбережением) и их решения

Проблема 1. Не работает изменение яркости экрана. Яркость всегда стоит на максимуме. Это критичный момент для энергосбережения, так как яркая подсветка дисплея съедает уйму электроэнергии. Эта проблема наблюдается на многих ноутбуках, на Acer`ах особенно часто.
Симптом: изменение яркости с помощью gnome-апплета не дает эффекта, сколько ползунок не таскай, переключение клавишами FN+Right, FN+Left, или аналогичными Fn-комбинациями вешает систему, помогает лишь хард-ресет.
Решение оказалось не самым практичным, но достаточно простым:

sudo setpci -s 00:02.0 F4.B=XX

Здесь ХХ принимает значения от 00 до FF в шестнадцатеричной системе. Для работы от батареи я выбрал значение 40, для работы от сети — FF.

Проблема 2. Bluetooth-радио включалось каждый раз при загрузки системы, несмотря на то, что bluetooth-модуль был выключен вручную и убран из автозагрузки. Еще одно решение, которое кому-то покажется очень некрасивым: добавить в /etc/rc.local следующую строку:

1
rfkill block bluetooth

Автоматизация

Конечно, каждый раз вбивать команды в терминал — дело унылое. Даже каждый раз запускать вручную bash-скрипт тоже быстро надоест. Однако переход в режим энергосбережения в рамках описанных методов можно автоматизировать очень легко: всего лишь добавляем код ниже в /etc/acpi/power.sh:

sudo gedit /etc/acpi/power.sh

Код будет иметь следующий вид:

1
2
3
4
5
if on_ac_power; then
<список команд>
else
<список команд>
fi

Добавлять его можно прямо после строки #!/bin/sh.

Путем экспериментов я, в восторге, выяснил, что этот скрипт запускается каждый раз при старте системы. Кроме того, посмотрев содержимое файлов ac и battery в /etc/acpi/events/, я увидел, что скрипт по идее должен вызываться при подключении ноутбука к электросети и отключении от оной. Это логично, но почему-то не работало. Решение пришло быстро, надо было лишь дать необходимые права скрипту power.sh:

sudo chmod +x /etc/acpi/power.sh

Теперь все стало автоматизировано настолько, насколько это возможно.

Вот как выглядит мой скрипт для энергосбережения:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
if on_ac_power; then
echo 0 > /proc/sys/vm/laptop_mode
echo 10 > /proc/sys/vm/dirty_ratio
echo 5 > /proc/sys/vm/dirty_background_ratio
echo 6000 > /proc/sys/vm/dirty_writeback_centisecs
echo 0 > /sys/module/snd_hda_intel/parameters/power_save
echo max_performance > /sys/class/scsi_host/host0/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host1/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host2/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host3/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host4/link_power_management_policy
echo max_performance > /sys/class/scsi_host/host5/link_power_management_policy
echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
modprobe uvcvideo
echo default > /sys/module/pcie_aspm/parameters/policy
setpci -s 00:02.0 F4.B=FF
hal-disable-polling --enable-polling --device /dev/cdrom
echo 0 > /sys/devices/system/cpu/sched_mc_power_savings
else
echo 5 > /proc/sys/vm/laptop_mode
echo 90 > /proc/sys/vm/dirty_ratio
echo 1 > /proc/sys/vm/dirty_background_ratio
echo 60000 > /proc/sys/vm/dirty_writeback_centisecs
echo 10 > /sys/module/snd_hda_intel/parameters/power_save
echo min_power > /sys/class/scsi_host/host0/link_power_management_policy
echo min_power > /sys/class/scsi_host/host1/link_power_management_policy
echo min_power > /sys/class/scsi_host/host2/link_power_management_policy
echo min_power > /sys/class/scsi_host/host3/link_power_management_policy
echo min_power > /sys/class/scsi_host/host4/link_power_management_policy
echo min_power > /sys/class/scsi_host/host5/link_power_management_policy
echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo ondemand > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
modprobe -r uvcvideo
echo powersave > /sys/module/pcie_aspm/parameters/policy
setpci -s 00:02.0 F4.B=40
hal-disable-polling --device /dev/cdrom
echo 1 > /sys/devices/system/cpu/sched_mc_power_savings
fi

Итак, чего удалось достичь? Ниже несколько скриншотов.

Ubuntu на ноутбуке

Работает Wi-Fi, Google Chrome с пачкой вкладок, включен обычный режим веб-серфинга

Ubuntu на ноутбуке

То же самое, плюс qutIM, Transmission, играет музыку Exaile, открыт лист OpenOffice.org Calc

Видео в полноэкранном режиме по неизвестной причине ест очень мало ресурсов. Оставив работать лишь qutIM (и Wi-Fi соединение, конечно), смотреть кино (обычный SD, Xvid) можно чуть ли не девять часов!
Результаты не подтасованые и не сиюминутные. Все взаправду. Перед снятием скриншотов я работал с ноутбуком в своем обычном режиме около 10 минут. Если оставить заряженный полностью ноут и ничего с ним не делать в течение пары минут, то можно увидеть цифры типа 13 часов. Но нам интересен лишь результат в повседневных условиях, не так ли?

Дополнительные советы

Как еще можно улучшить ситуацию? Да много как, наверное. Из того, что я знаю, но не применял:

1) Многие на форумах советуют команду

hdparm -B 1 -S 12 /dev/sda

Единичка здесь означает самый «агрессивный» режим сбережения энергии жесткого диска. Лично я не смог вытерпеть, что диск замедляется уже через пару секунд после ничего-не-деланья, а разогнаться вновь ему приходится потратить мгновение, что создает эффект лага. Часто паркуется головка хдд. Не очень приятно, к тому же смею предположить, что это еще и изнашивает винт быстрее обычного. 255 вместо 1 отключает энергосбережение жесткого диска вообще. Можете поэкспериментировать с этим у себя, я не против. 🙂 Кстати, ковыряние /lib/hdparm/hdparm-functions позволяет найти вот такой кусок кода:

1
2
3
4
5
if hdparm_is_on_battery; then
hdparm_set_option -B128
else
hdparm_set_option -B254
fi

Он как бы намекает, что при переключении питания на батарею параметр выставляется 128. Я оставил так, как есть, но данные параметры можно безболезненно редактировать. Думаю, установкой единицы мог бы выиграть еще несколько десятков минут работы. Но комфорт работы важнее. Да, кстати, тут между прочим хочу заметить, что описанные до этого вещи никакого хоть слегка ощутимого дискомфорта в работу с ноутбуком не вносят.

2) Powertop, за неимением других подсказок, все время предлагает для уменьшения энергопотребления отключить USB-порты для устройств, не являющихся носителями информации. Можете использовать это для еще большей экономии энергии, но лично я без юсб-мыши пользоваться ноутбуком ну вообще не могу. Терпеть не могу тачпады.

3) Можно применить опцию noatime к файловой системе. Означает, что не будет вестись лог последнего времени доступа к файлу. Это уменьшит активность системы и жесткого диска. По умолчанию в Ubuntu 10.10, насколько я понял из мануалов, стоит режим relatime, который, если не ошибаюсь, обновляет время доступа лишь в случае внесения изменений в файл. Подробнее об этом, например, тут.

Заключение

Можно ли достичь того же потрясающего времени работы в Windows? Можно, если и не такого же, то близкого. В Win7 это делается установкой двух пакетов драйверов и двух-трех программ (которые даже без GUI, просто работают в фоне) от Acer, естественно, аналогов для линукса нет.
Так что в этом вопросе можно дополнительно порадоваться за убунту: все делается средствами системы (ядра), и при наличии, например, этого поста, все оуществляется за пару минут и пяток копипаст.

P.S. Прошу прощение за дилетантство, если таковое замечено. Мы совсем недавно встречаемся с Ubuntu.

Источник: habrahabr.ru.

Купили себе новый телефон? Вам сюда: программы для телефона бесплатно. Прокачайте свой телефон на максимум с помощью различных интересных программ.

SAN
2011-04-29 06:25:00
Спасибо!
AndyHomeS
2011-05-12 21:57:00
Финальный скрипт содержит ошибки. См. управление частотой процессоров, например.
Sergey
2012-06-07 18:12:00
Финальный скрипт вообще для маскимальной производительсности, косяк!
Sergey
2012-06-07 18:18:00
Прошу прощения, не разобрался, всё в порядке с финальным скриптом :(
rino
2012-06-25 02:35:00
при попытке изменить /proc/sys/vm/dirty_background_ratio пишет bash: /proc/sys/vm/laptop_mode: Отказано в доступе пробовал через sudo
Lepino
2013-11-17 16:10:00
У меня к сожалению лучше не стало(Ноутбуку год, на вин7 батареи хватает на 3 часа при активной работе, на ubuntu 12.10 при такой же активной работе хватает на 50мин - 1 час