О том, как я заставлял Ubuntu работать 10 часов от батареи

:

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

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

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

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

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

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

В моем ноутбуке имеется возможность переключаться между встроенным графическим чипом от 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). Так, при загрузке систему дискретная видеокарта уже будет отключена и мне не нужно будет беспокоиться ни о чем.
0: :Off:0000:01:00.0
1:+:Pwr:0000:00:02.0
Важно: насколько я могу судить, vga_switcheroo не работает, если установлены проприетарные драйверы на дискретную видеокарту.

Кстати, если вы хотите переключаться между видеокартами через графический интерфейс, установите Ubuntu Control Center. Программа представляет собой панель управления параметрами Ubuntu, но нас она интересует исключительно из-за опции переключения между GPU (естественно, здесь это тоже происходит средствами vga_switcheroo).
image
Будьте аккуратны с UCC: во-первых, работает кривовато, например, мне необходимо было вначале переключиться на дискретную видеокарту, а лишь затем на встроенную, чтобы обесточить дискретную (либо вначале выполнить echo OFF > /sys/kernel/debug/vgaswitcheroo/switch, а затем переключаться на встроенную GPU). Но работает. Во-вторых, переключение происходит сразу, то есть без спросу выполняется завершение сеанса и приходится вновь залогиниваться.
Больше о переключаемой графике можно почитать в хабрапосте, на который я дал ссылку выше, а также в Убунту-вики и в этом блоге. Я к этому вопросу возвращаться не буду.

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

Собирались эти советы с 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

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


Проблема 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 строку rfkill block bluetooth.

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

Конечно, каждый раз вбивать команды в терминал — дело унылое. Даже каждый раз запускать вручную bash-скрипт тоже быстро надоест. Однако переход в режим энергосбережения в рамках описанных методов можно автоматизировать очень легко: всего лишь добавляем код в /etc/acpi/power.sh
<source lang=«bash»$sudo gedit /etc/acpi/power.sh
Код будет иметь вид
if on_ac_power; then
<список команд>
else
<список команд>
fi

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

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

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

Теперь все стало автоматизировано настолько, насколько это возможно.
Вот как выглядит мой скрипт для энергосбережения
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

Итак, чего удалось достичь? Вот несколько скриншотов.
Работает вай-фай, Google Chrome с пачкой вкладок, у обладателя ноутбука (меня) включен обычный режим веб-серфинга:
image

Те же вай-фай и хром, плюс qutIM, Transmission, играет музыку Exaile, открыт лист OpenOffice.org Calc с чем-то финансово-математическим. В общем, мой стандартный набор:
image

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

Overview.

Краткое руководство к действию: берем скрипт, указанный выше, добавляем его в /etc/acpi/power.sh, делаем power.sh исполняемым, затем добавляем команды выключения bluetooth и дискретной видеокарты в /etc/rc.local.
Вот и все, что я сделал. результаты вы видели выше.

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

Как еще можно улучшить ситуацию? Да много как, наверное. Из того, что я знаю, но не применял:
1) Многие на форумах советуют команду
hdparm -B 1 -S 12 /dev/sda
Единичка здесь означает самый «агрессивный» режим сбережения энергии жесткого диска. Лично я не смог вытерпеть, что диск замедляется уже через пару секунд после ничего-не-деланья, а разогнаться вновь ему приходится потратить мгновение, что создает эффект лага. Часто паркуется головка хдд. Не очень приятно, к тому же смею предположить, что это еще и изнашивает винт быстрее обычного. 255 вместо 1 отключает энергосбережение жесткого диска вообще. Можете поэкспериментировать с этим у себя, я не против :) Кстати, ковыряние /lib/hdparm/hdparm-functions позволяет найти вот такой кусок кода:
            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.