Сегодня я хотел бы рассказать о некоторых аспектах использования FreeBSD на ноутбуке. А точнее говоря, аспектах, касающихся энергопотребления. Я не стану приводить общие рекомендации, типа «по возможности используйте легковесные консольные приложения ( Irssi , Mutt ) вместо тяжелых GUI-аналогов», или «отключайте все неиспользуемые вами устройства прямо в BIOS» в предположении, что они и так всем известны, ну или, в крайнем случае, легко гуглятся. Другими словами, далее речь пойдет только о специфичных для FreeBSD моментах.
Итак, первая встающая перед нами проблема — как, собственно, получить информацию об аккумуляторе? Во FreeBSD это можно сделать при помощи утилиты acpiconf:
acpiconf -i 1
Здесь 0 и 1 представляют собой номера аккумуляторов. На моем ноутбуке Fujitsu Lifebook E733 их два, у вас их может быть больше или меньше.
Пример вывода:
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 позволяют регулировать частоту, с которой они работают. Посмотреть список доступных частот можно следующим образом:
Пример вывода:
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.
Изменить текущую частоту можно следующей командой:
Существует демон powerd, который автоматически меняет частоту процессора в зависимости от текущей нагрузки. Но я лично предпочитаю регулировать частоту вручную. Подробности о powerd вы найдете в соответствующем мане .
Кстати, раз уж речь зашла о процессоре, FreeBSD позволяет с легкостью узнать и его текущую температуру:
sysctl -a | grep temper
Пример вывода:
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 kldload cpuctl
sudo pcm.x 1
Здесь цифра 1 — это раз в сколько секунд следует обновлять выводимую информацию. Вывод утилиты pcm.x очень красивый, но, к сожалению, слишком размашистый, чтобы я мог его здесь привести. Можете считать ознакомление с ней своим домашним заданием.
Еще из полезных пакетов следует отметить intel-backlight:
sudo intel_backlight 50
Как вы, конечно же, догадались, он регулирует яркость экрана. Обратите внимание, что использование преимущественно консольных приложений, темных тем для всех остальных приложений, а также плагина для браузера вроде Dark Reader , позволяет комфортно работать за компьютером при существенно меньшей яркости экрана!
Что еще можно перевести в режим энергосбережения, это Wi-Fi адаптер:
Переход обратно в нормальный режим:
К сожалению, большинство беспроводных сетевых карт, с которыми я имел дело, ведут себя из рук вон плохо в режиме энергосбережения как во FreeBSD, так и в Linux. Спустя какое-то время начинает теряться страшный процент пакетов, в результате чего пользоваться сетью становится невозможно. Поэтому я лично этим приемом не пользуюсь, но, быть может, для вас он будет работать лучше.
Также FreeBSD предоставляет весьма интересные средства управления USB-устройствами.
Посмотреть список всех USB устройств:
Перевести устройство ugen1.7 в режим энергосбережения:
Вывести устройство из режима энергосбережения:
Вообще отключить устройство:
Этим приемом я какое-то время пользовался, но потом обнаружил, что мне проще отключить неиспользуемые устройства через BIOS.
Наконец, рассмотрим последний на сегодня прием — уменьшение количества тиков системных часов в секунду. По умолчанию во FreeBSD оно равно 1000, а значит каждую миллисекунду в ядре срабатывает обработчик прерываний, который выполняет какую-то полезную или не очень работу. На практике это значение можно безопасно уменьшить до 100.
Для этого в /boot/loader.conf пишем:
… и перезагружаем систему. К сожалению, у меня нет достоверных сведений о том, насколько реально это увеличивает время работы ноутбука без подзарядки (или снижает температуру процессора). Вполне может оказаться, что ни на сколько.
С учетом всего вышесказанного, мой ноутбук без проблем работает 8 часов без подзарядки в режиме «браузер, Wi-Fi (напомню, без powersave), притушенный экран», и еще аж целых 2 часа остается согласно acpiconf. Последний, кстати, предсказывает время работы весьма точно, если только резко не менять характер нагрузки. И это мы еще не тюнили-пересобирали ядро , не собирали весь софт из портов , соптимизировав его под наш конкретный CPU, и не угорали по прочему хардкору. В целом, по опыту использования Ubuntu на этом же ноутбуке, могу сделать осторожный такой вывод, что заряд аккумулятора FreeBSD использует как минимум так же экономно, как и Linux.
А как вы тюните свою систему для экономии заряда аккумулятора?