martes, 14 de septiembre de 2010

Semaphores exhausted

Bueno, hoy voy a poner una pequeña chuleta tanto para revisar los semáforos o aumentar estos en un linux.
Un poco de información, simplificando un poco (o mucho), un semaforo es una variable que se utiliza para gestionar el bloqueo de un recurso (más info wikipedia-semaforos ) y de esta manera evitar un deadlock o abrazo de la muerte (más info wikipedia-Bloqueo mutuo). Estos son utilizados sobre todo por la Base de Datos, servidores web, ...etc.
Teniendo en cuenta esto, quedarnos sin semáforos, puede implicar que se nos bloquee la BBDD, el servidor web o la aplicación que los utilice.
Ahora vamos a ver como revisar los semáforos de un servidor y como aumentarlos.
Para ver los limites de los semáforos se pueden ver de la siguiente manera:

# ipcs -ls

------ Semaphore Limits --------
max number of arrays = 250
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 100
semaphore max value = 32767



Aqui podemos ver que nos indica los limites que tenemos en el sistema.
Podemos mirar los semáforos en uso:

# ipcs -su

------ Semaphore Status --------
used arrays = 241
allocated semaphores = 3718


En este caso estamos en el limite de arrays usados y este es el valor que deberíamos aumentar. Para hacerlo utilizaremos el comando sysctl , revisando la configuración actual:
# /sbin/sysctl kernel.sem
kernel.sem = 250 32000 100 250


Donde cada parametro indica lo siguiente:
SEMMSL - The maximum number of semaphores in a sempahore set
SEMMNS - The maximum number of sempahores in the system
SEMOPM - The maximum number of operations in a single semop call
SEMMNI - The maximum number of sempahore sets
Para ampliarlo tendremos que aumentar el ultimo parámetro:
#/sbin/sysctl -w kernel.sem="250 3200 100 300"
Y revisamos que se ha realizado los cambios:
# ipcs -sl

------ Semaphore Limits --------
max number of arrays = 300
max semaphores per array = 250
max semaphores system wide = 3200
max ops per semop call = 100
semaphore max value = 32767


Por ultimo modificamos el fichero /etc/sysctl.conf para que se mantengan los cambios en el próximo reinicio. Para eso añadimos o modificamos la siguiente linea en el fichero /etc/sysctl.conf:
kernel.sem=250 3200 100 300

Y eso es todo.
Un saludo a todos y recordad:
Ser todo lo felices que podáis ser.

Quitos.