Форум русскоязычного сообщества Ubuntu


Автор Тема: Настройка энергопотребления для Ubuntu 11.10 на ThinkPad x220  (Прочитано 12783 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Axa-Ru

  • Автор темы
  • Гость
Установка и настройка pm-utils
 8) В результате применения этого пункта потребление должно снизиться до 8-9 Вт
  • Установить необходимые программы: apmd, pm-utils и т.п.
$ sudo apt-get install apmd pm-utils hdparm libnotify-bin
  • Создадим скрип управления энергопотреблением:
$ sudo gedit /usr/lib/pm-utils/power.d/99-savings.sh
    В появившемся окне редактора копипастим следующий текст
######################################################################################
# Script to aggressively toggle power management between high
# performance and very low power usage.
# For more information on each of these options, see http://www.lesswatts.org
# Colyleft axa-ru.blogspot.com
################# Ghanges history ###################################################
#VERSION=0.12   # 31.08.2010 Testing Ubuntu 10.04. Small changes for Wi-Fi control
#VERSION=0.13   # 21.09.2010 Adding services control:
                #   evolution-alarm-notify,
                #   postfix,
                #   rsyslog
#VERSION=0.2    # 23.07.2011 Modified for Ubintu 11.04. Tested on Thinkpad x220 4290rw1
#VERSION=0.23   # 27.07.2011 Added store value (Brightness, user, etc ) to /tmp/powersave.ini
                #   Fix notify-send message
VERSION=0.23.1  # 07.01.2012 Fix ethtool parameters in aLan procedure
 
#
# To install:
#
# sudo apt-get install apmd pm-utils expect hdparm libnotify-bin
#
# Save this file to /usr/lib/pm-utils/power.d/99-savings.sh
# cd /usr/lib/pm-utils/power.d
# sudo install 99-savings.sh /etc/pm/sleep.d
# sudo install 99-savings.sh /etc/pm/power.d
#
 
INI=/tmp/powersave.ini
 
aUsb()
{
  #################################################
  ## USB Subsystem
  ##
  # 0.7-0.8 W
  case "$1" in
    false)  #ac_power
      for i in /sys/bus/usb/devices/*/power/control
      do
        echo "on" > $i
      done
      ;;
 
    true)  #batt_power
      for i in /sys/bus/usb/devices/*/power/control
      do
        echo "auto" > $i
      done
 
      for i in /sys/bus/usb/devices/*/power/autosuspend
      do
        echo 1 > $i
      done
 
      echo 1 > /sys/module/usbcore/parameters/autosuspend
      ;;
  esac
}
 
aSata()
{
 
  case "$1" in
    false)  #ac_power
      # Set the SATA to max performance
      for i in /sys/class/scsi_host/host*/link_power_management_policy
      do
        echo max_performance > $i
      done
      ;;
 
    true)  #batt_power
      # Set SATA to minimum power
      # 0.7 W
      for i in /sys/class/scsi_host/host*/link_power_management_policy
      do
        echo min_power > $i
      done
      ;;
  esac
}
 
aPci()
{
  case "$1" in
    false)  #ac_power
      for i in /sys/bus/pci/devices/*/power/control
      do
        echo on > $i
      done
      ;;
 
    true)  #batt_power
      for i in /sys/bus/pci/devices/*/power/control
      do
        echo auto > $i
      done
      ;;
  esac
}
 
aI2c()
{
  case "$1" in
    false)  #ac_power
      for i in /sys/bus/i2c/devices/i2c-*/power/control
      do
        echo on > $i
      done
      ;;
 
    true)  #batt_power
      for i in /sys/bus/i2c/devices/i2c-*/power/control
      do
        echo auto > $i
      done
      ;;
  esac
}
 
aHdd()
{
  case "$1" in
    false)  #ac_power
      # Set the drive to mostly stay awake.  Some may want to change -B 200
      # to -B 255 to avoid accumulating Load_Cycle_Counts
      # -S 240 => put in standby after 20 minutes idle
      # -B 200 => do not permit spin down
      # -M => not supported by my drive
      hdparm -B 200 -S 240 -M 254 /dev/sda
 
      # Remount ext3/4 file systems so the journal commit only happens every 60
      # seconds.  By default this is 5 but, I prefer to reduce the disk
      # activity a bit.
      mount -o remount,commit=60,atime /
      ;;
 
    true)  #batt_power
      hdparm -B 1 -S 4 -M 128 /dev/sda
      mount -o remount,noatime,commit=600 /
 
      ;;
  esac
}
 
aSsd()
{
 
# add these commands in the /etc/rc.local
#  echo deadline > /sys/block/sda/queue/scheduler
#  echo 1 > /sys/block/sda/queue/iosched/fifo_batch
#  sysctl -w vm.swappiness=1            # Strongly discourage swapping
#  sysctl -w vm.vfs_cache_pressure=50   # Don't shrink the inode cache aggressively
  case "$1" in
    false)  #ac_power
      ;;
 
    true)  #batt_power
      ;;
  esac
}
 
aI915()
{
  case "$1" in
    false)  #ac_power
      echo 0 > /sys/module/i915/parameters/powersave
      ;;
 
    true)  #batt_power
      echo 1 > /sys/module/i915/parameters/powersave
      ;;
  esac
}
 
aWlan()
{
      # WiFi power savings.
  case "$1" in
    false)  #ac_power
      /sbin/iwconfig wlan0 power off txpower 14
      ;;
 
    true)  #batt_power
      /sbin/iwconfig wlan0 power on txpower 4
      ;;
  esac
}
 
aLan()
{
  case "$1" in
    false)  #ac_power
      # set the ethernet max speed.
      ethtool -s eth0 speed 1000 duplex full autoneg on wol d
      ;;
 
    true)  #batt_power
      # set the ethernet power savings.
      # ~ 0.4 W
      ethtool -s eth0 speed 10 duplex half autoneg off wol d
      ;;
  esac
}
 
aCpu()
{
  #################################################
  ## CPU
  ##
 
  case "$1" in
    false)  #ac_power
      for i in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
      do
        echo performance > $i
      done
 
      # Enable All Core CPU
      for i in /sys/devices/system/cpu/cpu*/online
      do
        echo 1 > $i
      done
 
      # Shedule Multitreading
      echo 0 > /sys/devices/system/cpu/sched_mc_power_savings
      ;;
 
    true)  #batt_power
      for i in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
      do
        echo powersave > $i
      done
 
#      Disable cores not affected for power saving
#      for i in /sys/devices/system/cpu/cpu*/online
#      do
#        echo 0 > $i
#      done
 
      echo 1 > /sys/devices/system/cpu/sched_mc_power_savings
      ;;
  esac
}
 
aSnd()
{
  case "$1" in
    false)  #ac_power
      echo 0 > /sys/module/snd_hda_intel/parameters/power_save
      ;;
 
    true)  #batt_power
      # Turn off sound card power savings
      # < 0.1 W
      echo 10 > /sys/module/snd_hda_intel/parameters/power_save
      ;;
  esac
}
 
aBt()
{
  case "$1" in
    false)  #ac_power
      # Enable the bluetooth driver
      rfkill unblock bluetooth
      ;;
 
    true)  #batt_power
      # Remove the bluetooth driver
      # 0.3-0.4 W
      rfkill block bluetooth
      ;;
  esac
}
 
aDaemons()
{
  #################################################
  ## demons, services
  ##
 
  case "$1" in
    false)  #ac_power
      # 1. Evolution alarm and integrations
      /usr/lib/evolution/2.32/evolution-alarm-notify &
      #/usr/lib/evolution/e-calendar-factory &
      #/usr/lib/evolution/e-addressbook-factory &
 
      # 2. Starting Sendmail server
      #postfix start
 
      # 3. Starting CouchDB & desktopcouch
      dbus-send --session --dest=org.desktopcouch.CouchDB --print-reply --type=method_call / org.desktopcouch.CouchDB.getPort
      ;;
 
    true)  #batt_power
      # 1. Evolution alarm
      killall evolution-alarm-notify
      #killall e-calendar-factory
      #killall e-addressbook-factory
 
      # 2. Stopping Sendmail server
      #postfix stop
 
      # 3. Stoping CouchDB & desktopcouch
      killall beam.smp
      killall desktopcouch-service
      ;;
  esac
}
 
# < 0.1 W
aWebcam()
{
  case "$1" in
    false)  #ac_power
      # Enable the webcam driver
      modprobe uvcvideo
      ;;
 
    true)  #batt_power
      # Remove the webcam driver
      modprobe -r uvcvideo
      ;;
  esac
}
 
aMemory()
{
  case "$1" in
    false)  #ac_power
      # Set kernel dirty page value back to default
      echo 10 > /proc/sys/vm/dirty_ratio
      echo 5 > /proc/sys/vm/dirty_background_ratio
 
      # Only wakeup every 60 seconds to see if we need to write dirty pages
      # By default this is every 5 seconds but, I prefer 60 to reduce disk
      # activity.
      echo 6000 > /proc/sys/vm/dirty_writeback_centisecs
      ;;
 
    true)  #batt_power
      # Reduce disk activity by waiting up to 10 minutes before doing writes
      echo 90 > /proc/sys/vm/dirty_ratio
      echo 1 > /proc/sys/vm/dirty_background_ratio
      echo 60000 > /proc/sys/vm/dirty_writeback_centisecs
      ;;
  esac
}
 
aBrightness()
{
  case "$1" in
    false)  #ac_power
      # Setup maximum brigthness
      # Thinkpad x220, Ubuntu 11.04
      vBAT_BRI=$(cat /sys/devices/virtual/backlight/acpi_video0/brightness)
      echo $vAC_BRI > /sys/devices/virtual/backlight/acpi_video0/brightness
      ;;
 
    true)  #batt_power
      # Setup brigthness 30%
      vAC_BRI=$(cat /sys/devices/virtual/backlight/acpi_video0/brightness)
      echo $vBAT_BRI > /sys/devices/virtual/backlight/acpi_video0/brightness
      ;;
  esac
 
}
 
aMisk()
{
  case "$1" in
    false)  #ac_power
      # Turn off the laptop mode disk optimization
      echo 0 > /proc/sys/vm/laptop_mode
      echo tsc > /sys/devices/system/clocksource/clocksource0/current_clocksource
 
      # enable logging
      service rsyslog start
 
      # ZiXEL nbg460n. Set maximum wifi speed
      if [ -f /etc/pm/802.11.bgn ]; then /etc/pm/802.11.bgn 1; fi
 
      # enable winbindd
      if [ -f /etc/init.d/winbind ]; then  /etc/init.d/winbind start; fi
 
      # Powersave pci express
      echo performance > /sys/module/pcie_aspm/parameters/policy
      ;;
 
    true)  #batt_power
      # Set laptop disk write mode
      echo 5 > /proc/sys/vm/laptop_mode
      echo hpet > /sys/devices/system/clocksource/clocksource0/current_clocksource
      # disable logging
      service rsyslog stop
 
      # ZiXEL nbg460n. Set standard wifi speed
      if [ -f /etc/pm/802.11.bgn ]; then /etc/pm/802.11.bgn 0; fi
 
      # disable winbind
      if [ -f /etc/init.d/winbind ]; then  /etc/init.d/winbind stop ; fi
 
      echo powersave > /sys/module/pcie_aspm/parameters/policy
      ;;
  esac
}
 
aNotify()
{
  case "$1" in
    false) #ac_power
      MSGH="AC"
      MSGT="Maximum Performance Mode"
      MSGI="ac-adapter"
      ;;
    true)  #battery_power
      MSGH="BATT"
      MSGT="Battery Power Saving"
      MSGI="battery"
    ;;
  esac
 
  vUSER=`ps -C gnome-session -o user=` #find UID user who start gnome-session
  vPIDS=`pgrep -u $vUSER gnome-session` #find PID
  for PID in $vPIDS; do
    vDBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ \
    | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//')
    DBUS_SESSION_BUS_ADDRESS=$vDBUS_SESSION_BUS_ADDRESS DISPLAY=:0.0 sudo -u $vUSER notify-send "$MSGH" "$MSGT" -i "$MSGI"
  done
}
 
aLoadini()
{
  if [ -e $INI ];
    then
      echo "Restore Value"
      while read LINE
      do
        PARM=$(echo "$LINE" | awk '{print $1}')
        KEY=$(echo "$LINE" | awk '{print $2}')
        case $PARM in
          "AC_BRI")
            vAC_BRI=$KEY
            ;;
          "BAT_BRI")
            vBAT_BRI=$KEY
            ;;
          "USER")
            vUSER=$KEY
            ;;
          "PIDS")
            vPIDS=$KEY
            ;;
          "DBUS_SESSION_BUS_ADDRESS")
            vDBUS_SESSION_BUS_ADDRESS=$KEY
            ;;
        esac
        echo "$PARM $KEY"
      done < $INI
    else
      echo "Reset Value"
      vAC_BRI=15
      vBAT_BRI=8
      vUSER=""
      vPIDS=""
      vDBUS_SESSION_BUS_ADDRESS=""
  fi
}
 
aSaveini()
{
  echo "AC_BRI $vAC_BRI" > $INI
  echo "BAT_BRI $vBAT_BRI" >> $INI
  echo "USER $vUSER" >> $INI
  echo "PIDS $vPIDS" >> $INI
  echo "DBUS_SESSION_BUS_ADDRESS $vDBUS_SESSION_BUS_ADDRESS" >> $INI
}
 
 
##########################################################
## Apply settings
##
aLoadini
 
aCpu $1
aUsb $1
aI2c $1
aSata $1
aPci $1
if [ $(hdparm -i /dev/sda | grep Model | awk '{print substr($2,1,3)}') = "SSD" ];
  then
    aSsd $1
  else
    aHdd $1
fi
aI915 $1
aWlan $1
aLan $1
aSnd $1
aBt $1
aWebcam $1
aMemory $1
aDaemons $1
aBrightness $1
aMisk $1
aNotify $1
 
aSaveini
  • Подключаем скрипт к событиям power и sleep
$ cd /usr/lib/pm-utils/power.d
$ sudo chmod 755 99-savings.sh
$ sudo install 99-savings.sh /etc/pm/sleep.d
$ sudo install 99-savings.sh /etc/pm/power.d
Вытаскиваем провод источника питания и наблюдаем pop up сообщение, что компьютер перешел в режим сохранения энергии
Вставяем провод источника питания и наблюдаем pop up сообщение, что компьютер перешел в режим максимального быстродействия.


Устанавливаем параметры загрузки Ubuntu
 8) В результате применения этого пункта потребление должно снизиться до 7 Вт

В терминале с помощью редактора gedit
sudo gedit /etc/default/grubЗаменяем строку
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
на
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash i915.i915_enable_rc6=1 i915.lvds_downclock=1 i915_enable_fbc=1 reboot=pci"
Перезагружаемся и проверяем, что у нас энергопотребление упало еще примерно на 1 Вт.


Компиляция и установка форка ядра 3.1.6-pf
  8) В результате применения этого пункта потребление должно снизиться до 6 Вт
 :tickedoff: Минусы: у меня увеличилось время загрузки и выключения системы.
  • Устанавливаем пакеты, необходимые для компиляции ядра
$ sudo apt-get -y install fakeroot build-essential crash kexec-tools makedumpfile kernel-wedge \
               git-core libncurses5 libncurses5-dev libelf-dev libdw-dev binutils-dev kernel-package
$ sudo apt-get build-dep kernel-package linux-meta
  • Создадим рабочий каталог
cd ~
mkdir kernel-pf
cd kernel-pf
  • Загрузим и разархивируем исходники ядра и патча форка.
$ wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.1.tar.bz2
$ tar xjvf linux-3.1.tar.bz2
$ wget http://pf.natalenko.name/sources/3.1/patch-3.1.6-pf.bz2
$ bzip2 -d patch-3.1.6-pf.bz2
  • Применим патч и сконфигурируем Makefile.
$ cd linux-3.1
$ patch -p1 < ../patch-3.1.6-pf
$ cp /boot/config-`uname -r` .config
$ make oldconfig
Здесь будут заданы вопросы касающиеся применения новых функций и модулей.
Я на все вопросы оставил ответы по умолчанию (нажал <Enter>), кроме:
BFQ I/O scheduler (IOSCHED_BFQ) [N/m/y/?] (NEW) YBFQ hierarchical scheduling support (CGROUP_BFQIO) [N/y/?] (NEW) YTimer frequency
  1. 100 HZ (HZ_100)
  2. 250 HZ (HZ_250_NODEFAULT) (NEW)
  3. 300 HZ (HZ_300)
> 4. 1000 HZ (HZ_1000)
  5. 1500 HZ (HZ_1500) (NEW)
  6. 2000 HZ (HZ_2000) (NEW)
  7. 3000 HZ (HZ_3000) (NEW)
  8. 4000 HZ (HZ_4000) (NEW)
  9. 5000 HZ (HZ_5000) (NEW)
  10. 7500 HZ (HZ_7500) (NEW)
  11. 10000 HZ (HZ_10000) (NEW)
choice[1-11?]: 1
  • Cкомпилируем ядро
$ make-kpkg clean
$ CONCURRENCY_LEVEL=`getconf _NPROCESSORS_ONLN` fakeroot make-kpkg --initrd kernel_image kernel_headers
  • Установим ядро
$ cd ..
$ sudo dpkg -i linux-*.deb


Тьюнинг SSD
  • Оптимизировать планировщики, swap, кэш hdd.
Открыть rc.local на редактирование sudo gedit /etc/rc.local и добавить следующие команды:
echo deadline > /sys/block/sda/queue/scheduler
echo 1 > /sys/block/sda/queue/iosched/fifo_batch
sysctl -w vm.swappiness=1            # Strongly discourage swapping
sysctl -w vm.vfs_cache_pressure=50   # Don't shrink the inode cache aggressively
hdparm -W1 /dev/sda
  • Отключить журналирование (показано на примере моей системы).
:tickedoff: Возможно при этом будет отключена функция TRIM, введенная для более равномерного использования блоков SSD (http://tokarchuk.ru/2011/01/enable-trim-support-in-ubuntu/).

Для отключения журналирования необходимо определить UUD раздела на котором установлена Ububtu:
$ sudo blkid
/dev/sda1: LABEL="SYSTEM_DRV" UUID="E624915324912797" TYPE="ntfs"
/dev/sda2: LABEL="Windows7_OS" UUID="EAAE9549AE950F67" TYPE="ntfs"
/dev/sda3: LABEL="Lenovo_Recovery" UUID="E26C97CB6C97993D" TYPE="ntfs"
/dev/sda5: UUID="0C58-1DC4" TYPE="vfat"
/dev/sda6: UUID="24a89b42-96a6-415f-a23f-e13bdf770c45" TYPE="ext4"
/dev/sda7: UUID="925c3ca9-c234-4ad7-814d-2c2522542e48" TYPE="swap"
В моем случае Ubuntu установлена на /dev/sda6. Затем загузиться с live cd (инсталляционного диска) или другого раздела. Запустить терминал и дать команду:
tune2fs -O ^has_journal UUID="24a89b42-96a6-415f-a23f-e13bdf770c45"

В результате применения описанных действий вы должны получить вот такой результат.


Крайняя версия этой статьи и скриптов находятся в моем блоге http://axa-ru.blogspot.com/2012/01/thinkpad-x220-powersaving.html
« Последнее редактирование: 09 Январь 2012, 23:03:39 от Axa-Ru »

Оффлайн unr

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Спасибо за статью, очень вовремя она появилась.

Есть вопрос не совсем по теме:
При просмотре Youtube в 1020 разрешении процессор греется до 84-88*С стабильно
средняя температура 54-58*С
sensors -  Core 0: +56.0°C  (high = +86.0°C, crit = +100.0°C)
отсюда следует что 88 - температура не критичная, но все-равно как то напрягает, может меня кто-нибудь успокоить а то я параноить начал )

Thinkpad x220
Ubuntu 11.10
Intel® Core™ i5-2410M CPU @ 2.30GHz × 4

Axa-Ru

  • Автор темы
  • Гость
unr
Я, честно говоря, не заморачивался температурой процессора.

Но, если говорить про Youtube, то здесь используется флеш, к которой всегда были нарекания, что она ресурсоемкая.
К тому же у нас с вами используется встроенная в процессор видеоподсистема, которая, вероятно, тоже разогревает процессор.

Вот еще один фокус.
Откройте на редактирование свой пост и замерьте в powertop потребляемую энергию. Будете удивлены.

Оффлайн unr

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
The battery reports a discharge rate of 14.8 W
Ну как то так, это после скрипта и изменения загрузки, ссд у меня нет.
Ядро пока не менял, думаю после нового года займусь.
Вообще я  утром тестил пару часов - показатели плавают от 10 до 15 при 15-20 вкладках хрома, что в принципе приемлемо, но поколдовать еще можно.
А на какой яркости монитора замеряли?

Axa-Ru

  • Автор темы
  • Гость
Яркость - 20 %
Запущен firefox. На активной вкладке нет flash.

Ядро даст около 1 Вт
« Последнее редактирование: 30 Декабрь 2011, 00:05:06 от Axa-Ru »

Оффлайн unr

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
яркость 20%



какая утилита ставится для защиты харда от сотрясений?

Axa-Ru

  • Автор темы
  • Гость

Axa-Ru

  • Автор темы
  • Гость
Изменил параметры командной строки установки интерфейса eth0 (процедура aLan)
« Последнее редактирование: 07 Январь 2012, 15:15:55 от Axa-Ru »

Оффлайн HappyTree

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Можно ли настроить так, как это делается родной утилитой, в случае работы ноутбука от сети практически всего времени?
Идея в том, что бы оно не перезаряжало батарею пока её заряд на саморазряде не опустится до указанного предела, например 40%.

Axa-Ru

  • Автор темы
  • Гость
Думаю, можно.
Не знаю. Зарядом батареи занимается контроллер, расположенный внутри батареи.
Система может обмениваться с ним по шине i2c. Но проблема в том, что обмен шифрованный.

А нужно?
« Последнее редактирование: 07 Январь 2012, 19:05:14 от Axa-Ru »

Оффлайн HappyTree

  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Думаю, можно.
Не знаю. Зарядом батареи занимается контроллер, расположенный внутри батареи.
Система может обмениваться с ним по шине i2c. Но проблема в том, что обмен шифрованный.

А нужно?

Конечно нужно. Когда ноут 90% времени работает от сети, батарея полностью сдыхает за 6-12 месяцев.
С этими настройками её жизнь можно значительно продлить.

Axa-Ru

  • Автор темы
  • Гость

Оффлайн unr

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Подскажи по поводу драйвера для видео на thinkpad x220 а то у меня иногда закладки в хроме затираются серым цветом или при наведении на значки в юнити панели контекстное меню все в полосках непонятных. Есть подозрение что драйвер установлен криво, в систем инфо написано следующее - Intel® Sandybridge Mobile.

Оффлайн nikkbelov

  • Любитель
  • *
  • Сообщений: 84
    • Просмотр профиля
Ктоб такую тему для Y560 поднял. После крайнего обновления стал жрать 40 watt ....
Все съедает ATI.

Axa-Ru

  • Автор темы
  • Гость
Для Y650  все то же самое.
Откуда информация, что все сжирает ATI?

unr,
У меня такого нет. Думаю дело в настройках компиза. Попробуй поставить ядро 3.2. Там огромное количество изменений в том числе и в драйвере.

 

Страница сгенерирована за 0.063 секунд. Запросов: 25.