En estos días me toco recuperar mi VPS vía consola remota, al revisar el /var/log/messages me di cuenta de el Out of Memory Killer (OOM Killer) había hecho de las suyas al quedarse sin memoria. Luego de analizar detenidamente los logs y me di cuenta que fue una combinación de factores, Google, Yahoo y Yandex me estaban indexando tanto este blog como unos foros de autos que alojo en este servidor al mismo tiempo.

El script para descargar torrents estaba corriendo al igual que el torrent tracker y alguien me estaba haciendo flood vía IRC en freenode puede había dejado irssi conectado.

El OOM Killer tiene un algoritmo que decide que procesos son los mejores para aniquilar sin embargo es posible manipular estos valores y dejarle saber al OOM Killer que procesos prefieres que mate primero. Para automatizar esta tarea hice un script que nos ayudara con esta tarea:

for programas in SCREEN irssi top
  do for pid_of_oomk_candidate in `pidof -x $programas`
    do echo 10 > /proc/$pid_of_oomk_candidate/oom_adj
    done
 done

Como ven el script anterior agrega 10 al OOMK score a los procesos que menos me interesan permanezcan vivos cuando me quede sin memoria mientras que el siguiente hará exactamente lo contrario, mantendrá vivo un poco mas estos procesos:

for programas in mysqld portsentry iptables
  do for pid_of_oomk_candidate in `pidof -x $programas`
    do echo -5 > /proc/$pid_of_oomk_candidate/oom_adj
  done
done

echo -17 > /proc/`pidof -s sshd`/oom_adj

En este ultimo mysql portsentry y iptables tendrán cinco puntos de ventaja en relación con el resto de los candidatos y si se fijan en la ultima linea estamos asegurándonos que sshd no sea candidato bajo ninguna circunstancia.


Automatizar el ajuste del score para el OOM Killer

Ahora unifiquemos estos dos scripts y demosle un poco mas de flexibilidad, estoy seguro que hay gente que prefiere asignarle a irssi un valor distinto de screen. Lo primero que necesitaremos es un script de configuración, vamos crearlo en /etc/candidatos_oomk.conf y el contenido se debería de ver algo así:

# Programas que queremos sacrificar, entre mas alto el valor
# mas peso tienen en la lista de candidatos.
irssi 4
SCREEN 3
smtpd 2
apache2 1

# Programas que queremos salvar, estos tendrán valores negativos
portsentry -2
mysqld -5
sshd -17

El script al que le puse de nombre oomk_adj_candidatos.sh se veria algo asi:

#!/bin/bash
CONFIGURACION="/etc/candidatos_oomk.conf"
while read programas
  do  proceso=`echo $programas |grep -v \# | grep [0-9]$| awk '{print $1}'`
  ajuste=`echo $programas |grep -v \# | grep [0-9]$| awk '{print $2}'`
  if [ -z "$proceso" ] then
    continue
  else
    echo $proceso
    for pids_proceso in `/bin/pidof $proceso`
      do echo "    echo $ajuste > /proc/$pids_proceso/oom_adj"
    done
  fi done < $CONFIGURACION

El script es simple, leemos el archivo de configuracion linea por linea separamos el nombre del proceso del ajuste que le vamos a hacer guardando cada valor en las variables $proceso y $ajuste. Evaluamos si la variable $proceso esta vacía, y de ser así seguimos con la próxima linea, de lo contrario continuamos procesando esa misma linea. Obtenemos el PID del proceso usando pidof y para cada PID vamos escribir el valor de $ajuste en su archivo oom_adj dentro de /proc.

Pueden colocar este script en su /etc/rc.local o en un cronjob y recuerden que si quieren consultar la lista de candidatos y ver como están sus scrores o saber un poco mas del tema, pueden consultar este articulo: El OOM Killer y manipulación de candidatos.

Desde hace algunos años la tecnología de virtualización cada vez toma más auge. Muchas personas contratan servicios de VPS porque pueden tener todas las ventajas de administración de un root por un precio muy bajo. No todo es bueno, ya que con la tecnología de virtualización se pierden recursos, ya que estos están limitados (Memoria, CPU, Disco), ya que el servidor físico puede ser compartido por innumerables servidores virtuales (y compiten recursos de la misma, como es el caso de OpenVZ).

La configuración que viene por defecto del MySQL en la mayoría de las distribuciones de GNU/Linux trae parámetros por defecto para servidores físicos, al instalarse en un VPS, el mismo, si no se le hace una buena afinación podría colapsar. Me sucedió recientemente que el MySQL que trae por defecto Debian Wheezy si se generan varias instancias cuelga a un VPS de 512 MB de RAM. Para poder generar los ajustes, conseguí una herramienta que aliaza el rendimiento llamada Tuning-Primer , de Matthew Montgomery, un pequeño script en bash que te da consejos para establecer algunas variables de la configuración, basándose en los parametros que proporciona el servidor.

Su instalación es sumamente sencillo, solo requiere que tengamos un usuario/password en la base de datos y el programa bc instalado:

# wget http://www.day32.com/MySQL/tuning-primer.sh
# chmod u+x tuning-primer.sh
# ./tuning-primer.sh

Un ejemplo del reporte de esta herramienta es la siguiente:

— MYSQL PERFORMANCE TUNING PRIMER —
– By: Matthew Montgomery –

MySQL Version 5.5.24-4 x86_64

Uptime = 0 days 12 hrs 17 min 4 sec
Avg. qps = 0
Total Questions = 22445
Threads Connected = 1

Warning: Server has not been running for at least 48hrs.
It may not be safe to use these recommendations

To find out more information on how each of these
runtime variables effects performance visit:
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html
Visit http://www.mysql.com/products/enterprise/advisors.html
for info about MySQL’s Enterprise Monitoring and Advisory Service

SLOW QUERIES
The slow query log is NOT enabled.
Current long_query_time = 10.000000 sec.
You have 0 out of 22466 that take longer than 10.000000 sec. to complete
Your long_query_time seems to be fine

BINARY UPDATE LOG
The binary update log is NOT enabled.
You will not be able to do point in time recovery
See http://dev.mysql.com/doc/refman/5.5/en/point-in-time-recovery.html

WORKER THREADS
Current thread_cache_size = 8
Current threads_cached = 1
Current threads_per_sec = 0
Historic threads_per_sec = 0
Your thread_cache_size is fine

MAX CONNECTIONS
Current max_connections = 128
Current threads_connected = 1
Historic max_used_connections = 2
The number of used connections is 1% of the configured maximum.
You are using less than 10% of your configured max_connections.
Lowering max_connections could help to avoid an over-allocation of memory
See “MEMORY USAGE” section to make sure you are not over-allocating

INNODB STATUS
Current InnoDB index space = 0 bytes
Current InnoDB data space = 0 bytes
Current InnoDB buffer pool free = 98 %
Current innodb_buffer_pool_size = 128 M
Depending on how much space your innodb indexes take up it may be safe
to increase this value to up to 2 / 3 of total system memory

MEMORY USAGE
Max Memory Ever Allocated : 173 M
Configured Max Per-thread Buffers : 344 M
Configured Max Global Buffers : 168 M
Configured Max Memory Limit : 512 M
Physical Memory : 496 M

Max memory limit exceeds 90% of physical memory

KEY BUFFER
Current MyISAM index space = 9 M
Current key_buffer_size = 16 M
Key cache miss rate is 1 : 158
Key buffer free ratio = 67 %
Your key_buffer_size seems to be fine

QUERY CACHE
Query cache is enabled
Current query_cache_size = 8 M
Current query_cache_used = 3 M
Current query_cache_limit = 1 M
Current Query cache Memory fill ratio = 48.41 %
Current query_cache_min_res_unit = 4 K
MySQL won’t cache query results that are larger than query_cache_limit in size

SORT OPERATIONS
Current sort_buffer_size = 2 M
Current read_rnd_buffer_size = 256 K
Sort buffer seems to be fine

JOINS
Current join_buffer_size = 132.00 K
You have had 0 queries where a join could not use an index properly
Your joins seem to be using indexes properly

OPEN FILES LIMIT
Current open_files_limit = 65562 files
The open_files_limit should typically be set to at least 2x-3x
that of table_cache if you have heavy MyISAM usage.
Your open_files_limit value seems to be fine

TABLE CACHE
Current table_open_cache = 32712 tables
Current table_definition_cache = 400 tables
You have a total of 101 tables
You have 101 open tables.
The table_cache value seems to be fine

TEMP TABLES
Current max_heap_table_size = 16 M
Current tmp_table_size = 32 M
Of 1117 temp tables, 30% were created on disk
Effective in-memory tmp_table_size is limited to max_heap_table_size.
Perhaps you should increase your tmp_table_size and/or max_heap_table_size
to reduce the number of disk-based temporary tables
Note! BLOB and TEXT columns are not allow in memory tables.
If you are using these columns raising these values might not impact your
ratio of on disk temp tables.

TABLE SCANS
Current read_buffer_size = 128 K
Current table scan ratio = 17 : 1
read_buffer_size seems to be fine

TABLE LOCKING
Current Lock Wait ratio = 0 : 22724
Your table locking seems to be fine

Por ejemplo, yo para un VPS con 512 de RAM (que corre únicamente MySQL) usé la siguiente configuración en el /etc/mysql/my.cnf

max_connections=128
wait_timeout=30
thread_cache_size=8
table_cache=32712
key_buffer_size=16M
query-cache-type=1
query_cache_size=8M
tmp_table_size=32M

Esta herramienta es más efectiva si se correo luego de tener más de 48 horas prestando servicio. Si se logra optimizar el MySQL en un VPS se puede lograr aprovechar el máximo de los recursos sin temer que en algún momento pueda dejar de prestar servicios.

Mas de una vez he intenten ejecutar sl cuando intentan ejecutar ls para listar archivos y directorios, es un error que todos cometemos pero ¿que pasaria si sl en realidad fuese un comando?. Afortunadamente para nuestro entretenimiento hay una aplicación de nombre sl y consiste en un tren ascii que sale en el terminal cada vez al momento de ejecutar sl. Perfecto para una broma practica, instalarlo en un servidor que muchas personas usan y esperar a escuchar los cuentos.

Aquí les dejo un video que muestra como instalarlo y como se ve al momento de ejecutarlo.


En caso de que no puedas ver el video, puedes instalar esta aplicación ejecutando:

su - yum install -y sl

Como ven es inofensivo, o por lo menos menos inofensivo que un ualias a rm -Rf /*, de hecho un compañero de trabajo fue el que me comento sobre esta broma practica. La aplicación sl esta disponible para OSX a través del manejador de paquetes brew.

Hace aproximadamente unas 9 semanas me enteré que la gente de Instagramers Venezuela estaba participando en ExpoLado-B, un nuevo concepto destinado a exponer lo mejor del talento creativo y decidí participar. Luego me entero que una de las fotografías que había puesto a concursar fue seleccionada entre unas 1100 fotos, con un total de 20 fotos de Latinoamericanos y Iberoamericanos. Recuerdo que estaba almorzando y quedé totalmente frío, nunca había ganado algún concurso en mi vida.

Fotografía seleccionada para al ExpoLado-B. Exceso.

La exposición se realizó el 17/18/19 de Junio 2012 en el Centro Cultural de Chacao, Caracas. Asistí a la inauguración, realmente estuvo todo muy bien organizado. Les dejo algunas fotos del evento (tomadas y bajo Copyright 2012 por Consuelo Di Carlo):

Más fotografías disponibles en: http://instagramersvenezuela.com/ladobsociales

Para todos los que utilizan LibreOffice como su aplicación ofimática principal, pueden descargar la nueva versión que se encuentra disponible la 3.5.5 y lista para su uso.

Para realizar la descarga se dirigen a su página principal aquí, en la sección de descargas aquí y allí podrán escoger el paquete a descargar de acuerdo al idioma que prefieran (y la plataforma). La aplicación esta predeterminada en Ingles, por lo que si seleccionan otro idioma, podrán descargar tanto los paquetes de ayuda como de lenguaje.

Para los que tengan dudas de su instalación pueden visitar el blog Bits de Conocimientos y allí encontraran las ayudas para la instalación de la aplicación (aquí) y para la instalación de la ayuda y el lenguaje (aquí).



Tengo que decir que de las 4 semanas pasadas, los últimos días en Nicaragua han sido de lo mejor. Un gran equipo local, demasiados Debianitas de todo el mundo y una buena cantidad de cerve^W comida local han hecho de esta, la Debconf12 una experiencia excelente.

Pude conocer a Thomas (mi sponsor y compañero en el phpunit-team) y empaquetar una nueva versión de phpunit-selenium, colaboré un poco en el Front Desk y estuve en el videoteam trabajando con h01ger.

Ya hay muchos posts hablando de la conferencia, así que sólo dire: Mil gracias localteam (de todos los que pude despedirme y de los que no) y nos vemos en la Debconf13 en Suiza

Uno de los juegos mas clásicos es el de Príncipe de Persia, de hecho fue uno de los que mas jugué cuando era chamo.

Hoy encontré como jugarlo de nuevo usando el emulador de DOS DOSBox. Este emulador esta optimizado para videojuegos que en un principio fueron diseñados para correr sobre MS-DOS y esto es justo lo que estamos buscando. Aproveche y les hice un vídeo de menos de 3 minutos que les explica como instalarlo, aquí se los dejo.

En caso de que no hayan captado algunos detalles en el vídeo cree un grupo de secuencias de comandos que les ayudara a dejar corriendo el juego Prince of Persia en Fedora, en mi caso estoy usando Fedora 17.

Esta seria la primera secuencia de comandos para dejar Prince of Persia instalado en nuestro Fedora.

su -
yum install dosbox -y
exit
mkdir ~/games
firefox http://www.bestoldgames.net/eng/old-games/prince-of-persia.php

Como ven lo que estamos haciendo es instalando DOSBox, creando un directorio donde tendremos nuestro juegos y abriendo FireFox en la pagina para descargar el juego como tal. Una vez en la pagina, descargamos el juego, lo copiamos a la carpeta ~/games y lo descomprimimos.

cp ~/prince*zip ~/games
cd ~/games
unzip ~/prince*zip
rm ~/prince*zip

Ahora vamos a arrancar DOSBox y una vez dentro del emulador vamos a montar ~/games como si fuese la unidad C y arrancamos el juego.

Recuerde remplazar /home/usuario/games por la ruta completa a su directorio home.

En la República Bolivariana de Venezuela o estas con Chavez o te mueres de hambre.

Desde que inicie este blog jure evitar hablar de política y voy a hacer lo posible por mantenerlo así pero hoy vi algo que al principio no supe si reír o llorar, lo cierto fue que me dio pena ajena. Por mucho que traten de convencernos de que "Venezuela ahora es de todos", debes tener cierta tendencia política para poder conseguir empleo, para muestra les dejo esta captura de pantalla.

Una muestra de la discriminación politica en Venezuela. Tomado de la plataforma colaborativa colabora.softwarelibre.gob.ve

Esto explica el por que no hay gente técnicamente calificada atendiendo la infraestructura de la nación, la Internet falla, el sistema eléctrico claramente no esta a la altura de una nación perteneciente a la OPEP y la producción petrolera ha caído, el sistema de salud esta lo suficientemente mal para que el actual mandatario se vaya a tratar a otros países.

No es solo la inclinación política, esta oferta de trabajo claramente discrimina por edad y genero. Una oferta como esta en países desarrollados (donde el sistema judicial si funciona) no duraría mucho antes de una demanda civil.

La URL de esta oferta de trabajo es http://colabora.softwarelibre.gob.ve/home/oferta-laboral y se promociona por Facebook y Twitter como se puede ver en este tweet:


Esta captura de pantalla es del 3 de agosto del 2014, meses después de la nefasta oferta de trabajo mencionada anteriormente, como ven no ha cambiado en nada, Eduardo José Zambrano Rivero claramente dice que no aceptaran a aquellos que hallan ejercido su derecho a firmar en un referéndum consultivo en un grupo de discusion de Software Libre.

Eduardo José. Zambrano Rivero. Telefono 58 + 0416/9798109

Si tienen algún comentario para el Sr. Jose Rivero pueden dejárselo saber por las vias de comunicación mencionadas en la captura de pantalla.

I am transitioning GPG keys from an old 1024-bit DSA (0x34BCCD04) key to a new 4096-bit RSA key (0x82871FC0). The old key will continue to be valid for some time, but I prefer all new correspondance to be encrypted in the new key, and will be making all signatures going forward with the new key.

My new GPG key transition document is available at: http://apostols.net/key-transition.txt.asc.

Cheers,