Mostrando entradas con la etiqueta trabajo. Mostrar todas las entradas
Mostrando entradas con la etiqueta trabajo. Mostrar todas las entradas

martes, octubre 30, 2012

Movimientos empresariales interesantes

Desde hace un par de meses se rumoreaba que compraban/vendían la empresa donde curro (no es lo mismo decir comprar que vender, en tiempos de crisis tiene connotaciones diferentes). En fin, la semana pasada se hizo oficial el principio de acuerdo entre un fondo de inversión alemán y la corporación para la venta de la división española, con lo que hay cierta inquietud, la gente no es tonta.

El temor de los compañeros (y mio) viene motivado por el desconocimiento de los planes que tienen los alemanes. Una postura cómoda es esperar y verlas venir, pero soy delegado sindical, con lo que no es viable esa postura, teniendo que tomar una actitud mucho más activa.

Decía un dicho chino 'Ojalá te toque vivir tiempos interesantes'. No sé si el dicho no es más que una maldición camuflada.

miércoles, agosto 01, 2012

Trabajos del presente

Parafraseando a Michael Corleone: Si hay algo que nos ha enseñado este siglo, es que cualquier tipo de trabajo se puede automatizar. Lo pensé mientras comía en el curro.

domingo, enero 29, 2012

Sesión suspendida

El devenir de la semana ha sido difícil por culpa del trabajo aunque las habré tenido peores en relación al volumen del trabajo. La diferencia ha estado en que esta semana me ha dejado exhausto, sin fuerzas para centrarme en la partida. Lo que ha influido negativamente en la preparación de la tercera sesión de la mini experiencia de master. Por ello, suspendí la sesión y derivamos la tarde a remorar anteriores campañas de juego. Es curioso, que sin jugar, ha servido para desconectar.

lunes, enero 18, 2010

7-0

Se puede decir que he tenido una guardia tranquila. Ninguna llamada durante la semana. El resultado del partido da muestras de ello.

viernes, enero 01, 2010

Una pequeña aplicación

Desde hace algo más de cuatro meses estoy enfrascado en una tarea interesante que tengo que hacer en el trabajo. Se trata de hacer que las alarmas de todo tipo de aparatos hardware (cabinas de discos, chasis blade de virtualización, librerías de cintas, SAIs, electrónica de red, balanceadores) estén integradas en el Nagios.

Nagios es la aplicación que utilizamos para monitorizar las aplicaciones y que nos martiriza avisa cuando hay algún problema.

A bote pronto la cantidad y variedad de chismes que tenemos es grande, con lo que la tarea puede ser abrumadora:
  • Cabinas de disco NetApp y SGI.
  • Balanceadores Alteon y BipIP.
  • Electrónica de red Cisco, HP y MRW.
  • Switches de fibra Brocade.
  • Chasis Blade de Egenera y HP.
  • Virtualización PrimeQuest de Futjisu.
  • Librerias de cintas virtuales CentricStor de Fujitsu.
  • SAIs Merling-Gerin, Riello y APC.
Todos estos aparatos tienen en su interior un agente, que implementa el protocolo SNMP, encargado de notificar mediante traps (mensajes especiales SNMP) determinados sucesos. En el caso de un switch cisco un suceso puede ser la desconexión de un cable de red y para una cabina de disco puede ser el fallo de uno de sus discos. Esto incrementa la complejidad, ya que no solo hay que tratar con muchos aparatos, sino que estos pueden notificar cualquier cosa que les venga en gana.

La forma de implementar una sistema que recoja los traps y que los transforme en alarmas para el nagios se basa en aprovechar varios demonios -no hay que reinventar la rueda- llamados snmptrapd y nsca.

El primero, snmptrapd, es una aplicación que recoge las notificaciones que les envian los agentes y que segun sea esa notificación puede ejecutar un script -manager-. Se puede hacer que el script manager sea genérico, es decir que sea invocado ante cualquier trap, o que sea determinado según sea el trap recibido.

La lógica de los managers es bastante sencilla. Primero recoge el OID del trap, que es un identificador de la notificación. Cada trap diferente tendrá un OID distinto. Luego tratará los parámetros del trap. Como existen parámetros comunes a todos los traps y otros especificos, el manager se encarga de saber que parametros recoger y qué hacer con ellos.

Por último, la lógica del trap determinara como notificar al Nagios del problema. Para ello se sirve del otro demonio llamado nsca, que no es más que un sistema para enviar mensajes al Nagios con el nombre del servicio, una gravedad del problema y listo.

Hasta el momento, mi implementación consistía en realizar un manager en bash por cada tipo de sistema hardware a monitorizar. De esa forma tengo un manager para cabinas de disco Netapp, otro para los chasis blade de Egenera, etc. Y un manager general para guardar en un log todas las notificaciones.

Una de las parte más complicadas es averiguar cuales son los traps que suponen que existe un problema y cuales son aquellos que pueden indicar que el sistema ha vuelto a la normalidad. Para ello es indispensable disponer de la especificación de los MIBs del dispositivo. El mib contiene la relación de OIDs de los traps y variables del dispositivo.

Casi todos los dispositivos que disponen de un agente snmp, el fabricante ofrece el MIB del mismo, siendo posible entender sus problemas. De esa forma, la lógica del script se reduce al manejo de unas notificaciones y poco más.

Llegados a cierto punto, uno se da cuenta de que no puede estar creando script para cada tipo de dispositivo, sino que debe haber algo más general.

Lo primero es entender que el funcionamiento de un sistema de alerta para un dispositivo cualquier se basa en una maquina de estado con cuatro estados 'de notificación' distintos.
  • OK. El dispositivo esta funcionando correctamente. No hay problemas.
  • Warning. El dispositivo esta funcionando pero hay ciertas partes que tienen problemas y que es posible que hagan que el aparato deje de funcionar.
  • Critical. El aparato no esta funcionando bien. Existe algun problema que no le deja hacer su función.
  • Unknow. Algo le pasa pero no se sabe concretamente en que consiste o se desconoce el estado del funcionando del aparato.

Los traps que envia el agente snmp del aparato no hacen otra cosa que cambiar el estado de notificación. Si llega un trap 'de warning', el estado del dispositivo se pone Warning. Si es de Ok, entonces pasamos a Ok. Estos cambios de estados son independientes del estado anterior que pudiese tener el aparato.

Así que estoy empezando a hacer un programita que reuna el trabajo de configurar un manager y traducir sus estados de notificación a algo visual e incluso pueda notificar los cambios a terceros programas (nagios por ejemplo).

El programa tiene los siguientes componentes:
  • Manager general, instalado como manager 'default' del demonio snmptrapd, que guardará las notificaciones en una base de datos.
  • Manager despachador, que es el encargado de determinar que manager específico se tiene que ejecutar en función de la notificacion que ha llegado y del dispositivo que lo envia.
  • Cliente de estados que consulta la base de datos y muestra el estado de un dispositivo.
  • Cliente configurador de manager específicos que sirve para configurar la máquina de estados de notificación de un dispositivo.
La idea inicial era realizarlo en PHP (actualmente lo tengo realizado en Bash la parte de los managers), pero la parte de los clientes puede resultarme complicada, por ello esa parte la voy a realizar en Java. No he realizado nada serio en este lenguaje y tengo el gusanillo.

martes, noviembre 03, 2009

Día de I+D

Día productivo que me ha permitido descubrir tres nuevas cosas.

Por orden, tengo un ejemplo de uso del protocolo NDMP1 que me permitirá desarrollar un plugin para monitorizar clientes NDMP. Luego he visto como entrar en una librería de cintas para configurar su parte SNMP y por último he podido echarle un ojo a la implementación de la herramienta llamada JFFNMS.

No esta valorado emplear tiempo en averiguar cosas y descubrir ideas.

1 Protocolo de gestión de datos de red (del inglés Network Data Management Protocol).

lunes, agosto 03, 2009

rsync y dos puntos dos puntos

Por falta de licencias (dinero) del software de backup en el sistema propietario (cuestiones de alta política de los grandes Trutrus) que utilizamos en el trabajo, existen unos cuantos servidores que se quedan sin cliente de backup para que sean integrados con NetWorker, que es el producto que utilizamos.

Para ello, hemos ideado una serie de scripts un script que utiliza el rsync para hacer la labor del backup cuasi mágica. Las tareas para añadir un nuevo cliente 'rsync' quedan reducidas a configurar rsync en el servidor que queremos respaldar y agregar una nueva línea con el nombre del servidor en un fichero de nodos-clientes que mantiene la lista de todos los servidores de los que hacemos rsync.

La labor de este script es conectarse al servidor, recuperar su lista de saveset (modulos rsync) y traérselos a un volumen de datos de una SAN/SAS de NetApp. El secreto de que funcione todo bien esta en una línea que recupera el listado de saveset [rsync servidor::] y filtrarla con el comando sed. El script incluye funciones de log y notificaciones a nagios mediante nsca para cada saveset. La copia va a cinta utilizando el protocolo NDMP.

Es posible, sin mucha complicación, configurar el ancho de banda por saveset y el paralelismo del número de savesets simultáneos que se lanzan, con sólo tocar dos líneas y agregar un fichero de control con el número de rsyncs activos. El rsync tiende a consumir el máximo ancho de banda posible, así que seguro que me pedirán esa modificación. Es más este paralelismo, pude ser aplicado a nivel de grupo, manteniendo varias listas en función del ancho de banda para cada grupo (conjunto de servidores). Igualito que el software propietario que utilizamos.

Para la recuperación, nos traemos los datos al volumen de la netapp distinguiendo nombre del servidor y saveset concreto a recuperar, utilizando una única licencia de NetWorker para todos esos servidores.

La necesidad agudiza el ingenio.

lunes, julio 13, 2009

Workarounds o Ñapas

Aunque de toda la vida por estos lares se las ha llamado ñapas (chapucillas, apaños, arreglos), el término en ingles, workaround, pronunciado guorc-arraaummmm, queda más fino por aquello de la internacionalidad multilingüe.

Bien, como comentaba el otro día, en unos servidores del curro teníamos unos 'ligeros' problemas de memoria: El kernel no liberaba la memoria cache que utilizaba para uso propio, utilizando memoria de intercambio (muy costosa en uso por los tiempos de acceso) para los procesos. Pasado un tiempo, el sistema había consumido casi toda la memoria de intercambio, manteniendo ingentes cantidades de memoria cache, con el consiguiente problema de incremente de la entrada/salida y lentitud del sistema producto de los procesos de escritura en disco de la memoria swap.

La solución buena es compilar un kernel de una versión superior que no presente ese error, puesto que no existe un bugfix disponible. La solución 'workarround' es otra: Quitar la memoria de intercambio.

De esa forma, el kernel se ve obligado, cuando no tiene memoria libre, a liberar por cojones la memoria cache que el tan graciosamente se ha apropiado. Con un rápido 'swapoff -a', la memoria de intercambio pasa a la historia. Hice un programa, a modo de prueba de concepto, que consumía memoria a raudales (300 MB por instancia del mismo), lo lance en varias ejecuciones (10 simultaneamente, total 3 GB). Esto hizo, que el kernel entregara memoria cache para los programas en ejecuciones. No tenia más remedio.

Y aqui esta el 'pogama', llamado malloc.

# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>

int main (int argc, char *argv[]) {
int i=0;
int *puntero = NULL;
printf ("Reservando memoria con malloc\n");

while (i < 100000) {
printf ("Reservando bloque [%d] de 10k int (%d bytes)\r", i,
sizeof(int));
if ((puntero = malloc(sizeof(int)*10240)) == NULL) {
printf ("Alcanzada memoria maxima disponible para un
proceso en bloque %d\n", i);
printf ("Se termina de reservar memoria para el
proceso\n");
break;
}
i++;
}

printf ("Pulse Ctrl+z para retener memoria\n");
printf ("Pulse Ctrl+c para terminar ejecucion y liberar memoria\n");
pause ();

return 0;
}

viernes, julio 10, 2009

Bug 151916 - kernel memory leaks, memory cached never flushed

Durante años han estado unos seis servidores del curro con un problema bastante gordo de memoria. Esos servidores eran específicos de base de datos Oracle para unas aplicaciones de la consejería. Al ser aplicaciones muy especiales, el proveedor exigía conservar los soportes de RedHat Enterprise Linux 3 para x86_64 y Oracle 9-10. Impidiendo cualquier cambio a nivel de sistema operativo.

El problema consistía en que cuando se lanzaban las tareas de backup de base de datos con el RMAN de oracle, los equipos empezaban a tirar de memoria de intercambio, toda la que tuviera y más. Daba igual la cantidad de memoria física que tuviese. Ralentizando el proceso de copia de seguridad e incrementando la carga. Como era una tarea nocturna, el problema no afectaba a los usuarios, quedando latente y sólo saliendo a relucir de vez en cuando.

Así pasó el tiempo hasta que hace unos días, a uno de esos servidores se le pudo incrementar la RAM, que pasó de 4 GB a 8 GB. Creyendo que esa era la solución nos olvidamos nuevamente del problema.

Pero hijo mio, pasadas unas semanas vimos que pasaba igual. Así que esta vez me olvidé de todo lo que me habían contado y me puse manos a la obra con el vmstat. Este me decia que pese a tener 7 GB de memoria cache, el sistema operativo empezaba a tirar de swap. Cosa algo ilógica.

Linux asigna memoria para sus procesos y el resto, que queda libre, la usa para memoria cache (buffers de disco y otras cosas) tendiendo a utilizar toda la memoria RAM disponible. En el caso de que necesite más memoria para algún proceso, no tira de memoria de intercambio, sino que libera memoria cache y solo en el caso de que no tenga memoria cache (toda la memoria este siendo utilizado por procesos) es cuando empieza a utilizar la memoria de intercambio.

Tras lo cual, queda claro que el kernel no libera la memoria cache que consume.

Viendo esto y que ademas era una redhat antigua, con un kernel 2.4.21-20.ELsmp, me puse a mirar en san google posibles perdidas leves de orina memoria en el kernel. Bingo! El bug estaba ahí, tan bonito, esperando que alguien lo encontrase Bug 151916 - kernel memory leaks, memory cached never flushed en modo CLOSED WONTFIX desde el 23 de Marzo de 2005.

Ahora toca compilar un kernel más moderno o actualizar el sistema. En ambos casos, el proveedor se desentiende del soporte y se lava las manos, pero visto lo visto, el soporte que tanto se ha cuidado de poca ayuda ha servido. Es para darle a mas de uno con las matrices de compatibilidad y las licencias enterprise del software en la cara, si cuando pasa algo serio, no sirven de nada.

De hecho, creo que este problema influyó decisivamente en un proyecto de migración a una plataforma PrimeQuest de Fujitsu de todas esas máquinas. Un proyecto bastante caro por cierto y que también debe mantener la dichosa matrix de compatibilidad por exigencias del guión.

sábado, julio 04, 2009

Un año en Steria

Cumplí un año trabajando para Steria en el CICE. No hay quejas importantes aunque hay cosas que se puedan mejorar. El cambio desde El sendero a Steria ha sido para muchísimo mejor en todos los aspectos. Creo que acerté plenamente.

Y ahora mismo no me planteo migrar a otro lado. Es un síntoma de que estoy bien.

jueves, julio 02, 2009

Dos bugs solucionados

Dos errores me tenían fastidiado durante las últimas semanas a los que no encontraba solución. Uno se daba en la migración del cacti de una máquina a otra. El nuevo servidor de cacti no podía crear nuevos dispositivos, pese a que se mantenía la base de datos y el software de base. El problema fue causado por el propio script de migración (base de datos mysql + ficheros RRDs) en el que olvide respetar los campos con auto_increment, de tal forma que en la nueva base de datos del cacti los auto_increment no aparecían como tales. La opción --create-options del mysqldump me faltaba.

El segundo estaba en otra migración de la monitorización por Snmptraps de bases de datos oracle, en el que llegaban mensajes oraEM4Alert con variables en hex-string en lugar de String octal. La causa era el juego de caracteres del servidor de traps, que estaba configurado con en_EN@UTF8 y en el manager de oracle estaba en es_ES@EURO. Eso hacia que los mensajes con caracteres acentuados (enviados por el oracle-manager) fueran convertidos a Strings Hexadecimales (en el servidor de traps) y este se viese forzado a dejarlos en Hex-String al no disponer de un juego de carácteres compatible con el usado por el agente de oracle-manager.

miércoles, julio 01, 2009

Disable managment port

Ayer conseguí el premio nobel de la semana en el trabajo. Jugueteando con la configuración SNMP de un balanceador Alteon 2424 SSL, en el que no conseguía activar las consultas, entre en una opción de mantenimiento de los puertos mediante una conexión por SSH.

Pensé que después de tocar las comunities SNMP tendria que echar abajo el servicio y luego levantarlo, al igual que ocurre con los BigIP. Así que encuentro la opción Disable managment port. Hago el disable y me quedo sin poder acceder a la configuración por SSH ni por HTTPS, con lo que no puedo habilitar nada después...

El premio traia de regalo una vista al CPD para conectarme al puerto serie del Alteón y habilitar de nuevo el puerto de mantenimiento.

viernes, junio 26, 2009

Los errores obvios

Utilizar un recurso compartido por NFS para guardar archivos temporales de procesos locales es de premio nobel. Que los procesos locales vayan dejando los archivos temporales sin borrarlos una vez utilizados tiene otro premio nobel.

En fin, parece que la gente se empecina en repetir los mismos errores, una y otra vez, con aplicaciones destinadas a ser utilizadas por muchas personas. Los errores producto del mal dimensionamiento del sistema de ficheros donde se van a guardar datos o suponer que un directorio puede albergar miles de ficheros sin que eso importe al rendimiento se ven demasiado frecuentemente.

Cuando ocurren estas cosas, lo primero es echarles las culpa a las máquinas, que si son lentas o estan mal configuradas, y se intenta solucionar añadiendo más máquinas, más memoría, mas noseque. En lugar de buscar en el diseño propiamente y ver si se han tenido en cuenta los detalles obvios...

miércoles, junio 10, 2009

Jornada intensiva

Aunque oficialmente la jornada intensava la comienzo el martes 16 de Junio. Por una serie de circunstancias, es como si la empezara hoy. Hasta mediados de septiembre estoy de 8 a 15. Yuju!

martes, mayo 19, 2009

Aburrimiento laboral

Con el soniquete de los niños de San Ildefonso cuando cantan un número de la loteria de navidad repitamos todos (sin respirar): 'No hay nada más aburrido que un curso online de riesgos laboraaaaaaaales'.

miércoles, abril 15, 2009

1602

No corresponde a un año de algún evento historico que se deba recordar, aunque podría serlo (nacimiento de Mazzarino). Es el número de mensajes que he borrado del movil correspondientes al nagios de los ultimos tres meses. A una media de casi veinte por día. Too many messages1.

1¿Se podría hacer algún juego de palabras?

viernes, abril 03, 2009

Noche de intervención nocturna

La noche de ayer se me hizo muy larga. A las ocho teníamos una parada programada en el CPD para una actualización de firmwares de switchs de fibra y recableado entre las BladeFrame, robótica de backup, cabina de discos Netapp y no sé que más cosas. El asunto terminó sobre las cinco y media de la mañana.

La sorpresa ha llegado esta mañana cuando entré a currar sobre las once, parece que al software de backup no le ha sentado nada bien que hallamos toqueado en el conexionado.

miércoles, marzo 18, 2009

Tranquila reincorporación

Mi reincorporación postvacacional al trabajo ha sido tranquila. Me han dicho que me ha sentado bien porque iba sonrriendo mucho. No hace falta que lo jure.

lunes, marzo 02, 2009

Curso de CentricStor

Día completo de curso de Fujitsu donde nos cuentan las bondades del CentricStor VTL-1500. He aprendido que se han equivocado al comprar esto para eliminar los 'problemas' del backup en mi trabajo.

Cómo utilizar el servicio Secrets Manager para guardar las claves privadas de SSH

Para guardar la clave privada en el servicio Secrets Manager como un secreto en modo texto sin formato, sigue estos pasos Supongamos que la ...