Aus Linux-Magazin 11/2001

Mit AMD K6/2+ und Linux alte Motherboards beschleunigen

Linux hat den Ruf, auch auf älterer Hardware ressourcensparend zu laufen. Wie man Sockel-7-Boards bis an ihre Leistungsgrenze ausreizt und trotzdem Energie spart, beschreibt dieser Artikel.

In manchem nicht mehr ganz taufrischen Rechner fristet noch ein Sockel-7-Mainboard sein Dasein. Diese Boards sind ausgezeichnet geeignet für eine ganze Reihe von Prozessoren, die teilweise nicht mehr hergestellt werden und recht preiswert auf dem Gebrauchtmarkt zu bekommen sind.

Die meisten dieser CPUs sind auch wirklich nicht mehr zeitgemäß – ein Intel Pentium 233 MMX oder Cyrix 6×86 P166 bietet nicht mehr die ultimative Leistung, außer vielleicht für kleine Serverdienste im Hintergrund, die nicht allzu viel Rechnerleistung benötigen, etwa Mail, News und Firewall.

Als Arbeitsrechner braucht es heute leider auch unter Linux etwas mehr Pferdestärken – und da liegt es nahe, sein altes Sockel-7-Board mit einem der aktuelleren AMD-Mobile-Prozessoren [1] zu veredeln. Konkret geht’s hier um das Motherboard Tyan Trinity 100AT. Mit etwas Geschick und Mut zum Übertakten sind immerhin 600 MHz Taktfrequenz drin (vorausgesetzt, der Front Side Bus läuft mit 100 MHz). Diese CPUs haben einen Level-2-Cache von 128 KByte (K6/2+) oder gar 256 KByte (K6/III+), der mit voller Core-Frequenz läuft.

Tatsächlich beherbergt der K6/2+ einen K6/III+-Kern und hat lediglich den kleineren L2-Cache (siehe die Ausgabe von “cat /proc/cpuinfo” in Listing 2). Der Cache des Mainboards wird damit zum Level-3-Cache.

Ultima Ratio für Sockel 7

Nur der K6/III+ wird noch gefertigt, er ist jedoch kaum einzeln erhältlich, weil AMD ihn normalerweise nur an OEMs von Notebooks verkauft. Der K6/2+ ist nicht mehr im offiziellen Handel, aber gelegentlich bei Internetauktionen für vergleichsweise wenig Geld zu bekommen, jedenfalls ist er erheblich preiswerter als der K6/III+.

Abbildung 1: Der AMD K6/2+ / 500 lässt sich bei ausreichender Kühlung auf manchen Boards bis 600 MHz übertakten.

Abbildung 1: Der AMD K6/2+ / 500 lässt sich bei ausreichender Kühlung auf manchen Boards bis 600 MHz übertakten.

Wohl gemerkt, für einen ähnlichen Preis bekommt man auch einen AMD Duron mit höherer Taktrate, aber der läuft natürlich nicht in einem Sockel-7-Board. In dem Fall wäre gleich der Austausch des Boards erforderlich, was nicht nur mehr kostet, sondern möglicherweise auch den Tausch von Peripheriekarten nach sich zieht, weil es beispielsweise keine ISA-Slots mehr hat.

Höchstwahrscheinlich billiger ist daher die Anschaffung eines solchen Notebook-Prozessors, um den irgendwann allerdings doch unvermeidlichen Totalumbau noch so weit wie möglich hinauszuschieben.

Listing 2: So meldet sich der AMD K6/2+

processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 5
model           : 13
model name      : AMD-K6(tm)-III Processor
stepping        : 4
cpu MHz         : 551.254
cache size      : 128 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr mce cx8 pge mmx syscall 3dnowext 3dnow k6_mtrr
bogomips        : 1101.00

Die Wahl fiel für den hier beschriebenen Umbau auf einen AMD K6/2+. Diesen Typ bekommt man relativ leicht in der 500- oder gar 550-MHz-Version, während der K6/III+ nur bis 500 MHz gefertigt wird. Da sich der K6/2+ außerdem wegen des kleineren Caches etwas besser übertakten lässt, ist ein K6/2+ mit 550 oder gar 600 MHz mindestens genauso schnell wie ein K6/III+ bei 500 oder 550 MHz – und das bei ungefähr halbem Preis.

Diese CPUs fertigt(e) AMD übrigens in der 0.18-µ-Technik, sie sind speziell auf möglichst niedrigen Energieverbrauch ausgelegt. Auch bei moderatem Übertakten werden sie daher nicht wärmer als die normalen K6/2 bei ihrer nominalen Taktrate, da sie rund ein Drittel weniger Leistung brauchen. Dennoch bleibt es selbstverständlich, dass man bei der Kühlung keineswegs spart und dem Paar CPU und Kühlkörper noch etwas Wärmeleitpaste spendiert!

Übertakten auf eigenes Risiko

Es soll hier niemand zum Übertakten animiert werden – der Betrieb außerhalb der Spezifikation geschieht immer auf eigenes Risiko. Wie weit sich ein Gespann aus CPU und Mainboard hochtakten lässt, muss die Praxis zeigen. Am besten tastet man sich schrittweise an die Grenze heran und stresst den Rechner immer ein wenig, indem man etwa testweise einen Kernel übersetzt. Wird es knapp, fängt der GCC an, “SIG11”-Fehler zu werfen oder die Pipe zum Assembler stirbt ab und an. So instabil sollte der Rechner nicht laufen! Dann lieber einen Gang zurückschalten.

Die BIOS-Versionen älterer Boards kennen freilich diese Prozessoren nicht. Für die optimale Nutzung der CPU unter Linux (MTRR et cetera) spielt das keine Rolle, aber es sieht schon besser aus, wenn der Rechner beim Booten den korrekten Typ anzeigt. Von den Herstellern ist hier keine Hilfe zu erwarten, aber wie immer helfen Kollegen im Internet. Jan Steunebrink aus Holland hält auf seiner Webseite [2] speziell gepatchte BIOSse für alle möglichen Boards bereit. Auch wenn er natürlich keine Garantie geben kann, für mein Board funktioniert’s.

Die meisten Sockel-7-Boards können den Multiplikationsfaktor für den Core-Takt von 2.0 bis 5.5 einstellen; moderne AMD-CPUs mit CXT-Kern (AMD-Codename Sharptooth) interpretieren hierbei die Einstellung “2.0” als “6.0”. Welche das sind, lässt sich anhand der Markierungen [6] erkennen – hier ist gerade beim Gebrauchtkauf Vorsicht geboten, dass man keinen Ladenhüter angedreht bekommt.

Richtige Core-Spannung unerlässlich

Wichtig ist auch eine geeignete Spannungsversorgung: Diese CPUs laufen mit einer Core-Spannung von 1,4 bis 2,0 Volt. Wenig Probleme bereiten bis zu drei Jahre alte Motherboards mit VIA VP3- oder MVP3-Chipsatz, da der Spannungsregler in vielen Fällen zumindest 2,1 Volt unterstützt. Einige ältere Boards wie das Tyan Trinity 100AT haben einen Bug in der Core-Spannungs-Erzeugung, sie liefern in der Einstellung 2,0 Volt eine viel zu niedrige Spannung, so dass der Rechner gar nicht erst anläuft. 2,1 Volt sind aber in der Regel tolerabel.

Manche Boards bieten nur 2,2 Volt und mehr an, aber häufig kann man durch Beschalten mehrerer Jumper (und damit Parallelschalten einiger Widerstände im Reglerschaltkreis) auf ungefähr 2 Volt kommen. Hier hilft nur etwas Recherche im Internet – für die meisten Boards gibt es Übersichten undokumentierter Jumper-Einstellungen.

Prozessortakt softwaremäßig einstellen

So richtig interessant sind diese CPUs vor allem durch ihre Fähigkeit, per Software den Multiplikationsfaktor unabhängig von der Jumperstellung im laufenden Betrieb und ohne spürbare Unterbrechung umzuschalten. Das kann Intels Speedstep natürlich auch, tut das aber in Hardware und durchaus nicht unbedingt angepasst für das laufende Betriebssystem.

Für die AMD-Prozessoren gibt es ein unter Linux ablauffähiges Tool namens K6mult [3], das über den Zugriff auf die Model-Specific Registers (MSRs) den Multiplikator setzt oder liest. Dazu muss MSR-Support in den Kernel kompiliert sein (“CONFIG_X86_MSR”); als Modul geht es auch. Außerdem braucht K6mult für den eigentlichen Zugriff eine Device-Datei namens “/dev/cpu/%d/msr”, wobei “%d” die Nummer der CPU ist. Auf Single-Prozessor-Maschinen ist “%d” immer “0”. Dieses Device kann der Administrator mit

mknod /dev/cpu/0/msr c 202 0

anlegen. Wer den MSR-Support als Modul konfiguriert hat, kann es mit dem folgenden Eintrag in “/etc/modules .conf” bei Bedarf auch automatisch laden lassen:

alias char-major-202      msr

Die Bedienung von K6mult ist an Einfachheit nicht zu überbieten: Mit “k6mult 5.5” beispielsweise stellt man seine CPU auf einen Takt von 550 MHz (bei 100 MHz FSB-Takt) ein. “k6mult r” liest die MSR aus und zeigt den momentan gesetzten Multiplikator an. Letzteres leistet “k6mult” allerdings nicht in der auf [3] erhältlichen Version; eine gepatchte ist auf unserem FTP-Server [7] erhältlich.

Na schön – nun wäre es noch sehr praktisch, wenn der Rechner seine Taktrate je nach Last selbsttätig einstellen könnte. In diesem Fall würde er beispielsweise bei geringer Last nur mit 200 statt der vollen 550 oder 600 MHz laufen, was in der Praxis kaum auffällt. Bei einem Compilerlauf aber könnte er mit Volldampf rennen.

Und jetzt das Ganze automatisch

Genau das leistet ein kleiner, in Perl geschriebener Wrapper-Daemon für K6mult, der sich aus “/proc/loadavg” die aktuelle Prozessorlast holt und beim Über- oder Unterschreiten einer jeweils vorgegebenen Grenze auf den niedrigen oder hohen Takt schaltet.

Listing 1: PowerNow.pl

01 #!/usr/bin/perl
02 
03 # PowerNow.pl
04 # daemon wrapper around k6mult by Leigh L. Klotz, Jr. 
05 #
06 # Copyright (C) 2001 Harald Milz 
07 # Licensed under the terms of the GNU GPL License version 2.
08 #
09 # run in the background from /etc/rc.d/boot.local
10 # or another appropriate place
11 # e.g. PowerNow.pl [ options ] &
12 
13 use Getopt::Std;
14 use Sys::Syslog qw(:DEFAULT setlogsock);
15 
16 $loadavg = "/proc/loadavg";
17 $k6mult = "/usr/local/sbin/k6mult";
18 $progname = `basename $0`;
19 
20 getopts ('sdt:T:c:C:');
21 
22 # we need all 4 parameters
23 # -c is the lower clock multiplier, e.g. 2.0 which is set
24 # when the average load is below the lower threshold -t (e.g. 0.4)
25 # -C is the higher clock multiplier, e.g. 5.5 which is set
26 # when the average load is above the upper threshold -T (e.g. 0.5)
27 # -d sets debug mode (spits out stuff on stdout)
28 # -s set syslog mode.
29 
30 if (!$opt_c || !$opt_C || !$opt_t || !$opt_T) {
31   print "syntax: $0 -c  -C  
32 t-t  -T  [ -d ] [ -s ]
33 twhere -d is "debug" mode and -s uses syslogn";
34   exit (-1);
35 }
36 
37 $mult = $old_mult = 0;
38 
39 # start syslog if required
40 
41 if ($opt_s) {
42   setlogsock "unix";
43   openlog $progname, "pid", "LOG_DAEMON";
44   syslog "LOG_INFO", "%s", "startup";
45 }
46 
47 # we need to catch several signals to stop it gracefully.
48 
49 sub catch_zap {
50   if ($syslog) {
51     syslog "LOG_INFO", "%s", "shutdown";
52     closelog;
53   }
54   exit 0;
55 }
56 
57 $SIG{INT} = $SIG{TERM} = $SIG{QUIT} = $SIG{HUP} = &catch_zap;
58 
59 # endless loop;
60 
61 while (1) {
62   open (LOAD, "<$loadavg") || die "cannot open $loadavg for read: $!n";
63   ($l1, @rest) = split (/ /, );
64   close LOAD;
65 
66   print "last 1 minute: $l1n" if $opt_d;
67 
68   # if above the upper threshold: fast mode 
69   # if below the lower threshold: slow mode 
70   # this way we have a hysteresis which prevents oscillation.
71   if ($l1 > $opt_T) {
72     $mult = $opt_C;
73   } elsif ($l1 < $opt_t) {
74     $mult = $opt_c;
75   }
76 
77   if ($mult != $old_mult) {
78     system ("$k6mult $mult");
79     print "$k6mult $multn" if $opt_d;
80     syslog "LOG_INFO", "%s %1.1f", "set multiplier to", $mult if $opt_s;
81     $old_mult = $mult;
82   }
83 
84   # once every 5 seconds is enough ...
85   sleep 5;
86 }
87 
88 # never reached

“PowerNow.pl” (Listing 1) startet am besten aus einer Startdatei unter “/etc /rc.d” mit etwa folgendem Aufruf:

PowerNow.pl -c 2.0 -C 5.5 -t 0.4 -T 0.5 -s &

Die einzelnen Parameter haben die folgende Bedeutung: “-c” setzt die niedrige Taktrate, “-C” die hohe. Mit “-t” und “-T” lässt sich die niedere und die obere Umschaltschwelle einstellen. Sinnvollerweise wählt man für beide nicht den gleichen Wert und “-T” sollte zudem größer sein als “-t”.

Obwohl das Tool immer den durchschnittlichen Lastwert der letzten Minute berücksichtigt, sind Schwingungen um den Umschaltpunkt nicht auszuschließen, was man mit einer kleinen Hysterese vermeiden kann. Die Logik ist so, dass das Tool beim Überschreiten der oberen Schwelle auf den hohen Takt umschaltet, respektive beim Unterschreiten der unteren Schwelle auf den Spargang. Die optimalen Umschaltpunkte muss jeder selbst in der Praxis ermitteln.

“-s” schließlich sorgt dafür, dass “PowerNow.pl” seine Aktivitäten ins Syslog schreibt und mit “-d” kann man sich ein paar Debug-Informationen auf die Konsole ausgeben lassen.

Damit “PowerNow.pl” K6mult findet, muss zuvor der Pfad in der Variablen “$k6mult” angepasst werden. Das Skript ist nicht schön, erfüllt aber seinen Zweck auf dem Testrechner seit Wochen ohne Beanstandungen. Und dran denken: Immer cool bleiben!

Infos

[1] AMD-Mobile-CPUs: [http://www.amd.com/products/cpg/mobile/mobilearch.html]

[2] Gepatchte BIOSse: [http://web.inter.nl.net/hcc/J.Steunebrink/S1590-K6-III+.htm

[3] K6mult: [http://graflex.org/linux/k6mult/]

[4] Linux auf K6/2+: [http://linuxsavvy.com/staff/jgotts/k6-2+/]

[5] Weitere Online-Artikel: [http://www.de.tomshardware.com/cpu/00q3/000704/index.html], [http://www.de.tomshardware.com/cpu/00q4/001020/index.html]

[6] Markierungen von K6/2-CPUs: [http://cpusite.examedia.nl/docs/k6-2markings.html]

[7] Gepatchtes K6mult und PowerNow.pl: [ftp://ftp.linux-magazin.de/pub/magazin/2001/11/AMDK6/]

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben