[home]Home / kernel-sem

PMox: Appunti

Breve nota segnata in fretta per ricordare i punti importanti

Kernel sem

Quella che segue è l'analisi fatta a seguito di un problema di Mod_Python su un server remoto.

Il problema

Ad inizio dicembre, dopo un riavvio update e conseguente riavvio di Apache, Mod_Python si è rifiutato di partire.

I log di Apache mi riportavano questo errore:

[Sun Dec 02 19:46:35 2007] [notice] mod_python: Creating 8 session mutexes based on 150 max processes and 0 max threads.
[Sun Dec 02 19:46:35 2007] [notice] mod_python: using mutex_directory /tmp
[Sun Dec 02 19:46:35 2007] [error] (28)No space left on device: mod_python: Failed to create global mutex 1 of 8 (/tmp/mpmtx22311).
Configuration Failed

Ricerca della soluzione

Come prima cosa ho verificato lo spazio disponibile e il numero di inodes disponibili:

du -sh
du -ih

Entrambi risultavano abbondantemente OK, quindi il messaggio di errore và interprtato meglio.
Come in tutti i casi simili, non conoscendo ancora un problema simile, ho copiato ed incollato (con le opportune modifiche) la stringa di errore su Google per cercare problemi simili.

Su Google, ho trovato un messaggio sulla mailing list di Mod Python che descriveva quasi perfettamente il mio problema, con questa soluzione:

You actually need to increase the amount of SysV Semaphores on your system. I use (in /etc/sysctl.conf): kernel.sem = 512 32000 100 512 (set the options in this file by running sysctl -p).

Ho immediatamente eseguito il consiglio e ha funzionato... il passo successivo è capire il perché :)

Analisi dettagliata della soluzione

È doverosa una premessa: i semafori di cui si parla sono fondamentalmente dei sistemi per controllare / sincronizzare l'accesso a risorse condivise, modellati pressapoco sul paradigma del semaforo stradale: se c'é un semaforo si passa solo se è verde, altrimenti si aspetta il verde.
L'unica differenza è che questi operano con un contatore anziché a tempo / a turno.

Sysctl è un programma che permette di esaminare o modificre dinamicamente i parametri in un kernel Linux o BSD.
Sotto Linux, si può ottenere lo stesso effetto agendo direttamente sul file system /proc
Il file /etc/sysctl.conf non è altro che il file di configurazione di sysctl.

sysctl ed il suo file di configurazione /etc/sysctl.conf identificano i parametri con questa forma: a.b.c.d = valore
La stessa informazione sarebbe rappresentata nel file system /proc dal file /proc/sys/a/b/c/d contenente il valore valore.

Nel nostro caso, siamo interessati ad una singola proprietà chiamata kernel.sem che fornisce la configurazione del semafori sotto forma di un'unica riga contenente quattro distinti valori, separati da spazi o tab:

/sbin/sysctl kernel.sem
kernel.sem = 250        32000   32      128

oppure

cat /proc/sys/kernel/sem
250     32000   32      128

Le informazioni generate sono essenziali, ma di difficile comprensione.
Per avere una visione un po' più chiara del signficato, possiamo ricorrere ad un'altro comando:

# ipcs -l
...
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
...

Questa porzione di output riporta le stesse informazioni ottenute prima leggendo la variabile kernel.sem, ma questa volta in formato più intellegibile:

  1. max semaphores per array
  2. max semaphores system wide
  3. max ops per semop call
  4. max number of arrays

Approfondimenti

Si trova in generale poca documentazione a riguardo a questo problema e quasi tutta riguarda vari DB.

In particolare uno dei documenti più utili per comprendere questo aspetto è stata una pagina sul sito IBM relativa a DB2 chiamata Modifying kernel parameters (Linux) .

Aggiungi a: Digg | del.icio.us | Segnalo |