UNIX-Tuning |
Tatsächlich gibt es einige Hinweise, die ein etwas flotter laufendes System bewirken. Aus einer überlasteten Maschine machen diese Maßnahmen aber noch keinen Raser. Im Normalfall helfen Eingriffe in die Konfiguration, die ursprüngliche Geschwindigkeit zu erhalten oder die Last so zu verteilen, dass kein Flaschenhals entsteht.
Der Einfluss des Dateisystems auf den Gesamtdurchsatz ist natürlich davon
abhängig, für welchen Einsatz die Maschine gedacht ist. Eine CAD-Workstation
und auch eine Entwicklungsmaschine für einen Softwareentwickler werden von
der Beschleunigung eines Dateisystems nicht profitieren. Dagegen werden alle
Programme, die mit Daten in größerem Umfang hantieren, dadurch zentral
beeinflusst.
Ist die Platte über 90% gefüllt, wird das die Performance beeinflussen.
Da nur wenig Platz ist, werden alle Lücken aufgefüllt, die sich durch das
Löschen von Dateien im Laufe der Zeit gebildet haben. Nach einiger Zeit
sind diejenigen Dateien, die regelmäßig geändert werden, die Lückenfüller
der Platte und verursachen heftige Bewegungen des Schreib- Lesekopfs.
Man spricht in diesem Falle von Fragmentierung oder Zerclusterung eines
Dateisystems.
Auf einer zentralen Servermaschine wird man die Dateisysteme, auf denen
Daten bewegt werden, möglichst unter 80%, besser unter 70% halten.
So groß der Block ist, so groß ist dann auch die kleinste Datei, da die Platte
immer blockweise belegt wird. Bei vielen kleinen Dateien wird der verschwendete
Speicherraum entsprechend groß.
Moderne Dateisysteme sind in der Lage durch dynamische Caches und Aufspaltung
von Blöcken für kleine Dateien, diese Tuningmaßnahmen selbst zu übernehmen.
Es versteht sich eigentlich von selbst, dass ein Verteilen der
Dateien auf mehrere Partitionen der gleichen Platte kontraproduktiv ist und
genau das Gegenteil erreicht.
Das Verzeichnis /tmp kann auf eine eigene Platte gelegt werden.
Dies bringt auf Systemen etwas, die das Verzeichnis intensiv nutzen,
wie beispielsweise bei der Compilierung. Es wird eine höhere Geschwindigkeit
erreicht, da das ständige Schreiben und Löschen zu einer starken
Zerclusterung führt. Da /tmp aber jederzeit gelöscht werden kann,
ist es möglich, durch rekursives Löschen des kompletten Verzeichnisses mit
einem unzerstreuten System weiter zu arbeiten. Ferner ist der Vorteil, dass
im Bereich des /tmp bei einem Absturz häufig ein unzusammenhängendes
Dateisystem entsteht. Da das komplette Dateisystem /tmp bedenkenlos
gelöscht werden kann, ist der Schaden nur gering.
Optimierung des Dateisystems
Überfüllung der Dateisysteme vermeiden
Fragmentierung beseitigen
Defragmentierungssoftware, wie man sie vom PC her kennt, wird der eine oder
andere unter UNIX vielleicht vermissen. Der Grund dafür ist, dass man sie
unter UNIX normalerweise nicht braucht. Gibt es tatsächlich Grund zu der
Annahme, dass man die Platte durch Fragmentierung zu langsam ist, wird man
über kurz oder lang eine größere Platte kaufen und die Daten beispielsweise
per tar auf die neue Platte kopieren. Bei diesem Neuaufspielen
der Daten werden alle Fragmentierungen beseitigt. Alternativ können Sie
natürlich auch eine Bandsicherung durchführen, mit mkfs oder
newfs ein neues Dateisystem erstellen und die Bandsicherung
zurückholen.
Blockgröße
nur auf älteren Systemen
Auf älteren Systemen kann man die Blockgröße noch selbst als Parameter beim
Erzeugen des Dateisystems mit mkfs festlegen.
Typischerweise liegt sie zwischen 512 Byte und 4 KB. Je grösser der Block ist,
den das System mit einem mal liest, desto geringer wird der Einfluss der
langsamen Plattenzugriffe auf die gesamte Dateioperation. Ab einer gewissen
Blockgrösse allerdings kippt dieser Wert wieder, wenn zu oft mehr geladen
wird, als tatsächlich benötigt wird.
Verteilung auf mehrere Platten
Spurwechsel durch Verteilung verringern
Besitzt man mehrere physische Platten, kann man durch geschicktes Verteilen
der Dateien
einen Performancegewinn erzielen. Wenn zwei ständig im Wechsel zugegriffene
Dateien auf einer Platte liegen, muss der Schreiblesekopf des Laufwerkes
ständig zwischen diesen beiden Dateien hin- und herpositionieren. Kann man
die beiden Dateien auf zwei Platten verteilen, werden diese Positionierungen
eingespart. Gerade unter UNIX ist das Verteilen auf mehrere Platten extrem
einfach.
Durch einen symbolischen Link merken die zugreifenden Programme nicht einmal,
dass eine Datei nicht mehr an der ursprünglichen Stelle liegt. Die
Indirektion durch den Link ist minimal und wird auch nur einmal beim Öffnen
benötigt. Danach arbeitet das Programm mit einem Dateihandle direkt auf der
Datei.
Eigenes Dateisystem für /tmp
Eigenes Dateisystem
Ist ein eigenes Dateisystem für /tmp nicht praktikabel, sollte man
von Zeit zu Zeit im Single-User-Modus das Verzeichnis komplett entfernen und
wieder neu anlegen, da so auch das Verzeichnis wieder geleert wird.
Insbesondere wenn die Größe des Verzeichniseintrags im ls -ld
auffallend groß ist, sollte man diese Maßnahme ergreifen.
RAM-Disk
Bei den eben erwähnten Entwicklermaschinen, bei denen der Compiler oft
das Verzeichnis /tmp benutzt, wird manchmal zur Beschleunigung
das Verzeichnis in eine RAM-Disk gelegt. Natürlich macht das nur Sinn,
wenn die Maschine üppig mit Speicher ausgestattet ist.
Übervolle Verzeichnisse entsorgen
Verzeichnisse sind linear
Verzeichnisse sind lineare Strukturen. Wird eine Datei angelegt, wird sie
hinten im Verzeichnis angelegt. Die Einträge sind also nicht alphabetisch
geordnet, wie es bei der Anzeige erscheint. Also wird bei der Suche nach einer
Datei die Liste von vorn nach hinten durchgegangen. Da die Suche nach
dem Dateinamen nur relevant wird, wenn die Datei immer wieder geöffnet und
geschlossen wird, fallen Probleme in diesem Bereich nicht so sehr auf.
Wenn Verzeichnisse aber sehr voll werden, werden die Zugriffe immer langsamer.
Besonders kritisch wird es, wenn in Verzeichnissen regelmäßig gelesen und
geschrieben wird.
Verzeichnisgrößen beachten
Ein Zeichen, dass ein Verzeichnis überlastet ist, ist seine Größe. Man kann
dies leicht durch einen ls -ld prüfen. Im Allgemeinen werden die
meisten Verzeichnisse gleich groß sein. Beim /dev und beim /tmp dürfte man
bereits sehen, dass sich darin deutlich mehr Dateien befinden.
Verzeichnisse werden aber niemals wieder kleiner. Um ein Verzeichnis,
in dem viel geschrieben und gelöscht wurde, wieder auf eine normale
Größe zu bringen, sollte man zunächst eine Sicherung der Daten
beispielsweise per
tar durchführen.
Anschließend per rm -r den gesamten Ast inklusive Verzeichnis
löschen und dann die gesicherten Dateien wieder an den Ort zurück holen.
Dabei wird das Verzeichnis neu angelegt.
vmstat Sekundenabstand Wiederholungen |
Der erste Parameter bestimmt, wieviel Zeit in Sekunden zwischen den Ausgaben vergehen soll. Aufgrund der vielen Daten, die erhoben werden, sollte der Abstand nicht allzu gering sein, damit vmstat nicht selbst die Messung verfälscht. Der zweite Parameter bestimmt die Anzahl der Messungen. Multipliziert man die beiden Werte, hat man den Zeitraum, den die Messung abdeckt. vmstat erzeugt eine Ausgabe, die wie die folgende aussieht.
procs memory swap io system cpu r b w swpd free buff cache si so bi bo in cs us sy id 1 0 0 512 12932 90984 116120 0 0 0 0 103 407 5 0 95 1 0 0 512 12932 90984 116120 0 0 0 0 123 502 4 0 96 |
Dabei sind die einzelnen gemessenen Werte:
/usr/lbin/sa/sadc /var/adm/sa/sa`date +%d` |
Darüber hinaus verbirgt er sich im Skript sa1, der normalerweise in die crontab des root eingetragen wird (vgl. Manpage zu sa1).
0 * * * 6,0 /usr/lib/sa/sa1 3600 /var/adm/sa/sa`date +%d` 0 8-17 * * 1-5 /usr/lib/sa/sa1 3600 /var/adm/sa/sa`date +%d` 0 8-17 * * 1-5 /usr/lib/sa/sa1 1200 3 /var/adm/sa/sa`date +%d` 5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 1200 -A |
Der Skript sa2 erzeugt aus den sa-Dateien einen täglichen Bericht in reinem Textformat, die er unter fast gleichem Namen anlegt. Der Präfix ist allerdings hier sar statt sa.
Zu Auswertung der sa-Dateien wird das Kommando sar verwendet. Durch seine Optionen kann bestimmt werden, welche Informationen angezeigt werden.
bread/s, bwrite/s sind die Blockzugriffe zwischen den Systempuffern und der Peripherie.
lread/s, lwrite/s sind die Zugriffe auf die Systempuffer.
%rcache, %wcache ist das Verhältnis zwischen Zugriffen auf den Puffern und der Peripherie.
usr ist die Auslastung durch Anwendungsprogramme, sys ist der Verbrauch durch Systemfunktionen. wio ist das Warten auf I/O Funktionen. Unter idle steht die Zeit, die sich die CPU gelangweilt hat. Diese sollte nur in Ausnahmefällen unter 50% fallen. Insbesondere, wenn dieser Wert über 90% steigt, besteht der Verdacht, dass ein Programm Polling betreibt oder dass das System ein Problem hat.
Gegenmaßnahmen
CPU Systemlast
Die CPU-Last muss nach User- und die Systemlast getrennt beurteilt werden.
Beide haben unterschiedliche Ursachen. Die Systemlast sagt, dass die Maschine
viel Zeit mit Systemaufrufen wie dem Laden von Dateien, der Netzkommunikation
oder ähnlichem zu tun hat. Dabei fließen beispielsweise beim Laden einer Datei
nicht so sehr die Plattengeschwindigkeit, sondern der Aufwand beim Verwalten
der Zugriffe in die CPU-Systemlast. Dazu gehört beispielsweise das Prüfen von
Sperren oder Quota. Eine hohe Systemlast
kann bedeuten, dass zu wenig RAM in der Maschine vorhanden ist und das System
ständig mit dem Swappen befasst ist. Es kann aber auch bedeuten, dass zuwenig
Puffer für die Dateioperationen zur Verfügung steht.
CPU-Last User
CPU-Last im Userbereich bedeutet, dass Programme sich stärker mit ihrem Code
als mit den Daten beschäftigen. Das geht in Ordnung, wenn es Programme sind,
die beispielsweise dreidimensionale Bilder berechnen. Auch bei der Compilierung
auf Entwicklermaschinen können kurzfristig bis zu 100% CPU Auslastung im Userbereich
entstehen. Bei den üblichen Verwaltungsprogrammen auf Servern sind
CPU-Belastungen von 10%-20% bereits relativ viel. Wenn der Wert darüber
hinausgeht, muss man feststellen, welches Programm wieviel CPU-Zeit
beansprucht. Zu diesem Zweck gibt es Programme wie
top,
das quasi eine Hitparade der Prozesse darstellt.
Verfügt man nicht über ein derartiges Programm, kann man auch durch mehrfaches
Anzeigen der Prozessliste mit ps die schuldigen Prozesse finden. Da
ps immer nur die insgesamt angefallene CPU-Zeit anzeigt, muss man
die Differenz der Messungen bilden. Ein Programm, das auffallend viel Zeit
verbraucht, kann entweder völlig durcheinander sein oder durch so genanntes
Polling CPU-Zeit verschwenden.
Diese Seite basiert auf Inhalten aus dem Buch
Arnold Willemer: Wie werde ich UNIX-Guru Verlagsrechte bei galileo computing |
Homepage |
(C) Copyright 2002 Arnold Willemer
|