miércoles, 2 de septiembre de 2009

Powertop: Ahorro de batería en GNU/Linux

Cada día aparecen nuevos portátiles que prometen una duración de la batería mayor de 5 horas. La verdad es que muchas veces dan tentaciones de comprar uno de esos portátiles, especialmente si viajamos mucho. Sin embargo, todavía podemos exprimir un poco la duración de la batería de nuestro portátil si optimizamos la configuración del sistema operativo GNU/Linux. La herramienta que nos puede ayudar en esta tarea es Powertop.

Powertop es una aplicación diseñada por Intel, de aspecto similar al comando top de GNU/Linux, y que nos proporciona información sobre el consumo eléctrico de los módulos del kernel o programas que se están ejecutando en ese momento. Pero además, Powertop nos ofrece valiosas sugerencias para intentar optimizar al máximo el consumo eléctrico del ordenador.


Hay varias consideraciones a tener en cuenta cuando intentamos mejorar la duración de la batería:
  • Dar el menor brillo posible al monitor
  • Desactivar todos los dispositivos de hardware que no estemos utilizando: bluetooth, tarjeta wireless, dispositivos USB, etc.
  • Para los procesadores que cambian de frecuencia al vuelo, es decir, practicamente todos los actuales, intentar que la frecuencia sea siempre la menor posible. La frecuencia del procesador se puede verificar en la parte superior derecha de Powertop o utilizando alguna aplicación específica como osdcpufreq. La mejor forma de asegurarnoslo es usando los "scaling governor" del procesador conservative u ondemand. Ejemplo:
# modprobe acpi-cpufreq cpufreq_conservative
# echo conservative > /sys/devices/system/cpu/cpu/cpufreq/scaling_governor
  • Habilitar el soporte HPET en la BIOS del portátil y/o forzar al kernel a usarlo. Para forzar al kernel a usar el HPET debemos modificar el fichero /boot/grub/menu.lst añadiendo la opción hpet=force a nuestro kernel (será necesario reiniciar para que los cambios tengan efecto):
kernel /boot/vmlinuz26 root=/dev/sda2 ro vga=0x317 hpet=force
  • Para comprobar que HPET está siendo utilizado, podemos ejecutar el siguiente comando:
# dmesg | grep -i hpet
Kernel command line: root=/dev/sda2 ro vga=0x317 hpet=force
pci 0000:00:1f.0: Force enabled HPET at 0xfed00000
hpet clockevent registered
HPET: 3 timers in total, 0 timers will be used for per-cpu timer
rtc0: alarms up to one month, y3k, 114 bytes nvram, hpet irqs
  • Añadir pequeñas optimizaciones que nos va sugiriendo Powertop. En mi caso he añadido estas modificaciones al fichero /etc/rc.local para asegurarme que siempre se ejecutan al inicio del sistema operativo:
ethtool -s eth0 wol d
echo 1500 > /proc/sys/vm/dirty_writeback_centisecs

  • Finalmente, debemos intentar ejecutar únicamente el software requerido en cada momento. Por ejemplo, en mi caso, cuando voy de viaje y estoy viendo una película, no necesito tener ejecutándose PostgreSQL (que consume mucha corriente), el servidor HTTP o FTP, o incluso la barra de tareas lxpanel, así que me he creado un sencillo script para dejar de ejecutar esos programas cuando no los necesito.
Una vez que el sistema operativo esté optimizado para ahorrar batería veréis como el valor Wakeups-from-idle per second en Powertop disminuye notablemente y, por lo tanto, aumenta la duración de la batería.

Para más información sobre cómo ahorrar batería, os dejo estos enlaces:

viernes, 3 de julio de 2009

División de String en palabras con Java

Una de las tareas habituales en el mundo de la programación es el manejo de cadenas de caracteres (String). En este post os muestro una forma muy fácil de dividir Strings en palabras gracias a la clase StringTokenizer del paquete java.util de Java.
Observa el siguiente fragmento de código:

public List<Period> getPeriods(String strPeriodIds) {
List
<Period> periods = new ArrayList<Period>();
StringTokenizer st = new StringTokenizer(StringUtils.deleteWhitespace(strPeriodIds), ",");
while (st.hasMoreTokens()) {
periods.add(this.getPeriod(st.nextToken()));
}
return periods;
}
el método getPeriods() recibe un String que contiene un listado separado por comas de "Identificadores de Periodo"; ejemplo: "primero,segundo,tercero". El objetivo del método es devolver un List con los objetos de todos esos identificadores de periodos.

Observa cómo se construye el objeto st de la clase StringTokenizer. Su constructor recibe como parámetros:
  • El String que queremos dividir (Al que se le eliminan previamente todos los espacios en blanco)
  • El String por el que dividiremos en palabras, en este caso una coma "," (pero en otros casos puede que sean espacios en blanco " ")
La forma en la que se recorren todos los "trozos" de String (Tokens) es muy parecida al conocido patrón del Iterador.