Bad Ranzbad mmap

wall < "Fatal error: failed to mmap cache file"

Broadcast message from spillerm@unixe.de (pts/1) (Di Nov 11 22:55:03 2008):
4
Diesen Beitrag schrieb ich vor 10 Jahren. Behalte das beim Lesen bitte im Hinterkopf.

Es ist zum Auswachsen: auf einem OpenExchange-Setup, das sich auf cyrus-imapd und postfix stützt und das lange, sehr lange einfach vor sich hin funktioniert hat, erscheinen plötzlich nachfolgende Meldungen im Log:

Nov 10 11:44:09 ox imap[26765]: login: localhost [127.0.0.1] spillerm plaintext User logged in
Nov 10 11:44:09 ox imap[26740]: accepted connection
Nov 10 11:44:09 ox imap[26740]: login: localhost [127.0.0.1] spillerm plaintext User logged in
Nov 10 11:44:09 ox imap[26740]: IOERROR: mapping cache file for user.spillerm: Cannot allocate memory
Nov 10 11:44:09 ox imap[26750]: accepted connection
Nov 10 11:44:09 ox master[26850]: about to exec /usr/lib/cyrus-imapd/imapd
Nov 10 11:44:09 ox imap[26740]: Fatal error: failed to mmap cache file
Nov 10 11:44:09 ox master[32168]: process 26740 exited, status 75
Nov 10 11:44:09 ox master[32168]: service imap pid 26740 in BUSY state: terminated abnormally
Nov 10 11:44:09 ox imap[26850]: executed

Also in erster Instanz herausfinden, wo cyrus seinen Kram ablegt (falls man das nicht ohnehin weiss):

$ grep partition-default /etc/imapd.conf
partition-default: /var/spool/imap

Dann schauen wir uns mal an, wie gross das Cache-File des Users tatsächlich ist:

$ cd /var/spool/imap/s/user/spillerm
$ du -h cyrus.cache 
2.1G	cyrus.cache

Okay, das ist zu viel — selbst in Mailboxen mit hunderten Mails erreicht das File nicht eine solche Grösse (wenn alles so läuft wie es soll)… Wie also Abhilfe schaffen?

cyrus stoppen

$ /etc/init.d/cyrus-imapd stop

cyrus.cache dieses Users löschen

Am Beispiel des Users spillerm könnte das beispielsweise so aussehen:

$ rm /var/spool/imap/s/user/spillerm/cyrus.cache

Mailbox des Users rekonstruieren

$ reconstruct -rf user.spillerm

Ist in /etc/imapd.conf allerdinga unixhierarchysep: yes gesetzt, muss der Aufruf etwas modifiziert ausgeführt werden:

$ reconstruct -rf user/spillerm

Dadurch wird, unter anderem, cyrus.cache neu erzeugt. Der Dienst kann nun wieder gestartet werden — in meinem Falle hat diese Vorgehensweise dein eingangs erwähnten Fehler vollständig behoben.

/etc/init.d/cyrus-imapd start

Hat den Fehler nachhaltig behoben :)

4
  1. J-P Human

    Thanks this saved me a lot of time and helped me solve a similar issue.

Keine weitere Reaktionen mehr möglich.