Zdeněk Buk - Homepage
-------------------------
Kategorie:
 ·Všechny
 ·Astronomie
 ·Elektronika
 ·Fotografování
 ·Počítače
 ·Ostatní
Další:
 ·O mně...
Počet přístupů:
[CNW:Counter]

Linux Powered
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(ů).)


    zdenek_buk@seznam.cz