|
Počet přístupů: |
|
|
|
|
|
Testy SMP
(15.02.2001) Kategorie: Počítače
|
Tentokrát jsem testoval výkon dvouprocesorového počítače (SMP) při kompilaci
programů pod Linuxem.
Na čem jsem testoval
Testy probíhaly na počítači se základni deskou Abit BP6, dual CPU Intel Celeron 533MHz, 128MB RAM, WD Caviar 13GB. Zbytek konfigurace (zvukovka, síťovka atd.)
neuvádím, protože se domnívám, že nijak neovlivňuje výsledky testů. Vše běželo pod operačním systémem Redhat Linux 6.2CZ (Kernel 2.2.14-6.0.1SMP).
Konfigurace počítače:
Základní deska: Abit BP6
Chipset: i440BX
BIOS: Award, 04/20/2000 - RU
HDD: Western Digital Caviar 13GB, 136AA
RAM: 128MB
CPU: 2 x Intel Celeron 533MHz
OS: Redhat Linux 6.2CZ (Kernel 2.2.14-6.0.1SMP)
GCC: egcs-2.91.66
Make: GNU Make 3.78.1
Jak jsem testoval
V tomto testu jsem sledoval vliv parametru "-j xx" na rychlost překladu. Tento parametr
(xx znamená číslo) určuje, na kolik současně běžících procesů se kompilace rozdělí.
Celkem jsem překládal tři programy (Kernel-2.2.16, Midnight Commander 4.5.42, RPM-4.0), a u každého
jsem zkoušel parametry "-j 1" až "-j 4".
U všech testů jsem měřil dobu překladu. Protože by to bylo dost pracné (zkoušet všechny ty parametry a stopovat čas),
napsal jsem si pro tyto účely malý Perlový skriptík (test_make.pl, 1.2kB
):
(je to mimochodem můj asi druhý skript v Perlu, takže omluvte prosím případné nedokonalosti)
#!/usr/bin/perl -w
$zacatek = time ();
@parametry = ("-j 1","-j 2","-j 3","-j 4");
@testovane_adresare = ("/usr/src/linux-2.2.16","rpm-4.0","mc-4.5.42");
@casy = ();
open (LOG, ">./test_make.log") or die "Nelze otevrit ./test_make.log !\n";
print LOG"Test rychlosti prekladu (make) v zavislosti na parametru \"-j x\"\n";
@cas = localtime (time); $cas[4]++; $cas[5]+=1900;
print LOG"$cas[3].$cas[4].$cas[5], $cas[2]:$cas[1]:$cas[0]\n\n";
$adr_poc = 0;
foreach $testovany_adresar (@testovane_adresare) {
print "Testovany adresar: \"$testovany_adresar\"\n";
print LOG"\"$testovany_adresar\"\n";
$adr_poc++;
$param_poc=0;
foreach $parametr (@parametry) {
$param_poc++;
system ("cd $testovany_adresar;make clean");
$start_cas = time ();
system ("cd $testovany_adresar;make $parametr");
$stop_cas = time ();
$casy[$adr_poc][$param_poc] = $stop_cas - $start_cas;
# Ukladame do pole pro pripad pozdejsiho zpracovani
print LOG" make $parametr : $casy[$adr_poc][$param_poc] s\n";
}
print LOG"\n";
}
$celkem = time () - $zacatek;
print LOG"$celkem s\n[end]";
close(LOG);
Celkem jsem tedy měřil dobu překladu celkem tří programů (viz. níže) a to každý čtyřikrát (-j 1 až 4).
Výsledky se pokusím pokud možno přehledně zapsat do tabulek.
Výsledky testů
|
make -j 1
|
make -j 2
|
make -j 3
|
make -j 4
|
Čas
|
Čas
|
rel.výkon
|
Čas
|
rel.výkon
|
Čas
|
rel.výkon
|
Kernel-2.2.16
|
248s
|
139s
|
+78,4%
|
140s
|
-0,7%
|
140s
|
0%
|
rpm-4.0
|
158s
|
95s
|
+66,3%
|
95s
|
0%
|
94s
|
+1,1%
|
mc-4.5.42
|
200s
|
124s
|
61,3%
|
123s
|
+0,8%
|
123s
|
0%
|
"rel.výkon" určuje procentuální nárůst výkonu oproti předchozímu sloupci
Zhodnocení výsledků
Jak je docela dobře vidět z tabulky, vliv parametru "-j xx" když "xx" je 2 (počet procesorů) je nárůst výkonu
dost velký (až 78,4%). Pokud "xx" dále zvětšujeme (je větší než počet procesorů) má to na rychlost překladu
minimální vliv, což je celkem logické, protože každý proces (každá kopie gcc v paměti) si "vezme" pokud možno
co nejvíce výkonu CPU, a když je současně spuštěno více kopií gcc než je počet CPU, musejí se o procesorový čas
dělit a na celkový výkon se tím pádem už nezvětší.
Je docela dobré zmínit to, že výše diskutovaný parametr se projevuje (znatelně) až u větších proojektů.
Pokud budeme překládat projekt, který má třeba jen jeden zdrojový soubor, nebude mít program "make" co rozdělovat do více,
současně běžících, procesů. Ale u tak malých projektů je doba překladu většinou tak malá, že ani není potřeba překlad
nějak urychlovat.
Občasný malý nárůs výkonu při "xx" větším než počet procesorů si vysvětluji tím, že pokud jsou současně spuštěny tři kopie gcc,
je malá pravděpodobnost, že skončí současně dvě, nebo dokonce všechny tři, a tím pádem třetí spuštěné gcc "zaplňuje"
nevyužitý procesorový čas mezi skončením jednoho gcc a spuštěním dalšího - to znamená, že počítač ani cvíli nezahálí.
(Sledoval jsem překlad v programu "top", který umí třídit výpis procesů podle zatížení procesoru(ů).)
|
|
|
|