Wednesday, June 1, 2005

Víc bajtů za stejný peníze (a vice versa)

V Mandrivě 2006 už má prý fungovat deltarpm ze SUSE - tj. stahovat se budou moct diffy balíčků, takže úspory objemu stažených dat budou aspoň 50 %. Ale šetřit se dá už teď.


Na desktopu mi běží Cooker, který se mi aktualizuje pomocí rsync v cronu (mám na disku mirror). Když jsem začal používat rsync, všiml jsem si, že některé soubory se stahují jakoby rychleji, např takový hdlist.cz kolikrát i megabajty za sekundu, přestože moje připojení je řádově jinde. Je to tím, že rsync umožňuje v rámci možností přenášet změny mezi souborem lokálním a souborem na serveru (pokud to server podporuje).

Normálně toho při stahování balíčků nevyužijete, protože se názvy souborů liší jiným číslem verze. Proto jsem si napsal skriptík, který zjistí, které balíčky byly updatovány. Tyto balíčky (ty staré) přejmenuje, dá jim název aktuální verze balíčku. A potom teprve se spustí mirrorování.

Dneska jsem provedl srovnávací pokus. Nejprve jsem vyrobil kopii adresáře, ve kterém je mirror Cookeru. Potom jsem nad originálem spustil klasický úplný mirroring (vynechal jsem soubory končící na .cz, u nich se rozdíly stahují i tak) a poté nad kopií svůj přejmenovávací skript:


klasika:

sent 21 997 bytes received 173 203 233 bytes 37 401.54 bytes/sec



s přejmenováním:

sent 364 139 bytes received 127 506 709 bytes 37 882.05 bytes/sec


1/3 úspora zdarma!




Toto je onen testovací skript, je v něm samozřejmě ještě pár nadbytečnejch věcí, ale jako proof of concept to snad stačí.

#!/bin/bash
root_path="/mnt/mdk/Mandrakelinux-devel/cooker2"
/usr/bin/rsync -avvn --delete-after mandrake.contactel.cz::Mandrakelinux-devel/cooker/i586/ $root_path | grep -v "is uptodate" | grep .rpm$ > seznamrpm
for deleted in $(grep deleting seznamrpm)
do
if [ "$deleted" != "deleting" ]
then
stary_soubor=$root_path/$deleted
deleted_base=`/bin/basename "$deleted"`
deleted_dir=`/usr/bin/dirname "$deleted"`
package_name=`echo $deleted_base | awk 'BEGIN { FS = "-[^-]+-[^-]+rpm$" } ; { print $1 }'`
novy_soubor=$root_path/`grep -v deleting seznamrpm | grep "$deleted_dir/$package_name-[^-]\+-[^-]\+rpm$"`
echo $stary_soubor
echo $novy_soubor
mv -f $stary_soubor $novy_soubor
fi
done
/usr/bin/rsync -avv --delete-after --progress --partial --exclude='*.cz' mandrake.contactel.cz::Mandrakelinux-devel/cooker/i586/ $root_path > log

a pro úplnost klasický rsync, který jsem používal doteď:

/usr/bin/rsync -avv --progress --delete-after --partial --exclude='*.cz' mandrake.contactel.cz::Mandrakelinux-devel/cooker/i586/ /mnt/mdk/Mandrakelinux-devel/cooker >> log

No comments:

Post a Comment