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:
- max semaphores per array
- max semaphores system wide
- max ops per semop call
- 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) .
Home