Sul server di posta di un cliente si sono verificati negli ultimi giorni alcuni fastidiosi blocchi nell’invio e nella ricezione dei messaggi, blocchi che sono dovuti ad un improvviso e inatteso errore di Postfix:
Jan 22 06:26:46 curioso amavis[26560]: (!!)TROUBLE in child_init_hook: BDB no dbS: Lock table is out of available locker entries, . at (eval 97) line 27. Jan 22 06:26:46 curioso amavis[26560]: (!)_DIE: Suicide in child_init_hook: BDB no dbS: Lock table is out of available locker entries, . at (eval 97) line 27.
Si tratta fondamentalmente di un problema legato al db Berkeley con cui Amavis gestisce i flag di status e i contatori relativi alle scansioni che effettua sui messaggi. Non è un problema necessariamente di corruzione del filesystem, come erroneamente si legge in giro googlando, ma può trattarsi più semplicemente di un limite fisico nelle transazioni sopportabili da Amavis in una determinato scenario – su quel server ci sono quasi 800 mailbox attive – oppure dell’interazione con altri script che, in determinate situazioni, forzano il riavvio del demone di Amavis magari proprio mentre cerca di allocare un volume di dati anomalo nel db Berkeley.
Non ce ne frega niente, non è questo il punto: in uno scenario di emergenza del genere non si può procedere con benchmark e fine tuning perché possono richiedere giorni. Bisogna risolvere il problema a e basta.
La soluzione più semplice è intervenire con uno script in bash da far girare in cron ogni 5 minuti, script che controlla le code di posta in uscita e, se trova più di 50 messaggi fermi effettua le seguenti operazioni:
- ferma Amavis
- rimuove completamente il db Berkeley
- riavvia Amavis, il quale ricreerà ex novo il db Berkeley
- riavvia Postfix
- ordina a Postfix di effettuare il flush della coda di posta in uscita
Se vi dovesse servire, ecco lo script:
#!/bin/bash MAILQC="$(find /var/spool/postfix/deferred -type f | wc -l)" if [ $MAILQC -ge 50 ]; then echo "CRITICAL: mailq exceeded $MAILQC"; /etc/init.d/amavis stop /bin/rm -rf /var/lib/amavis/db/* /etc/init.d/amavis restart /etc/init.d/postfix restart /usr/sbin/postfix flush else echo "NORMALITY: mailq is $MAILQC"; fi
Questo script funziona perfettamente sui sistemi basati su Debian GNU/Linux e suoi derivati, per farlo funzionare su altre distribuzioni potrebbe essere necessario aggiornare le posizioni dei file e delle directory relative ai servizi da riavviare e al db Berkeley.
Fonte: https://goo.gl/h3sUdO