freebsd-powersave/

Сегодня я хотел бы рассказать о некоторых аспектах использования 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.

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

EnglishRussianUkrainian