spkg alpha1

Posledně jsem pomlouval pkgtools a vymejšlel fíčury. No a aby to nebyly jen plané řeči, tak je na čase ukázat výsledky mého snažení. Tady jsou...

## Co to je?

Nejdřív jen odstaveček o spkg, pro ty co nečetli mé předchozí příspěvky. Spkg je implementeace pkgtools v C. Jde o nízkoúrovňový nástroj pro instalaci, odstraňování a (v budoucnu) upgrade balíčků pro distribuci Slackware Linux. Spkg má i něco navíc:

- Safe mode - bezpečný režim pro nedůvěryhodné balíčky.
- Rollback - když něco selže při instalaci, tak se provede návrat souborového systému do původního stavu.
- Knihovní funkce pro práci s databází balíčků a souborů.

## Alpha1? Eeeeek!

"Alfa" pro mě znamená že v spkg chybějí zásadní vlastnosti (upgrade). Nikoliv, že je vše sešité horkou jehlou a na bug je možné narazit na každém kroku. Čili není třeba se obávat toho, že by spkg nedělal to co se od něj očekává, či nedejbože padal. Naopak, vlastnosti které jsou naimplementované jsou otestovány. Testování samozřejmě není nikdy dost. Najde se nějaký odvážlivec?

## To byla doba

Jo. Byla. Začal jsem pracovat, takže nebyl čas.

## Takže?

Takže koho nezajímá co je safe mode, proč má spkg funkci bezpečného návratu (taky to někomu připomíná Apollo 13?) a jak se dosáhlo vysoké rychlosti běžných operací může klidně přeskočit k bechmarkům.

Safe mode zabraňuje tomu, aby se při instalaci balíku přepsali jakékoliv v systému již existující soubory nebo adresáře. V tomto režimu by nemělo být možné si poškodit systém pouhou instalací zákeřného balíku. Režim ještě není zcela dokončen. V budoucnu se v tomto režimu nebude spouštět postinstalační skript. (což nijak nebrání vytvoření symlinků, které se běžně ve Slackware vytváří pomocí postinstalačního skriptu, jak uvidíme dále)

Hlavním důvodem pro implementaci rollbacku je, aby nebylo nutné provádět testování konzistence tgz balíku před jeho rozbalením, tak jak to musí dělat installpkg, aby zabránilo neůplné instalaci/upgradu balíku. Pokud se při rozbalování narazí na chybu (která nemusí být způsobená pouze chybou v tgz archivu), prostě se vrátí zpět všechny doposud provedené operace a naplánované operace (takové, které nelze vzít zpět) se prostě neprovedou. Rollback přináší i další zajímavé možnosti, jako je např. bezpečné přerušení prováděné operace uživatelem.

Některé věci, které dělají spkg tak rychlým:

- Jednoprůchodové zpracování tgz souboru.
- Ručně vyladěný parser souborů databáze balíčků.
- Použití JudySL polí pro manipulaci se seznamy souborů.
- Zpracování více balíčků najednou bez nutnosti znovu načítat databázi souborů po každé operaci. (tohle zrychluje hlavně operaci odstraňování více balíčků najednou)
- Minimalizace počtu operací fork() a exec().
- Předzpracování instalačního skriptu a programové vytvoření symlinků.
- Nezávislost na externích programech, kromě shellu pro spouštění postinstalačních skriptů. (dramaticky zmensuje pocet souborů, které je potřeba načíst z disku při prvotním spuštění nějaké operace).
- Vyladěný untar.

## "Benče"

Tady je obsah souboru BENCHMARKS který lze nalézt ve zdrojácích spkg.

    This benchmark compares spkg with pkgtools and plain tar.

    Hardware setup used:

    CPU: Athlon Thunderbird 1GHz
    MEM: 512MB SDRAM 133MHz
    HDD1: Seagate Baracuda 7200.9 80GB
    HDD2: Samsung SP2002H 20GB 7200 rpm
    OS: 'vanilla' linux 2.6.17.2, slackware-current

    Benchmarking methods:

    Before each 'install' benchmark clean ext2 filesystem will be created on
    HDD2 using following command:
      mke2fs /dev/hdb

    Before each benchmarks caches will be flushed using:
      echo 2 > /proc/sys/vm/drop_caches

    All services that could affect result of benchmarks will be stopped.

    Install speed
    ~~~~~~~~~~~~~
    Install/extract all official slackware-current (2006-07-11) packages
    from the installation packages on HDD1 to the root directory on HDD2.

    1)
      spkg -r /data -i */*.tgz

    2)
      installpkg -root /data */*.tgz

    3)
      for f in */*.tgz ; do
        tar xf $f -C /data
      done

    Remove speed
    ~~~~~~~~~~~~
    Remove all 'kde*' packages from the system. ;-)

    1)
      spkg -r /data -d `spkg -r /data -l 'kde*'`

    2)
      ROOT=/data removepkg `spkg -r /data -l 'kde*'`

    Results
    ~~~~~~~

    Install speed:
      1) real 12m 36s, user 2m 3s, sys 51s
      2) real 23m 41s, user 15m 31s, 5m 28s
      3) real 13m 17s, user 1m 46s, sys 56s

    Remove speed:
      1) real 1m 29s, user 3.4s, sys 3.9s
      2) real 27m 49s, user 19m 46s, sys 6m 30s

## Interpretace výsledků

Srovnáním reálných časů, které zahrnují čekání systému na dokončení hardwarových operací, jako je zápis na disk lze získat obrázek o tom jak bude uživatel vnímat zlepšení prezentovaných operací při přechodu na spkg.

Je vidět, že instalace celého systému se zrychlí dvojnásobně. A odstraňování balíčků bude zhruba 18x rychleší.

O kvalitě implementace však vypovídají spíše časy které se tráví mařením cyklů procesoru a ne čekáním na to než se nastavějí hlavičky na harddisku a plotna se dootočí do správné pozice. :-) Čili časy trávené v kernel space (sys) a v user space (user). Sečtením sys a user časů lze zhruba získat obrázek o tom, jak rychle by operace proběhla, kdyby data byly na ramdisku. Případně by se vešly do cache.

Instalace je při tomto srovnání 20x rychlejší a odstranění balíčku pak 210x rychlejší než pomocí pkgtools.

Tato zrychlení se dají pozorovat při instalaci velkého množství malých balíčků jejichž nainstalované soubory se vejdou do cache. Např. výsledky porovnání časů installpkg a spkg -i pro instalaci všech balíčků jedné malé komerční distribuce, která spkg využívá pro instalaci:

Distribuce má 64 balíčků o celkové velikosti 25MB.
spkg: real 4.666s, user 3.086s, sys 1.100s
installpkg: real 1m34s, user 1m10s, sys 24s

Tady už je vidět i vylepšený uživatelský zážitek, a to hned 20x. Důvod je v tom, že se nemusí čekat na páně harddisk, než se uráčí vykonat potřebné pohyby.

## Příště

Příště (doufejme dříve než zase za rok :-) udělám nějaké benchmarky té nejčastěji používané operace: upgradepkg. Protože ve verzi alpha2 již bude naimplementovaná.