kern.maxfilesAbhängig von den Anforderungen Ihres Systems kann kern.maxfiles erhöht oder erniedrigt werden. Die
Variable legt die maximale Anzahl von Dateideskriptoren auf Ihrem System fest. Wenn
die Dateideskriptoren aufgebraucht sind, werden Sie die Meldung “file: table is full” wiederholt im Puffer für
Systemmeldungen sehen. Den Inhalt des Puffers können Sie sich mit dmesg anzeigen lassen.
Jede offene Datei, jedes Socket und jede FIFO verbraucht einen Dateideskriptor. Auf “dicken” Produktionsservern können leicht Tausende Dateideskriptoren benötigt werden, abhängig von der Art und Anzahl der gleichzeitig laufenden Dienste.
In älteren FreeBSD-Versionen wurde die Voreinstellung von kern.maxfile aus der Kernelkonfigurationsoption maxusers bestimmt. kern.maxfiles
wächst proportional mit dem Wert von maxusers.
Wenn Sie einen angepassten Kernel kompilieren, empfiehlt es sich diese Option
entsprechend der maximalen Benutzerzahl Ihres Systems einzustellen. Obwohl auf
einer Produktionsmaschine vielleicht nicht 256 Benutzer gleichzeitig angemeldet
sind, können die benötigten Ressourcen ähnlich denen eines
großen Webservers sein.
Die Variable kern.maxusers wird beim Systemstart
automatisch aus dem zur Verfügung stehenden Hauptspeicher bestimmt. Im
laufenden Betrieb kann dieser Wert aus der (nur lesbaren) sysctl-Variable
kern.maxusers ermittelt werden. Falls ein System
für diese Variable einen anderen Wert benötigt, kann der Wert über
den Loader angepasst werden. Häufig verwendete Werte sind dabei 64, 128, sowie
256. Es ist empfehlenswert, die Anzahl der Dateideskriptoren nicht auf einen
Wert größer 256 zu setzen, es sei denn, Sie benötigen wirklich eine
riesige Anzahl von ihnen. Viele der von kern.maxusers
auf einen Standardwert gesetzten Parameter können beim Systemstart oder
im laufenden Betrieb in der Datei /boot/loader.conf
(sehen Sie sich dazu auch loader.conf(5) sowie
die Datei /boot/defaults/loader.conf an) an Ihre
Bedürfnisse angepasst werden, so wie es bereits an anderer Stelle dieses
Dokuments beschrieben ist.
Ältere FreeBSD-Versionen setzen diesen Wert selbst, wenn Sie in der Konfigurationsdatei den Wert 0 [1] angeben. Wenn Sie den Wert selbst bestimmen wollen, sollten Sie maxusers mindestens auf 4 setzen. Dies gilt insbesondere dann, wenn Sie beabsichtigen, das X Window-System zu benutzen oder Software zu kompilieren. Der Grund dafür ist, dass der wichtigste Wert, der durch maxusers bestimmt wird, die maximale Anzahl an Prozessen ist, die auf 20 + 16 * maxusers gesetzt wird. Wenn Sie also maxusers auf 1 setzen, können gleichzeitig nur 36 Prozesse laufen, von denen ungefähr 18 schon beim Booten des Systems gestartet werden. Dazu kommen nochmals etwa 15 Prozesse beim Start des X Window-Systems. Selbst eine einfache Aufgabe wie das Lesen einer Manualpage benötigt neun Prozesse zum Filtern, Dekomprimieren und Betrachten der Datei. Für die meisten Benutzer sollte es ausreichen, maxusers auf 64 zu setzen, womit 1044 gleichzeitige Prozesse zur Verfügung stehen. Wenn Sie allerdings den gefürchteten Fehler proc table full beim Start eines Programms oder auf einem Server mit einer großen Benutzerzahl (wie ftp.FreeBSD.org) sehen, dann sollten Sie den Wert nochmals erhöhen und den Kernel neu bauen.
Anmerkung: Die Anzahl der Benutzer, die sich auf einem Rechner anmelden kann, wird durch maxusers nicht begrenzt. Der Wert dieser Variablen legt neben der möglichen Anzahl der Prozesse eines Benutzers weitere sinnvolle Größen für bestimmte Systemtabellen fest.
kern.ipc.somaxconnDie Variable kern.ipc.somaxconn beschränkt die
Größe der Warteschlange (Listen-Queue)
für neue TCP-Verbindungen. Der Vorgabewert von 128 ist normalerweise zu klein, um neue Verbindungen auf einem
stark ausgelasteten Webserver zuverlässig zu handhaben. Auf solchen Servern
sollte der Wert auf 1024 oder höher gesetzt
werden. Ein Dienst (z.B. sendmail(8), oder
Apache) kann die Größe der Queue selbst
einschränken. Oft gibt es die Möglichkeit, die Größe der
Listen-Queue in einer Konfigurationsdatei einzustellen. Eine große
Listen-Queue übersteht vielleicht auch einen Denial of Service Angriff (DoS).
Die Kerneloption NMBCLUSTERS schreibt die Anzahl der
Netzwerkpuffer (Mbufs) fest, die das System besitzt. Eine zu geringe Anzahl Mbufs
auf einem Server mit viel Netzwerkverkehr verringert die Leistung von FreeBSD. Jeder
Mbuf-Cluster nimmt ungefähr 2 kB Speicher in Anspruch, so dass ein Wert
von 1024 insgesamt 2 Megabyte Speicher für Netzwerkpuffer im System
reserviert. Wie viele Cluster benötigt werden, lässt sich durch eine
einfache Berechnung herausfinden. Wenn Sie einen Webserver besitzen, der maximal
1000 gleichzeitige Verbindungen servieren soll und jede der Verbindungen je einen
16 kB großen Puffer zum Senden und Empfangen braucht, brauchen Sie
ungefähr 32 MB Speicher für Netzwerkpuffer. Als Daumenregel
verdoppeln Sie diese Zahl, so dass sich für NMBCLUSTERS der Wert
2x32 MB / 2 kB = 32768 ergibt. Für Maschinen mit
viel Speicher sollten Werte zwischen 4096 und 32768 genommen werden. Sie können
diesen Wert nicht willkürlich erhöhen, da dies bereits zu einem
Absturz beim Systemstart führen kann. Mit der Option -m von netstat(1) können
Sie den Gebrauch der Netzwerkpuffer kontrollieren.
Die Netzwerkpuffer können beim Systemstart mit der Loader-Variablen kern.ipc.nmbclusters eingestellt werden. Nur auf älteren
FreeBSD-Systemen müssen Sie die Kerneloption NMBCLUSTERS verwenden.
Die Anzahl der sendfile(2) Puffer
muss auf ausgelasteten Servern, die den Systemaufruf sendfile(2) oft
verwenden, vielleicht erhöht werden. Dazu können Sie die Kerneloption
NSFBUFS verwenden oder die Anzahl der Puffer in /boot/loader.conf (siehe loader(8)) setzen. Die
Puffer sollten erhöht werden, wenn Sie Prozesse im Zustand sfbufa sehen. Die schreibgeschützte sysctl-Variable
kern.ipc.nsfbufs zeigt die Anzahl eingerichteten
Puffer im Kernel. Der Wert dieser Variablen wird normalerweise von kern.maxusers bestimmt. Manchmal muss die Pufferanzahl jedoch
manuell eingestellt werden.
Wichtig: Auch wenn ein Socket nicht blockierend angelegt wurde, kann der Aufruf von sendfile(2) blockieren, um auf freie struct sf_buf Puffer zu warten.
net.inet.ip.portrange.*Die sysctl-Variable net.inet.ip.portrange.* legt
die Portnummern für TCP- und UDP-Sockets fest. Es gibt drei Bereiche: den
niedrigen Bereich, den normalen Bereich und den hohen Bereich. Die meisten
Netzprogramme benutzen den normalen Bereich. Dieser Bereich umfasst in der
Voreinstellung die Portnummern 500 bis 5000 und wird durch die Variablen
net.inet.ip.portrange.first und net.inet.ip.portrange.last festgelegt. Die festgelegten
Bereiche für Portnummern werden von ausgehenden Verbindungen benutzt. Unter
bestimmten Umständen, beispielsweise auf stark ausgelasteten
Proxy-Servern, sind alle Portnummern für ausgehende Verbindungen belegt.
Bereiche für Portnummern spielen auf Servern keine Rolle, die
hauptsächlich eingehende Verbindungen verarbeiten (wie ein normaler Webserver)
oder nur eine begrenzte Anzahl ausgehender Verbindungen öffnen (beispielsweise
ein Mail-Relay). Wenn Sie keine freien Portnummern mehr haben, sollten Sie
die Variable net.inet.ip.portrange.last langsam
erhöhen. Ein Wert von 10000, 20000 oder 30000 ist angemessen.
Beachten Sie auch eine vorhandene Firewall, wenn Sie die Bereiche für
Portnummern ändern. Einige Firewalls sperren große Bereiche
(normalerweise aus den kleinen Portnummern) und erwarten, dass hohe Portnummern
für ausgehende Verbindungen verwendet werden. Daher kann es erforderlich sein,
den Wert von net.inet.ip.portrange.first zu
erhöhen.
Die TCP Bandwidth Delay Product Begrenzung gleicht TCP/Vegas von NetBSD. Die
Begrenzung wird aktiviert, indem Sie die sysctl-Variable net.inet.tcp.inflight.enable auf den Wert 1 setzen. Das System wird dann versuchen, für jede
Verbindung, das Produkt aus der Übertragungsrate und der Verzögerungszeit
zu bestimmen. Dieses Produkt begrenzt die Datenmenge, die für einen
optimales Durchsatz zwischengespeichert werden muss.
Diese Begrenzung ist nützlich, wenn Sie Daten über Verbindungen mit
einem hohen Produkt aus Übertragungsrate und Verzögerungszeit wie Modems,
Gigabit-Ethernet oder schnellen WANs, zur Verfügung stellen.
Insbesondere wirkt sich die Begrenzung aus, wenn die Verbindung die TCP-Option
Window-scaling verwendet oder große
Sende-Fenster (send window) benutzt. Schalten
Sie die Debug-Meldungen aus, wenn Sie die Begrenzung aktiviert haben. Dazu setzen
Sie die Variable net.inet.tcp.inflight.debug auf
0. Auf Produktions-Systemen sollten Sie zudem die Variable
net.inet.tcp.inflight.min mindestens auf den Wert 6144 setzen. Allerdings kann ein zu hoher Wert, abhängig
von der Verbindung, die Begrenzungsfunktion unwirksam machen. Die Begrenzung
reduziert die Datenmenge in den Queues von Routern und Switches, sowie die
Datenmenge in der Queue der lokalen Netzwerkkarte. Die Verzögerungszeit
(Round Trip Time) für interaktive Anwendungen
sinkt, da weniger Pakete zwischengespeichert werden. Dies gilt besonders für
Verbindungen über langsame Modems. Die Begrenzung wirkt sich allerdings
nur auf das Versenden von Daten aus (Uploads, Server). Auf den Empfang von Daten
(Downloads) hat die Begrenzung keine Auswirkungen.
Die Variable net.inet.tcp.inflight.stab sollte
nicht angepasst werden. Der
Vorgabewert der Variablen beträgt 20, das heißt
es werden maximal zwei Pakete zu dem Produkt aus Übertragungsrate und
Verzögerungszeit addiert. Dies stabilisiert den Algorithmus und verbessert die
Reaktionszeit auf Veränderungen. Bei langsamen Verbindungen können
sich aber die Laufzeiten der Pakete erhöhen (ohne diesen Algorithmus
wären sie allerdings noch höher). In solchen Fällen
können Sie versuchen, den Wert der Variablen auf 15,
10 oder 5 zu erniedrigen.
Gleichzeitig müssen Sie vielleicht auch net.inet.tcp.inflight.min auf einen kleineren Wert
(beispielsweise 3500) setzen. Ändern Sie diese
Variablen nur ab, wenn Sie keine anderen Möglichkeiten mehr haben.
kern.maxvnodesEin vnode ist die interne Darstellung einer Datei oder eines Verzeichnisses. Die Erhöhung der Anzahl der für das Betriebssystem verfügbaren vnodes verringert also die Schreib- und Lesezugriffe auf Ihre Festplatte. vnodes werden im Normalfall vom Betriebssystem automatisch vergeben und müssen nicht von Ihnen angepasst werden. In einigen Fällen stellt der Zugriff auf eine Platte allerdings einen Flaschenhals dar, daher sollten Sie in diesem Fall die Anzahl der möglichen vnodes erhöhen, um dieses Problem zu beheben. Beachten Sie dabei aber die Größe des inaktiven und freien Hauptspeichers.
Um die Anzahl der derzeit verwendeten vnodes zu sehen, geben Sie Folgendes ein:
# sysctl vfs.numvnodes vfs.numvnodes: 91349
Die maximal mögliche Anzahl der vnodes erhalten Sie durch die Eingabe von:
# sysctl kern.maxvnodes kern.maxvnodes: 100000
Wenn sich die Anzahl der genutzten vnodes dem maximal möglichen Wert
nähert, sollten Sie den Wert kern.maxvnodes
zuerst um etwa 1.000 erhöhen. Beobachten Sie danach die Anzahl der vom
System genutzten vfs.numvnodes. Nähert sich der
Wert wiederum dem definierten Maximum, müssen Sie kern.maxvnodes nochmals erhöhen. Sie sollten nun eine
Änderung Ihres Speicherverbrauches (etwa über top(1))
registrieren können und über mehr aktiven Speicher verfügen.
| [1] |
Der verwendete Algorithmus setzt maxusers auf die Speichergröße des Systems. Der minimale Wert beträgt dabei 32, das Maximum ist 384. |
| Zurück | Zum Anfang | Weiter |
| Tuning von Laufwerken | Nach oben | Hinzufügen von Swap-Bereichen |
Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an
<de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.