четверг, 6 августа 2009 г.

x200s/x220. Увеличение времени работы от батарей.

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

Что у нас есть?
  • Lenovo ThinkPad x200s 74663TG. Проверено на Ubuntu 9.04, 9.10, 10.04, 10.10
  • Lenovo ThinkPad x220 4290RW1. Проверено на Ubuntu 11.04, 11.10

Видно, что разработчиками ядра была проведена работа по уменьшению потребления энергии. Мне удалось настроить систему так, что на Lenovo Thinkpad x200s с ядром 2.6.35-31-generic-pae при включенном wi-fi и запущеном firefox в idle минимальное потребление составляло 4.1 Вт. Типичное - около 5 Вт.


Для Lenovo Thinkpad x220 4290RW1 под Ubuntu 11.04 с ядром 2.6.38 показатели чуть скромнее: около 8,3 Вт. Типичный уровень потребления 9 Вт. Это лучше чем в Windows 7, где потребление составляет 10-11 Вт.
На скриншоте ниже показан powertop и snapshot Power Manager, сделанный из под Windows7.


Для той же Lenovo Thinkpad x220 4290RW1 под Ubuntu 11.10 с ядром 3.0.0.13: около 7 Вт. Типичный уровень потребления 9 Вт.



Для той же Lenovo Thinkpad x220 4290RW1 под Ubuntu 11.10 с кастомным ядром 3.1.5-pf.: около 6 Вт. Типичный уровень потребления 8 Вт.


Игра Emilia Pinball дает потребляемую мощность около 21 Вт. Я думаю, столько же даст Quake.

Теория и исследования


Что делать?

  1. Обновить BIOS
  2. Отключить в BIOS неиспользуемые устройства

  3. Установить новое ядро
  4. Настроить x server (xorg.conf)
  5. Настроить режимы видеокарты
  6. Перенести временные файлы в RAM
  7. Отключить запись логов
  8. Для SSD минимизировать запись на диск.
  9. Настроить laptop_mode (Ubuntu 9.04) или pm-utils (≥ 9.10).
  10. Включить управление скоростью вентилятора.
  11. Настроить работу программ
  12. Отключить некритичные сервисы.
  13. Если возможно, настроить точку доступа.



Полезные ссылки:


Upd 04/11/2011

понедельник, 3 августа 2009 г.

ThinkPad x200s. Настройка laptop-mode

(Продолжение. Начало статьи)

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

По умолчанию laptop-mode установлена в ubuntu, но так как было замечено, что на ThinkPad иногда приводила к зависанию компьютера, она выключена и большинство управляющих констант установлено в "false" или "0".

Но на моем x200s все работает без проблем (с некоторыми моими доработками).

Почти все управляющие и командные файлы laptop-mode являются текстовыми. В них дано подробное описание по каждой команде и константе.

Я просто укажу файл, константу и значение, которое я ей присвоил.

Те константы и файлы, которые остались без изменения, я опущу.

  1. Включить laptop-mode
    • /etc/default/acpi-support
      ENABLE_LAPTOP_MODE=true


  2. Настроить файлы конфигурации

    1. /etc/laptop-mode/conf.d/ac97-powersave.conf
      CONTROL_AC97_POWER=1

    2. /etc/laptop-mode/conf.d/configuration-file-control.conf
      CONTROL_CONFIG_FILES=1

      Включение этого параметра позволяет держать 3 конфигурационных файла syslog.conf, управляющих логами, для разных режимов.
      Я закоментировал весь логинг (/etc/syslog.conf-batt) для режима работы от батареи.

    3. /etc/laptop-mode/conf.d/cpufreq.conf
      CONTROL_CPU_FREQUENCY=1
      BATT_CPU_MAXFREQ=slowest
      BATT_CPU_MINFREQ=slowest
      BATT_CPU_GOVERNOR=powersave
      CONTROL_CPU_THROTTLING=1
      BATT_CPU_THROTTLING=medium
      LM_AC_CPU_THROTTLING=minimum

    4. /etc/laptop-mode/conf.d/ethernet.conf
      Этот модуль работал странно. При смене питания батарея/сеть не переключалась скорость интерфейса.
      Я его переписал и устранил эту ошибку.
      Заодно ввел 3 константы, определяющие скорость в разных режимах.
      CONTROL_ETHERNET=1
      DISABLE_WAKEUP_ON_LAN=1
      BATT_THROTTLE_ETHERNET=1
      LM_AC_THROTTLE_ETHERNET=1
      NOLM_AC_THROTTLE_ETHERNET=1
      BATT_SPEED_ETHERNET=100
      LM_AC_SPEED_ETHERNET=1000
      NOLM_AC_SPEED_ETHERNET=1000
      ETHERNET_DEVICES="eth0"

      Файл /usr/share/laptop-mode-tools/modules/ethernet изменить в соответствии с приведенным ниже (сделать copy/past).
      #! /bin/sh
      # 
      # Laptop mode tools module: Ethernet power saving tweaks.
      #
      
      if [ x$CONTROL_ETHERNET = x1 ] ; then
        for DEVICE in $ETHERNET_DEVICES ; do
      
          # Wakeup-on-LAN handling
          if [ x$DISABLE_WAKEUP_ON_LAN = x1 ] ; then
            if ethtool -s $DEVICE wol d >> $OUTPUT 2>&1 ; then
              $LM_VERBOSE && echo "Disabled wakeup-on-LAN for $DEVICE" >> $OUTPUT
            else
              $LM_VERBOSE && echo "Could not disable wakeup-on-LAN for $DEVICE" >> $OUTPUT
            fi
          fi
      
          if [ $ON_AC -eq 1 ]; then
          # working on AC
            if [ $LM_AC_THROTTLE_ETHERNET -eq 1 ] ; then
              if ethtool -s $DEVICE speed $LM_AC_SPEED_ETHERNET >> $OUTPUT 2>&1 ; then
                $LM_VERBOSE && echo "Setting LAN speed = $LM_AC_SPEED_ETHERNET for $DEVICE" >> $OUTPUT
              else
                $LM_VERBOSE && echo "Could not chanche speed"
              fi
            fi
            if [ $NOLM_AC_THROTTLE_ETHERNET -eq 1 ] ; then
              if ethtool -s $DEVICE speed $NOLM_AC_SPEED_ETHERNET >> $OUTPUT 2>&1 ; then
                $LM_VERBOSE && echo "Setting LAN speed = $NOLM_AC_SPEED_ETHERNET for $DEVICE" >> $OUTPUT
              else
                $LM_VERBOSE && echo "Could not chanche speed"
              fi 
            fi
          else
          # working on Battery
            if [ $BATT_THROTTLE_ETHERNET -eq 1 ] ; then
              if ethtool -s $DEVICE speed $BATT_SPEED_ETHERNET >> $OUTPUT 2>&1 ; then
                $LM_VERBOSE && echo "Setting LAN speed = $BATT_SPEED_ETHERNET for $DEVICE" >> $OUTPUT
              else
                $LM_VERBOSE && echo "Could not chanche speed"
              fi
            fi
          fi
        done
      else
        $LM_VERBOSE && echo "Ethernet module is disabled." >> $OUTPUT
      fi

    5. /etc/laptop-mode/conf.d/hal-polling.conf
      CONTROL_HAL_POLLING=1

    6. /etc/laptop-mode/conf.d/intel-hda-powersave.conf
      CONTROL_INTEL_HDA_POWER=1

      Значение, которое передается контроллеру Intel HDA указано в скрипте /usr/share/laptop-mode-tools/modules/intel-hda-powersave в строке:
      . . .
      echo 5 > /sys/module/snd_hda_intel/parameters/power_save
      . . .
      

      Я заменил значение 5 на 10.

    7. /etc/laptop-mode/conf.d/intel-sata-powermgmt
      CONTROL_INTEL_SATA_POWER=1

    8. /etc/laptop-mode/conf.d/lcd-brightness.conf
      CONTROL_BRIGHTNESS=1
      BATT_BRIGHTNESS_COMMAND="echo 30"
      LM_AC_BRIGHTNESS_COMMAND="echo 80"
      NOLM_AC_BRIGHTNESS_COMMAND="echo 80"
      BRIGHTNESS_OUTPUT="/proc/acpi/video/VID/LCD0/brightness"

    9. /etc/laptop-mode/conf.d/sched-mc-power-savings.conf
      CONTROL_SCHED_MC_POWER_SAVINGS=1

    10. /etc/laptop-mode/conf.d/start-stop-programs.conf
      CONTROL_START_STOP=1
      BATT_STOP="on-ac.sh"
      BATT_START="on-battery.sh"

      В этом конфигурационном файле указываются имена скриптов запускающихся при переходe в режим работы от батареи
      #!/bin/bash
      
      # ********************************************
      # * on-battery.sh
      # ********************************************
      
      echo "for check running on-battery.sh" >> /tmp/lt-m-check.out
      
      # ********  Tuning VM
      echo 0 > /proc/sys/vm/swappiness   #    Disable SWAP
      echo 30000 > /proc/sys/vm/dirty_writeback_centisecs
      echo 0 > /proc/sys/vm/dirty_expire_centisecs
      echo 1 > /proc/sys/vm/dirty_background_ratio
      echo 95 > /proc/sys/vm/dirty_ratio
      
      #   Agressive PCI
      echo powersave > /sys/module/pcie_aspm/parameters/policy
      
      #   Set timeout to idle 20 sec, 
      #     acoustic management HDD to more silent, less performance
      hdparm -q -S4 -M 128 /dev/sda
      
      # disable HDMI
      xrandr --output HDMI-1 --off
      xrandr --output HDMI-2 --off
      
      # Stop cron, anacron
      /etc/init.d/cron stop >> /dev/null
      /etc/init.d/anacron stop >> /dev/null
      

      и от сетевого источника питания источника питания.
      # ********************************************
      # * /etc/laptop-mode/batt-stop/on-ac.sh
      # ********************************************
      
      echo "for check running on-ac.sh" >> /tmp/lt-m-check.out
      
      #   Tuning VM. Вернуть значения по умолчанию
      echo 60 > /proc/sys/vm/swappiness
      echo 60000 > /proc/sys/vm/dirty_writeback_centisecs
      echo 60000 > /proc/sys/vm/dirty_expire_centisecs
      echo 1 > /proc/sys/vm/dirty_background_ratio
      echo 60 > /proc/sys/vm/dirty_ratio
      
      # set acoustic management HDD: more performance
      hdparm -q -M 254 /dev/sda
      
      # Start cron, anacron
      /etc/init.d/cron start >> /dev/null
      /etc/init.d/anacron start >> /dev/null

      Эти файлы нужно сохранить в каталогах
      /etc/laptop-mode/batt-start/
      и
      /etc/laptop-mode/batt-stop/
      соотвественно и сделать исполняемыми:
      $sudo chmod 755 /etc/laptop-mode/batt-start/on-battery.sh $sudo chmod 755 /etc/laptop-mode/batt-stop/on-ac.sh

    11. /etc/laptop-mode/conf.d/usb-autosuspend.conf
      CONTROL_USB_AUTOSUSPEND=1

    12. /etc/laptop-mode/conf.d/wireless-iwl-power.conf
      CONTROL_IWL_POWER=1
      IWL_AC_POWER=1
      IWL_BATT_POWER=5



После изменении параметров всех, или части параметров конфигурационных файлов необязательно перезагружать компьютер. Достаточно выполнить команду перезапуска службы laptop-mode
#service laptop-mode restart




Обсуждение лучше вести здесь:

ThinkPad x200s/x220. Перенос временных файлов в RAM

(Продолжение. Начало статьи)

Цель: уменьшить количество обращений к диску, и увеличить время нахождения HDD в состоянии spin-down.
Если в компьютере установлен SSD, то пропускаем этот раздел.

Из общих рекомендаций скажу, что хорошо бы увеличить количество оперативной памяти. Если используется 32-х битная Linux поставить pae-версию ядра. Или использовать 64-х битное ядро.


  • tmp файлы

    По умолчанию временные каталоги в ubuntu создаются на диске. Постоянно обращаясь и скидывая временные файлы на диск операционная система не дает диску выключаться.
    Лучше временные файлы разместить в RAM.

    Для этого нужно добавить в файл /etc/fstab такие строчки
    tmpfs  /tmp            tmpfs        defaults           0    0
    tmpfs  /var/tmp        tmpfs        defaults           0    0


  • wpa_supplicant (для <=9.04)

    Этот драйвер пишет свои логи примерно раз в минуту в файл, задаваемый в строке запуска.
    По умолчанию лог ведется в стандартный каталог /var/log/, что приводит к регулярной раскрутке диска.

    Чтобы уменьшить количество событий, влияющих на обращение к диску можно направить вывод в /tmp/wpa_supplicant.log отредактировав файл
    /usr/share/dbus-1/system-services/fi.epitest.hostap.WPASupplicant.service
    [D-BUS Service]
    Name=fi.epitest.hostap.WPASupplicant
    #Exec=/sbin/wpa_supplicant -u -f /var/log/wpa_supplicant.log
    Exec=/sbin/wpa_supplicant -u -f /tmp/wpa_supplicant.log
    User=root

    Перенаправлять вывод wpa_supplicant.log имеет смысл делать, если планируется отключать log файлы (см. laptop-mode).


  • Gnome power manager

    GPM пишет статистику о потреблении энергии примерно раз в минуту в файл, размещаеый в home каталоге, что приводит к регулярной раскрутке диска.

    Vetal1950 предложил элегантное решение. Добавить в /etc/fstab команду монтирования:
    tmpfs  /var/lib/upower    tmpfs    defaults,noatime,nodiratime    0    0



04/11/2011 - Добавлено решение по GPM