Mit Kubuntu Java Entwickeln

Bisher hatte ich wenige bis keine Probleme damit Kubuntu für die tägliche Arbeit zu nutzen. Jetzt bin ich allerdings auf ein Problem gestossen, bei dem ich mir nicht sicher bin, ob ich es gut oder schlecht finden soll.

In meine Entwicklungsumgebung (Eclipse) habe ich ein größeres Java Projekt importiert. Insgesamt enthält das Projekt über 9000 Dateien. Zum Großen Teil handelt es sich dabei allerdings nicht um Java-Dateien sondern um Ressourcen wie Bilder usw.. Nach dem Import meldete die Entwicklungsumgebung, dass manche Java Dateien nicht übersetzt werden können, da sie nicht gefunden werden konnten. Der erste Gedanke der mir kam war, dass eventuell das Encoding der Dateien nicht passt und sie aus diesem Grund nicht gelesen werden können. Schließlich wurde das Projekt initial unter Windows erstellt und eingecheckt. Alles was ich ausprobierte führte zum gleichen Ergebnis: die Dateien waren ok. Auch das Compilieren über Maven auf der Kommandozeile stellte kein Problem dar. Im Error-Log von Eclipse fand ich dann allerdings die Meldung: "Too many open files". Zu viele offene Dateien?? Wie kann denn das passieren?

Verantwortlich dafür sind zwei Werte:

  • /proc/sys/fs/file-max
  • Angabe der 'nofile' in limits.conf

Über folgenden Befehl stellte sich heraus, dass Kubuntu für 254882 gleichzeitig offene Dateien konfiguriert ist:

cat /proc/sys/fs/file-max

Also sollte das nicht der Grund meines Problems gewesen sein. (Ändern kann man den Wert übrigens in der Datei /etc/sysctl.conf - einfach den Wert aufnehmen)

Eine zweite (Sicherheitseinstellung) beschränkt zusätzlich noch die Anzahl der offenen Dateien für eine einzelne Anwendung. Genau das war das Problem. Kubuntu ist standardmäßig auf 1024 gleichzeitige Filehandles pro Prozess konfiguriert und das reichte in meinem Fall leider nicht.

Mit folgendem Befehl läßt sich der aktuell konfigurierte Wert ermitteln:

kkoehler@halo:~$ ulimit -n
1024

Ändern kann man diesen über die Datei /etc/security/limits.conf. Folgendes sollte aufgenommen werden:

#<domain>      <type>  <item>         <value>
*               soft    nofile          5000
*               hard    nofile          5000

Danach hat's dann wunderbar funktioniert. ;-)