miércoles, 8 de mayo de 2013

Aumenta el tiempo de batería en tu portatil


Un problema muy común en todos los portátiles con sistemas Linux es que la batería dura un asalto.

Por ejemplo, mi batería debería durar unas 3 horas, pero no dura más de 1 hora y media.

Esto es en su mayor parte por culpa de la gráfica y los ventiladores de esta, disco duro y procesador, que trabajan a máxima potencia aunque estemos en modo batería y ya le hayamos puesto en configuración que sea más conservador con la energía de los dispositivos.

En su parte, la culpa la tiene los kernels inmediatamente inferiores a la 3.8 (ya que esta está parcheada) que tienen un problema con el consumo. En la 3.9 ya está totalmente corregido.

Pero además puede ser que no tengamos activados las opciones de energía en el núcleo.

Hoy quiero explicar a todos como he conseguido resolver el problema en LMDE (Linux Mint Debian Edition)

Para empezar diré que yo he compilado un kernel nuevo, la 3.9, para que tenga las opciones mínimas necesarias que usará el programa que vamos a necesitar.

Explicación de compilación del Kernel con sus opciones mínimas:
http://pc-citos.blogspot.com.es/2013/05/compilar-el-ultimo-kernel-disponible-en.html



Instalar lo necesario

El programa que necesitamos se llama "laptop-mode-tools" pero también instalaremos "powertop" para ver el consumo real del equipo.

scorpyomint@pc-citomint ~ $ sudo apt-get install laptop-mode-tools powertop

Con eso tenemos instalado los programas.

Laptop-mode-tools usará los eventos ACPI para identificar el estado de conexión y desconexión de batería, la retroiluminación de pantalla..... el estado de la CPU, uso de disco duro...

Uso de powertop
El uso de powertop es para ir comprobando el efecto que causa en la energía de consumo los cambios que vayamos haciendo.

Simplemente abrir una terminal y escribir:
scorpyomint@pc-citomint ~ $ sudo powertop


Configuración de laptop-mode-tools

Lo primero que tenemos que hacer es parar el demonio de laptop porque tras la instalación se inicia.
scorpyomint@pc-citomint ~ $ sudo service laptop-mode stop

En el archivo "/etc/laptop-mode/laptop-mode.conf" está la configuración inicial que usa el demonio.

A partir de ahora, para editar los archivos, ya que algunos son muy largos podemos usar "pluma" o "gedit", este último para distribuciones con Gnome, en este caso lo abro con nano.

scorpyomint@pc-citomint ~ $ sudo nano /etc/laptop-mode/laptop-mode.conf

Habría que modificar ciertos valores, pero lo más importante es asegurarse las siguientes variables está en "1" es decir, activado:

ENABLE_LAPTOP_MODE_TOOLS=1
ENABLE_LAPTOP_MODE_ON_BATTERY=1

Si seguimos avanzando en el archivo de configuración veremos todos los módulos (scripts) que controlan la energía de algún elemento "descrito en su nombre".
Como veréis todos están comentados (Con una "#" delante), lo que hará que no las tome en consideración y no use esos scripts, sin embargo, al final hay una opción que está activada y hará que use los script de manera automática.

#
# Enable all simple zero-configuration auto modules
# This option enables all simple modules (listed below) without requiring
# the user to enable each module individually
#
# List of modules which can be automatically enabled with this setting are:
#
# ac97-powersave
# cpufreq
# dpms-standby
# eee-superhe
# ethernet
# exec-commands
# hal-polling
# hdparm
# intel-hda-powersave
# intel-sata-powermgmt
# nmi-watchdog
# runtime-pm
# sched-mc-power-savings
# sched-smt-power-savings
# terminal-blanking
# usb-autosuspend
# wireless-ipw-power
# wireless-iwl-power
# wireless-power
#
# Set this to 1 to enable all simple zero-configuration auto modules listed above.
#
# NOTE: You can explicitly enable/disable any of the above modules by changing their
# values in the individual settings file
#
ENABLE_AUTO_MODULES=1

Eso significa que usará  los módulos que hay en /etc/laptop-mode/conf.d/ de manera automática según el estado y eventos que proporcione el PC.

Podemos guardar el archivo y cerrarlo.



Configuración de la retroiluminación:

Una de las cosas  que más consume es la retroiluminación de la pantalla (no confundir con el brillo de los colores)


Si vuestro PC no baja el brillo de la pantalla de forma automática podemos empezar a modificando el archivo  "/etc/laptop-mode/conf.d/lcd-brightness.conf

Pero antes habría que desactivar algunas cosas que entran en conflicto desde mi punto de vista con la aplicación.

Tenemos que ir a las opciones de energía del portátil pinchando sobre el icono de batería y dando a "Preferencias", pinchar en la pestaña "reducir brillo de "


Dejar desactivado los siguientes valores:

-Reducir la velocidad de retoación de los discos cuando sea posible.
-Reducir el brillo de fondo
-Atenuar la pantalla cuando está inactiva.

Aceptamos.

Ahora toca averiguar cual es la retroiluminación máxima que soporta vuestra pantalla.

Para verlo hacemos un:
scorpyomint@pc-citomint ~ $ cat /sys/class/backlight/acpi_video0/max_brightness


A mi me arroja el valor "7"

Así que ya sé, que mi valor máximo de retroiluminación de pantalla es 7 y el mínimo será 1.

Para comprobar si lo que vamos a hacer a continuación funcionará, debemos hacer un pequeño test a ver si la retroiluminación de la pantalla cambia con la siguiente orden:

Ponemos el brillo al máximo (en mi caso el 7 es el valor máximo):


scorpyomint@pc-citomint ~ $ sudo echo "7" > /sys/class/backlight/acpi_video0/brightness

Y luego hacemos al revez, lo bajamos:

scorpyomint@pc-citomint ~ $ sudo echo "2" > /sys/class/backlight/acpi_video0/brightness

Si eso ha funcionado, ya podemos configurar el script para que lo haga de forma automática cada vez que saquemos el cable del portátil y estemos trabajando en modo batería.

scorpyomint@pc-citomint ~ $ sudo pluma /etc/laptop-mode/conf.d/lcd-brightness.conf

Dejar la configuración de la siguiente manera:

-Para que se active este escript:
CONTROL_BRIGHTNESS=1

-Valor para la retroiluminación en modo batería, yo le puse un "2":
BATT_BRIGHTNESS_COMMAND="echo 2"

-Valor  para el retroiluminación en modo portatil con el cable, yo lo puse al máximo que me permite:
LM_AC_BRIGHTNESS_COMMAND="echo 7"

-Valor  para el retroiluminación en modo "no portatil" con el cable, yo lo puse al máximo que me permite:
NOLM_AC_BRIGHTNESS_COMMAND="echo 7"

-Archivo que debe modificar para poder corregir el valor del brillo.
BRIGHTNESS_OUTPUT="/sys/class/backlight/acpi_video0/brightness"

Bueno, con eso ya hemos arreglado el problema del brillo.

Para comprobarlo solo tenemos que guardar, arrancar el demonio laptop y comprobar enchufando y desenchufando el portatil de la toma de corriente.

scorpyomint@pc-citomint ~ $ sudo service laptop-mode start



Configurando el consumo de la tarjeta gráfica

 La siguiente información solo lo he probado con tarjetas Ati, y no sé como resultará en tarjetas de otro tipo.
 
Primero tenemos que ver el consumo actual de la tarjeta, para verlo tenemos que ser root:

scorpyomint@pc-citomint ~ $ sudo su

Una vez logueados como root miramos el consumo actual con:

pc-citomint scorpyomint #  cat /sys/kernel/debug/dri/0/radeon_pm_info
Si la carpeta debug está vacía hay que montarla:

pc-citomint scorpyomint # mount -t debugfs none /sys/kernel/debug

Y ahora que está montado probamos de nuevo...
 
Yo obtengo lo siguiente:
default engine clock: 680000 kHz
current engine clock: 678370 kHz
default memory clock: 800000 kHz
current memory clock: 796500 kHz
voltage: 1200 mV
PCIE lanes: 16

Ahora comprobaremos cual es el estado de agresividad de la tarjeta:

pc-citomint scorpyomint # cat /sys/class/drm/card0/device/power_profile
default

Como veis yo lo tengo "por defecto" pero podemos cambiar los valores entre los siguientes:

"default" > Por defecto.
"hight" > Maxima potencia
"mid" > Potencia equilibrada bajo demanda (no siempre funciona)
"low" > La menor potencia admitida.
Para modificar el valor, por ejemplo al mínimo, podemos hacerlo así:
pc-citomint scorpyomint # echo "low"> /sys/class/drm/card0/device/power_profile


Ahora si volvemos a comprobar los valores de la tarjeta veremos como ha respondido:
pc-citomint scorpyomint # cat /sys/kernel/debug/dri/0/radeon_pm_info
default engine clock: 680000 kHz
current engine clock: 219370 kHz
default memory clock: 800000 kHz
current memory clock: 299250 kHz
voltage: 950 mV
PCIE lanes: 16
Fijaros como los valors han cambiado, ahora muestra los "current" mucho más bajos que los estandares "default".
Además, el voltaje es inferior, con lo que se ahorra energía, y como se calienta menos, el ventilador no salta, y por tanto consume aún menos.

Ahora toca la parte de hacer que se ejecute el comando colocando el perfil de "low" cada vez que el portátil esté en modo batería y que lo restablezca a "default" cuando está conectado a la corriente.

Primero paramos el demonio para evitar problemas:
pc-citomint scorpyomint # service laptop-mode stop

Y ahora a modificar el archivo que compete:

pc-citomint scorpyomint # pluma /etc/laptop-mode/conf.d/exec-commands.conf

Modificamos las primeras líneas de comando de esto:

BATT_EXEC_COMMAND_0="" # Enable power saving feature 0 here
LM_AC_EXEC_COMMAND_0="" # Enable power saving feature 0 here
NOLM_AC_EXEC_COMMAND_0="" # Disable power saving feature 0 here

A esto otro:

BATT_EXEC_COMMAND_0="echo low > /sys/class/drm/card0/device/power_profile"
LM_AC_EXEC_COMMAND_0="" # Enable power saving feature 0 here
NOLM_AC_EXEC_COMMAND_0="echo default > /sys/class/drm/card0/device/power_profile"

De esta manera cuando esté en modo batería pondrá la tarjeta en "low" y cuando esté con la corriente la pondrá en "default"

Reiniciamos el demonio:
pc-citomint scorpyomint # service laptop-mode start

Y cerramos la seción de root:
pc-citomint scorpyomint # exit



Velocidad de reloj CPU   

Otro de los scripts que podemos modificar es el de la velocidad de reloj de la CPU.

Antes de nada, podemos comprobar en que estado están las CPU en modo batería y en modo AC (conectado a la corriente) con el siguiente comando filtramos la salida de "cpufreq-info" para ver el estado de cada cpu.

scorpyomint@pc-citomint ~ $ sudo cpufreq-info | grep "The governor" | nl
     1                      The governor "ondemand" may decide which speed to use
     2                      The governor "ondemand" may decide which speed to use
     3                      The governor "ondemand" may decide which speed to use
     4                      The governor "ondemand" may decide which speed to use

Como veis, mis procesadores están bajo demanda "ondemand" cuando está conectado a la corriente.
Pero resulta, que estando en modo batería están exactamente igual, es decir, en el archivo de configuración de laptop está configurado así para los dos estados.... cosa que no quiero y voy a cambiar.
Paso a explicar:

Abrimos una terminal y abrimos el script así: 
scorpyomint@pc-citomint ~ $ sudo pluma /etc/laptop-mode/conf.d/cpufreq.conf

Ahora buscamos el apartado en el que pone esto:
BATT_CPU_MAXFREQ=fastest
BATT_CPU_MINFREQ=slowest
BATT_CPU_GOVERNOR=ondemand

Las dos primeras líneas son para la velocidad máxima y mínima de trabajo, así está configurada como la más rápida y la mas lenta permitidas.

Pero el valor de "GOVERNOR" es la forma de controlar las CPU y en este caso, si os fijáis está bajo demanda "ondemand"

Así que lo pongo en "powersave", trabajando de esta forma a la velocidad mínima permitida, sin posibilidad de escalar la velocidad.

BATT_CPU_MAXFREQ=fastest
BATT_CPU_MINFREQ=slowest
BATT_CPU_GOVERNOR=powersave

Algunos de los valores permitidos son:

-performance
El regulador de rendimiento esta empotrado en el núcleo y hace que las UCP funcionen a la máxima velocidad de reloj

-ondemand (por defecto)
Incrementa o decrementa lavelocidad de las CPU dependiendo de la carga de trabajo.
-conservative
Es como ondemand, con la diferencia de que es más conservador (los cambios de velocidad son más suaves)

-powersave
Hace que la CPU vaya a la velodidad mímina especificada en la linea con el valor del mínimo. (BATT_CPU_MINFREQ=slowest), en este caso el valor mínimo soportado.

Ponéis el que os parezca tanto para modo batería como para modo AC y luego guardáis.

Y probáis de nuevo a conecta y desconectar el cable comprobando el antes y el después con el comando anterior:



Con cable:

scorpyomint@pc-citomint ~ $ sudo cpufreq-info | grep "The governor" | nl
     1                      The governor "ondemand" may decide which speed to use
     2                      The governor "ondemand" may decide which speed to use
     3                      The governor "ondemand" may decide which speed to use
     4                      The governor "ondemand" may decide which speed to use
 
 
 
 Sin cable:
scorpyomint@pc-citomint ~ $ sudo cpufreq-info | grep "The governor" | nl
     1                      The governor "powersave" may decide which speed to use
     2                      The governor "powersave" may decide which speed to use
     3                      The governor "powersave" may decide which speed to use
     4                      The governor "powersave" may decide which speed to use
-----------

Creo, que esto es lo más importante, pero podéis revisar el resto de los scripts para comprobar sus opciones para ver en que más se puede mejorar.

Siempre podemos añadir más cosas, como que quite los efectos de escritorio y los retorne al conectar el cable, apague el bluetooth, la tarjeta de red... etc etc.

Así ha quedado más o menos mi sistema:



Un saludo y ya me contáis.

No hay comentarios:

Publicar un comentario

Deja aquí tu mensaje...