Экономия заряда аккумулятора во FreeBSD, или как прожить до 10 часов без подзарядки

10 октября 2016

Сегодня я хотел бы рассказать о некоторых аспектах использования FreeBSD на ноутбуке. А точнее говоря, аспектах, касающихся энергопотребления. Я не стану приводить общие рекомендации, типа «по возможности используйте легковесные консольные приложения (Irssi, Mutt) вместо тяжелых GUI-аналогов», или «отключайте все неиспользуемые вами устройства прямо в BIOS» в предположении, что они и так всем известны, ну или, в крайнем случае, легко гуглятся. Другими словами, далее речь пойдет только о специфичных для FreeBSD моментах.

Итак, первая встающая перед нами проблема — как, собственно, получить информацию об аккумуляторе? Во FreeBSD это можно сделать при помощи утилиты acpiconf:

acpiconf -i 0
acpiconf -i 1

Здесь 0 и 1 представляют собой номера аккумуляторов. На моем ноутбуке Fujitsu Lifebook E733 их два, у вас их может быть больше или меньше.

Пример вывода:

Design capacity:       6700 mAh
Last full capacity:    3896 mAh
Technology:            secondary (rechargeable)
Design voltage:        10800 mV
Capacity (warn):       830 mAh
Capacity (low):        361 mAh
Low/warn granularity:  1 mAh
Warn/full granularity: 1 mAh
Model number:          CP645579-01
Serial number:         01A-Z130809006201Z
Type:                  LION
OEM info:              Fujitsu
State:                 discharging
Remaining capacity:    88%
Remaining time:        4:14
Present rate:          818 mA (9912 mW)
Present voltage:       12118 mV

Обратите внимание на строчку Last full capacity. За более чем два года службы аккумулятор потерял почти половину своей емкости! Понятно, что это существенно влияет на время работы ноутбука без подзарядки. Впоследствии я заменил этот аккумулятор на новый. Прочие строчки не менее важны, особенно Remaining time. Ее, в частности, я использую в скрипте, который уведомляет меня об уровне заряда аккумулятора ниже заданного порога.

Теперь, когда мы можем как-то оценить время жизни аккумулятора, возникает вопрос, как его продлить? Для этого FreeBSD предоставляет множество ручек.

Например, современные CPU позволяют регулировать частоту, с которой они работают. Посмотреть список доступных частот можно следующим образом:

sysctl -a | egrep 'dev\.cpu\.' | grep freq

Пример вывода:

dev.cpu.0.freq_levels: 2201/35000 2200/35000 2100/32872 2000/30785
  1900/29079 1800/27071 1700/25435 1600/23510 1500/21943 1400/20089
  1300/18589 1200/16810
dev.cpu.0.freq: 2200

Здесь dev.cpu.0.freq_levels — это поддерживаемые процессором частоты и соответствующее энергопотребление (не уверен, в каких именно единицах), а dev.cpu.0.freq — текущая частота процессора. При этом частота 2201 особенная, она означает такие же 2.2 GHz как и в случае с 2200, только с включенным Turbo Boost.

Изменить текущую частоту можно следующей командой:

sudo sysctl dev.cpu.0.freq=1200

Существует демон powerd, который автоматически меняет частоту процессора в зависимости от текущей нагрузки. Но я лично предпочитаю регулировать частоту вручную. Подробности о powerd вы найдете в соответствующем мане.

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

sudo kldload coretemp
sysctl -a | grep temper

Пример вывода:

dev.cpu.7.temperature: 52.0C
dev.cpu.6.temperature: 51.0C
dev.cpu.5.temperature: 51.0C
dev.cpu.4.temperature: 51.0C
dev.cpu.3.temperature: 51.0C
dev.cpu.2.temperature: 51.0C
dev.cpu.1.temperature: 49.0C
dev.cpu.0.temperature: 49.0C

Как видите, температура измеряется отдельно по каждому ядру, с учетом виртуальных ядер, существующих благодаря Hyper-Threading.

Еще более подробную информацию о процессоре можно получить при помощи пакета intel-pcm:

sudo pkg install intel-pcm
sudo kldload cpuctl
sudo pcm.x 1

Здесь цифра 1 — это раз в сколько секунд следует обновлять выводимую информацию. Вывод утилиты pcm.x очень красивый, но, к сожалению, слишком размашистый, чтобы я мог его здесь привести. Можете считать ознакомление с ней своим домашним заданием.

Еще из полезных пакетов следует отметить intel-backlight:

sudo pkg install intel-backlight
sudo intel_backlight 50

Как вы, конечно же, догадались, он регулирует яркость экрана. Обратите внимание, что использование преимущественно консольных приложений, темных тем для всех остальных приложений, а также плагина для браузера вроде Dark Reader, позволяет комфортно работать за компьютером при существенно меньшей яркости экрана!

Что еще можно перевести в режим энергосбережения, это Wi-Fi адаптер:

sudo ifconfig wlan0 powersave

Переход обратно в нормальный режим:

sudo ifconfig wlan0 -powersave

К сожалению, большинство беспроводных сетевых карт, с которыми я имел дело, ведут себя из рук вон плохо в режиме энергосбережения как во FreeBSD, так и в Linux. Спустя какое-то время начинает теряться страшный процент пакетов, в результате чего пользоваться сетью становится невозможно. Поэтому я лично этим приемом не пользуюсь, но, быть может, для вас он будет работать лучше.

Также FreeBSD предоставляет весьма интересные средства управления USB-устройствами.

Посмотреть список всех USB устройств:

sudo usbconfig

Перевести устройство ugen1.7 в режим энергосбережения:

sudo usbconfig -d 1.7 power_save

Вывести устройство из режима энергосбережения:

sudo usbconfig -d 1.7 power_on

Вообще отключить устройство:

sudo usbconfig -d 1.7 power_off

Этим приемом я какое-то время пользовался, но потом обнаружил, что мне проще отключить неиспользуемые устройства через BIOS.

Наконец, рассмотрим последний на сегодня прием — уменьшение количества тиков системных часов в секунду. По умолчанию во FreeBSD оно равно 1000, а значит каждую миллисекунду в ядре срабатывает обработчик прерываний, который выполняет какую-то полезную или не очень работу. На практике это значение можно безопасно уменьшить до 100.

Для этого в /boot/loader.conf пишем:

kern.hz = 100

… и перезагружаем систему. К сожалению, у меня нет достоверных сведений о том, насколько реально это увеличивает время работы ноутбука без подзарядки (или снижает температуру процессора). Вполне может оказаться, что ни на сколько.

С учетом всего вышесказанного, мой ноутбук без проблем работает 8 часов без подзарядки в режиме «браузер, Wi-Fi (напомню, без powersave), притушенный экран», и еще аж целых 2 часа остается согласно acpiconf. Последний, кстати, предсказывает время работы весьма точно, если только резко не менять характер нагрузки. И это мы еще не тюнили-пересобирали ядро, не собирали весь софт из портов, соптимизировав его под наш конкретный CPU, и не угорали по прочему хардкору. В целом, по опыту использования Ubuntu на этом же ноутбуке, могу сделать осторожный такой вывод, что заряд аккумулятора FreeBSD использует как минимум так же экономно, как и Linux.

А как вы тюните свою систему для экономии заряда аккумулятора?

Метки: .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.