Jan Muenther <jan(at)radio.hundert6.de> wrote:
> Sehe ich das aus
> Programmiersicht richtig, daß jedesmal, wenn ich ein Filehandle
> brauche, OS-seitig dafür ein Deskriptor verbraten wird, bis ich
> das Handle wieder schließe???
Völlig richtig.
> > #define NPROC (20 + 16 * MAXUSERS)
> >
> > Bei maxusers 64 macht das (20 + 16 * 64) * 2 == 2088, wenn
> > mich /usr/bin/bc jetzt nicht anlügt.
>
> Ah! Habe natürlich wieder mal an der völlig falschen Stelle
> geschaut... tsts... Trotzdem ulkige Werte, aus denen sich das
> zusammensetzt... 20?
Nunja, derjenige, der sich das ausgedacht hat, meinte viel-
leicht, daß mind. 20 Prozeß-slots immer zur Verfügung ste-
hen sollten, auch wenn jemand aus irgendeinem Grund max-
users auf 0 setzt. Und pro "user" kommen dann halt nochmal
16 mögliche Prozesse dazu.
"maxusers" ist eigentlich, zumindest heutzutage, die fal-
sche Bezeichnung für diese Kernel-Einstellung. Sie sollte
eher "bigrustyknob" oder so heißen.
> _Das_ kann ja aber ganz schön hart werden, oder??? Ich meine,
> selbst wenn man nichts in den Logfiles findet, erwartet man bei
> einem fatalen Fehler ja irgendwie, das er sich doch auf der
> Konsole bemerkbar macht - was er dann ja schlichtweg nicht kann.
Nunja, der Kernel loggt dann auf der Konsole und im dmesg,
daß sein Filetable voll ist. Dazu braucht der Kernel kei-
nen FD. ;-)
>> Viele Library-
>> calls verwenden intern Dateien oder Sockets und ,,verstek-
>> ken`` daher die Tatsache, daß sie auf FDs angewiesen sind,
>> z.B. syslog() (siehe oben), gethostbyname() etc.
>
> Hm, meinst Du damit, daß durch den Aufruf von Library-Calls durch
> die aufgerufenen Funktionen wiederum FDs verbraten werden und auf
> diese Weise mehr davon verbraucht werden als man bei der
> Entwicklung des Programms selbst unmittelbar denkt?? Scheint mir
> schlüssig.
Ja. Sobald z.B. ein Programm zum erstenmal openlog() auf-
ruft, ist ein weiterer FD weg (bis zum Programmende, oder
bis closelog() aufgerufen wird, was aber eher unüblich
ist). Wenn ein Programm nur syslog() ohne openlog() ver-
wendet, wird der FD jedesmal nur temporär benötigt und
gleich wieder freigegeben.
> Kann man denn irgendwie feststellen, welcher Prozeß wieviele FDs
> an sich klammert? systat? Erwischt man mit lsof in jedem Fall
> _alle_ ???
Ja, sowohl fstat als auch lsof sollten alle anzeigen.
Wenn Du ein ,,fstat | wc -l`` machst, wirst Du vermutlich
deutlich mehr erhalten, als ,,pstat -T`` anzeigt. Das
ist normal und liegt einfach daran, daß Filedescriptoren
von Parent-Prozessen an ihre Kinder vererbt werden und
dann auch nur einen Eintrag in der globalen Filetable be-
nötigen, obwohl fstat und lsof ihn natürlich für beide
Prozesse anzeigen.
> Tja, der Witz ist bloß, daß das Phänomen gerade wieder
> aufgetreten ist und - zumindest nachdem mir der Login dann
> gelungen war, gerade mal 80 Filehandles in Benutzung waren.
Dann waren entweder die FDs nicht das Problem, oder sie
waren es nur für kurze Zeit. Sagt der Kernel auf der Kon-
sole irgendwas wie ,,filetable full``? Wenn nicht, ist
die Ursache woanders zu suchen.
> Klingt logisch. Mann, woher weißt du das alles? ;o))
Wenn man sich schon längere Zeit mit sowas beschäftigt,
kann man gar nicht verhindern, daß man sich irgendwann
damit auskennt. :-)
Gruß
Olli
-- Oliver Fromme, secnetix GmbH & Co KG, Oettingenstr. 2, 80538 München Any opinions expressed in this message may be personal to the author and may not necessarily reflect the opinions of secnetix in any way. "All that we see or seem is just a dream within a dream" (E. A. Poe) To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org with "unsubscribe de-bsd-questions" in the body of the messageReceived on Tue 30 Jan 2001 - 10:59:44 CET