PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : no buffer space available



7.e.Q
26.09.05, 13:16
Hi Leute,

wir arbeiten auf unseren Systemen mit sehr vielen Sockets und Verbindungen. Jetzt sind wir an einige Grenzen gestoßen. Erst war's die anzahl FileHandles pro Prozess, die wir erhöhen mussten, dann war's select() das von Haus aus nur 1024 Handles verwalten kann, jetzt ist es sendto(), welches uns die Fehlermeldung "No buffer space available" ab einer bestimmten Menge Verbindungen/Sockets liefert.

Letztere Grenze gilt es jetzt zu entfernen, bzw. hochzusetzen. Wie kann man das machen? Wer definiert diese Grenze? "No buffer space available" bei sendto()... :confused:

EDIT: Also unter FreeBSD kann man das irgendwie im Kernel konfigurieren. Hat was mit NMBCLUSTERS zu tun. Wie geht das unter regulärem Linux? Kernel 2.6.7




Gruß,
Hendrik

Polarizer
26.09.05, 16:18
Hilft das?!

http://www-lib.lctu.edu.cn/ywzx/dispbbs.asp?boardID=15&RootID=3976&ID=3976

7.e.Q
26.09.05, 16:27
Eventuell. Muss ich morgen mal prüfen. Bin jetzt schon im wohlverdienten Feierabend. :)


Edit: Wir prüfen das gerade...

7.e.Q
27.09.05, 09:47
... nein, das hatte keinerlei Auswirkungen. Ich hab die Puffergröße um den Faktor 4 erhöht. Es hatte keinerlei Änderungen im Verhalten zur Folge. Ich bitte um weitere Unterstützung. Eventuell muss nicht die Größe, sondern die Anzahl der Puffer vergrößert werden.

Das merkwürdige ist, daß nach ziemlich genau 1026 Sockets die ersten Fehler auftreten. Ab da fangen die sendto() Aufrufe an, mit ENOBUFS zurückzukehren. Und ab Socket Nummer 1298 geht alles wieder einwandfrei.

Achtung: wir richten für jede Verbindung ein separates Interface ein. Wir simulieren Teilnehmer. Von daher bekommt jede Verbindung ein eigenes Interface im Style eth0:1 - eth0:2000 mit einer eigenen IP. Gibt es da eventuell irgendwie grundsätzliche Probleme im Bereich zwischen eth0:1024 und eth0:1300? Oder liegt es wirklich am Socket, daß da zwischen den simulierten Teilnehmern 1024 und 1300 massiv Fehler auftreten, bei allen anderen jedoch nicht?

Ich begreife es nicht! Hilfe bitte! :confused: :confused: :confused:

Korrektur: Es war doch das Vergrößern der Puffer mit setsockopt, wie in dem Link oben angegeben. Leider reicht das immer noch nicht aus. Ich hab die Puffer jetzt beide auf 350.000 gesetzt. Das reicht zumindest für den Verbindungsaufbau zwischen den einzelnen simulierten Teilnehmern (2.000 an der Zahl). Aber ich vermute, sobald ich damit Traffic mache, gerate ich da wieder an diese Grenze. Wieviel kann ich den Puffern SO_RCVBUF und SO_SNDBUF denn maximal zuweisen???