Systemd und die Limits

„Jedes System kommt irgendwann an seine Grenzen.“ Einer meiner Server hatte die Grenze heute überschritten. Die Folge, der Apache stieg mit dieser Meldung aus :

„apache (24)Too many open files: couldn’t spawn child process:“

Jetzt können Sie soviel googlen wie Sie wollen, alles was zu dem Fehler kommt ist nicht hilfreich. Alle Hinweise  von RedHat zu limitfiles auf  /etc/security/limits.conf  oder /proc/sys/fs/file-max können Sie getrost vergessen, die greifen in dem Fall gar nicht.

Wenn Sie jetzt ein System V haben, ist /etc/init.d/httpd für Sie da. Tragen Sie dort einfach ulimit -n 100000 ein und starten Sie den Apache neu. Fall erledigt.

Für den Systemd, wie ihn Fedora seit FC 16 einsetzt, sieht die Sache ähnlich einfach aus, wenn man weiß wo man suchen muß. Aber mal ehrlich, würden SIe als Linuxer darauf kommen, daß „man systemd.exec“ die Hilfeseite zum Systemd öffnet? Ich nicht, .exe oder ähnliche Erweiterungen sind Windows Extentions.

Die Manpage liefert eine Übersicht zu den Variblen  die man im Unitfile benutzen kann und eine davon ( immerhin 5 Bildschirmseiten voll davon gibt es ) ist Ihr Freund: „LimitNOFILE

Suchen Sie mit „locate httpd.service“ ihr Unitfile, das ist üblicherweise unter /usr/lib/systemd/system/httpd.service zu finden. Tragen Sie dort im Servicebereich die Variable ein :

[Service]
Type=forking
PIDFile=/var/run/httpd/httpd.pid
LimitNOFILE=1000000
EnvironmentFile=/etc/sysconfig/httpd

Führen Sie noch die zwei Zeilen aus :

systemctl –system daemon-reload
systemctl restart httpd

und Ihr Apache rennt wieder 🙂

Ursachenanalyse:

Jedes Apache Child öffnet alle Domainlogs auf dem Server. Wenn Sie nun einen Multidomainwebserver haben, so wie meine Kunden, dann kommen dort schnell 1000 Vhosts zusammen. Das macht 1000 Files pro httpd-Child und damit viel mehr offene Files als Fedora defaultmäßig bereitstellt.

Hier wäre natürlich ein Logfilebroker für Apache die richtige Lösung, aber da brauchen wir wohl seitens Apache nicht drauf hoffen.

 

Wenn Dracut einen Schreibfehler hat

Beim Upgrade von Fedora 16 auf 17, muß u.A. ein neuer Kernel Eintrag im Grub vorgenommen werden, z.B. :

title Fedora (upgrade.fc16.PAE)
 root (hd0,0)
 kernel /boot/vmlinuz-3.6.10-2.fc16.i686.PAE ro root=UUID=dca7eea1-687e-476a-a9a0-c41ef0329113 rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=de_DE.UTF-8 SYSFONT=latarcyrheb-sun16 KEYTABLE=de-latin1 rw rd.info rd.convertfs enforcing=0
 initrd /boot/initramfs-3.6.10-2.fc16.i686.PAE.img

Das ist nötig, da Fedora 17 ein anderes Filesystemlayout hat.

Wenn man das RW vergißt, bekommt man einen „Read-only file system“ , weil das usrcheck Script nicht auf die Partionen schreiben kann. Anstatt das Dracut das mit einem Hinweis auf den fehlenden Kernelparameter meldet, kommt nur ein Switched to root und nix passiert. Das Convertfs findet dann nicht statt.

Eine typische Fehlermeldung:

/usr/bin/convertfs line 60: /sysroot/.usrmovecheck234: Read-only file system

Lösung ist ganz einfach:

 kernel /boot/vmlinuz-3.6.10-2.fc16.i686.PAE ro root=UUID=dca7eea1-687e-476a-a9a0-c41ef0329113 rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=de_DE.UTF-8 SYSFONT=latarcyrheb-sun16 KEYTABLE=de-latin1 rw rd.info rd.convertfs enforcing=0

Den Kerneleintrag nochmal neu schreiben bzw. ergänzen und dann rebooten. Dann gehts.