Hallo,
gibt es irgendwo in der Linux-Welt Server, die gleichzeitig eine hohe Anzahl an Clients bedienen müssen, ohne dabei einzugehen?
Ich hab mir folgende Server angeschaut: - Apache Standardmäßig nur 256 Verbindungen möglich, skaliert nicht von selbst - Dancer IRCd Auch hier nur 256 Verbindungen, auf openprojects.net bis zu 4096, skaliert aber ebenfalls nicht von selbst
Das Problem besteht aus 2 Teilen: - zum einen die geringe Anzahl offener Dateien pro Prozess Unix/Linux: meist 256-1024 (zwar kann man das bei Linux über /proc einstellen, aber das erfordert root-Rechte, und es gibt noch ulimit und /etc/security/limits.conf.) Netware: 2048 Hurd: unbegrenzt - Zum anderen an der Art der Event-Abfrage Beide oben genannten Server, und auch die meisten anderen, nutzen select() und bekommen damit massiv Latenzprobleme, wenn z.B. alle Clients sich verabschiedet haben und nur noch an n-1 ter Position einer steckt.
Es gibt jetzt 2 Möglichkeiten, das Problem zu lösen: - Einen eigenen select()-Handler programmieren, welcher eine Liste statt ein Array verwendet (löst aber nur einen Teil des Problems). - Aufteilung der Clients an Kindprozesse (möglichst transparent), so daß praktisch durchaus 100000 Clients gehandhabt werden können.
Gibt es irgendwo Dokumentation zu speziell diesem Thema? Auf den üblichen Hilfeseiten wird immer empfohlen, /proc/sys/fs/file-max mit hohen Werten zu füttern, aber das hat die oben genannten Nachteile.
Threads helfen auch nicht weiter: Diese sind zwar auf Linux als eigene Prozesse implementiert, aber das Limit gilt trotzdem für alle zusammen.
Josef