Da Linux auch auf dem Desktop-Sektor immer mehr Bedeutung gewinnt, werden an Linux auch immer größere Ansprüche gestellt. Von Haus aus ist Linux so wie jedes andere Betriebssystem nicht perfekt und muss noch ein bisschen eingestellt werden, um die optimale Power aus dem Computer herauszuholen.
Viele Desktopuser sehen die Reaktionsgeschwindigkeit ihres Systems als sehr wichtig an, und da es ja immer mehr Linux-Desktop-PCs gibt, will ich hier ein paar Tipps & Tricks vorstellen, wie man seinem System ein bisschen mehr gefühlte Power verpassen kann.
1.) Hardware
Wenn die Hardware schlecht eingestellt ist, wird alles andere natürlich auch nicht mehr besser...man sollte bei der Hardware darauf achten, dass alles im System gut gekühlt ist, seinen PC ab und an mal auch innen entstauben und vor allem auch im BIOS darauf achten, dass alles richtig eingestellt ist.
Wer in seinem PC Grafik-, Sound-, TV- oder sonstige MultiMedia-Karten hat, sollte auch darauf achten, dass die Interrupt-Verteilung stimmt. Hier gibt es insbesondere mit TV-Karten oft heftige Probleme.
Die aktuelle IRQ-Belegung in eurem PC kriegt ihr mit einem einfachen "cat /proc/interrupts" in einem Terminal heraus.
Zuersteinmal sollten Grafik- und Soundkarten auf jeden Fall einen IRQ für sich bekommen, am besten auch einen mit hoher Priorität. Die Rangabfolge der IRQs ist folgende (höchste zuerst, niedrigste zuletzt): 0, 1, 8, 9, 10, 11, 12, 13, 14, 15, 3, 4, 5, 6, 7 .
PCI-Karten können in "normalen" PCs normalerweise die IRQs 9, 10 oder 11 bekommen. Sollten die IRQs nicht optimal verteilt sein, hilft meist nur die Karten in andere PCI-Slots umzusetzen, die IRQs sind bei den meisten Boards fest mit bestimmten Slots gekoppelt, teilweise kann man auch im BIOS Slots bestimmte IRQs zuweisen.
2.) Der Kernel
Ohne einen gut konfigurierten Kernel kann das System auch träge werden, man sollte bei der Konfiguration vor allem auf folgendes achten:
Processor type and features -->
_Processor family -->
__<Hier eure CPU auswählen>
_Preemption Model --->
__[*] Preemptible Kernel (Low-Latency Desktop)
_[*] Preempt The Big Kernel Lock
_Timer frequency -->
__[*] 1000 Hz
Außerdem können auch Patchsets wie z.B. das -ck Patchset, die die Latency des Systems verbessern sollen, nützlich sein. Beim -ck Patchset ist u.a. ein Patch enthalten, mit dem man 1 GB RAM voll nutzen kann, ohne den langsameren HighMem-Support aktivieren zu müssen und ein anderer Patch, der es Anwendungen von normalen Usern erlaubt, mit höherer Priorität zu laufen - nützlich bei MultiaMedia-Anwendungen wie xmms, xine oder dergleichen.
Aktuell in der Entwicklung befindet sich eine extremere Variante der Preemption-Optionen, die es momentan im Kernel gibt - mit ihr sollen Systeme annähernd Realtime-Reaktionen erreichen.
Beta-Patches gibt es auf der RedHat-FTP Seite von Ingo Molnar (http://people.redhat.com/mingo/realtime-preempt/), ich rate allerdings von der Beutzung ab, da das Risiko für Kernel Panics sehr hoch ist. In der Zukunft wird dieser Patch aber sehr wahrscheinlich äußerst interessant werden.
/!\ Achtung: Der 1GB-LowMem-Patch verursacht in Verbindung mit bestimmten Programmen Probleme, bekannte Probleme sind, dass VMware nicht läuft, xine mit Win32-Plugins und TightVNC unvorhersehbare Crashs produzieren.
3.) UserSpace-Software
Wer sich ein bisschen mit PCs auskennt, weiss, dass PCI-Karten eine individuelle Einstellung, genannt "Latency Timer", haben, über die geregelt wird, wie lange eine Karte Daten über den PCI-Bus schicken darf, bevor eine andere zum Zug kommt.
Im BIOS der meisten PCs kann man diesen Timer nur allgemein einstellen, die Karten individuell zu konfigurieren ist aber mit Linux problemlos möglich.
Mit den Tools "lspci" und "setpci" können diese Einstellungen ausgelesen und verändert werden. Man holt sich dazu die Adresse der jeweiligen Karte mit lspci und stellt den Timer dann mit setpci ein, hier ein kleines Beispiel:
Code:
# lspci -v
[...]
02:0c.0 Multimedia controller: Philips Semiconductors SAA7146 (rev 01)
Subsystem: Technotrend Systemtechnik GmbH Technotrend/Hauppauge DVB card rev2.1
Flags: bus master, medium devsel, latency 32, IRQ 9
Memory at feafd400 (32-bit, non-prefetchable) [size=512]
[...]
Das ist meine TV-Karte, die von einer größeren latency als der üblichen 32 extrem profitieren kann. Die Adresse der Karte ist hier mit "02:0c.0" angegeben, nun stellen wir die latency auf 192 hoch, zu beachten ist hier lediglich, dass die Werte als Hexadezimalzahlen übergeben werden müssen und das Maximum bei 248 = f8 liegt. (Größere Werte werden auf 248 gesetzt, es gibt also keine Probleme wenn ihr auf die Schnelle zB ff als Maximum setzt)
Code:
# setpci -v -s 02:0c.0 latency_timer=c0
02:0c.0:0d c0
# lspci -v
[...]
02:0c.0 Multimedia controller: Philips Semiconductors SAA7146 (rev 01)
Subsystem: Technotrend Systemtechnik GmbH Technotrend/Hauppauge DVB card rev2.1
Flags: bus master, medium devsel, latency 192, IRQ 9
Memory at feafd400 (32-bit, non-prefetchable) [size=512]
[...]
Wer sich ein bisschen mit Scripts auskennt kann das nun dynamisch regeln lassen, je nachdem welche Programme laufen. Das folgende Script übernimmt diese Aufgabe und stellt alle 60 Sekunden die Latenzen, falls erforderlich, optimal ein.
/!\ Achtung! Im folgenden Script unbedingt die Adressen der Karten anpassen, diese können wie oben beschrieben über lspci -v ermittelt werden!
Eigene Programme können natürlich einfach hinzugefügt werden, ich habe ein paar Beispiele in das Script reingepackt. (Details siehe nächster Post)
Ich übernehme natürlich auch keinerlei Verantwortung dafür, was die Benutzung dieses Scripts evtl als Folgen nach sich ziehen könnte!
Code:
#! /bin/sh
echo "PCI LATENCY BOOSTER"
echo " v 0.1"
echo ""
VGA_ADDR="01:00.0"
DVB_ADDR="02:0c.0"
SND_ADDR="02:0b.0"
SATA_ADDR="02:0a.0"
NIC_ADDR="02:08.0"
VAL_ULTRA="c0"
VAL_HIGH="90"
VAL_MED="40"
VAL_LOW="20"
VGA_VAL=$VAL_HIGH
DVB_VAL=$VAL_LOW
SND_VAL=$VAL_LOW
SATA_VAL=$VAL_LOW
NIC_VAL=$VAL_LOW
VGA_VAL_OLD="0"
DVB_VAL_OLD="0"
SND_VAL_OLD="0"
SATA_VAL_OLD="0"
NIC_VAL_OLD="0"
KILLVAR="0"
while [ KILLVAR != "1" ]; do
DATEVAR=`date '+%Y-%m-%d %H.%M'`
VGA_VAL=$VAL_HIGH
DVB_VAL=$VAL_LOW
SND_VAL=$VAL_LOW
SATA_VAL=$VAL_LOW
NIC_VAL=$VAL_LOW
XINEVAR=`ps -A | grep xine`
if [ -n "$XINEVAR" ]; then
VGA_VAL=$VAL_ULTRA
SND_VAL=$VAL_HIGH
fi
XMMSVAR=`ps -A | grep xmms`
if [ -n "$XMMSVAR" ]; then
SND_VAL=$VAL_HIGH
fi
VDRVAR=`ps -A | grep vdr`
if [ -n "$VDRVAR" ]; then
DVB_VAL=$VAL_ULTRA
SATA_VAL=$VAL_MED
fi
PROJECTXVAR=`ps -A | grep projectx`
if [ -n "$PROJECTXVAR" ]; then
SATA_VAL=$VAL_HIGH
fi
GAMEVAR=`ps -A | grep -e ut2004 -e cedega`
if [ -n "$GAMEVAR" ]; then
VGA_VAL=$VAL_ULTRA
SND_VAL=$VAL_HIGH
fi
# -----------------------------------------------
if [ $VGA_VAL != $VGA_VAL_OLD ]; then
/sbin/setpci -v -s $VGA_ADDR latency_timer=$VGA_VAL > /dev/null 2>&1
echo "VGA : "$VGA_VAL" ["$DATEVAR"]"
fi
if [ $DVB_VAL != $DVB_VAL_OLD ]; then
/sbin/setpci -v -s $DVB_ADDR latency_timer=$DVB_VAL > /dev/null 2>&1
echo "DVB : "$DVB_VAL" ["$DATEVAR"]"
fi
if [ $SND_VAL != $SND_VAL_OLD ]; then
/sbin/setpci -v -s $SND_ADDR latency_timer=$SND_VAL > /dev/null 2>&1
echo "SND : "$SND_VAL" ["$DATEVAR"]"
fi
if [ $SATA_VAL != $SATA_VAL_OLD ]; then
/sbin/setpci -v -s $SATA_ADDR latency_timer=$SATA_VAL > /dev/null 2>&1
echo "SATA: "$SATA_VAL" ["$DATEVAR"]"
fi
if [ $NIC_VAL != $NIC_VAL_OLD ]; then
/sbin/setpci -v -s $NIC_ADDR latency_timer=$NIC_VAL > /dev/null 2>&1
echo "NIC : "$NIC_VAL" ["$DATEVAR"]"
fi
VGA_VAL_OLD=$VGA_VAL
DVB_VAL_OLD=$DVB_VAL
SND_VAL_OLD=$SND_VAL
SATA_VAL_OLD=$SATA_VAL
NIC_VAL_OLD=$NIC_VAL
sleep 60
done
Das Script muss natürlich als Root laufen oder zumindest mit sudo gestartet werden...setpci mit chmod auf suid zu setzen ist sicherlich keine gute Idee!!!
Wer diese Tipps berücksichtigt und sein System entsprechend einstellt wird sicherlich einen Vorteil davon haben
Anmerkungen, Verbesserungen oder andere Tipps sind hier natürlich mehr als nur Willkommen
Links zum Thema:
-ck Patchset von Con Kolivas
Einsatzmöglichkeiten für -ck, nützliche Tipps
Realtime-Preemption Patches von Ingo Molnar
Linux hardware stability guide, part 1
Linux hardware stability guide, part 2
Shutdown
Lesezeichen