[devel] rpm: rsyncable deflate vs LZMA

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Сб Май 31 01:31:09 MSD 2008


On Fri, May 30, 2008 at 03:23:31AM +0400, Alexey Tourbin wrote:
> On Fri, May 30, 2008 at 01:56:10AM +0400, Dmitry V. Levin wrote:
> > On Fri, May 30, 2008 at 01:31:14AM +0400, Alexey Tourbin wrote:
> > [...]
> > > У меня есть идея.  Для выбора точек синхронизации (gzflush) можно
> > > использовать не только "слепой" rsync hint, но и cpio hint -- как
> > > только мы видим cpio magic "070707", мы знаем, что через несколько
> > > байтов будет mtime и потом пойдёт имя и содержимое файла.  То есть
> > > sync можно делать в месте окончания очередного cpio header.
> > 
> > Это заметно снизит степень сжатия, когда в архиве много маленьких файлов?
> 
> Этим можно управлять, чтобы сознательно пропускать только "совсем
> маленькие" файлы.
> 
> > > Правда, я не знаю, даст это что-нибудь в случае с маленькими файлами
> > > или нет.  Это может ничего не дать из-за того, что первые совпавшие
> > > блоки в сжатом виде всё равно могут отличаться (из-за backreferences
> > > в предыдущий блок).
> > 
> > Могут или будут?
> 
> Если сделать как показано ниже, то для пакета man-pages (после повторной
> пересборки) 'speedup 1.09' возрастает до 'speedup 1.19'.  То есть эффект
> от синхронизации сразу после cpio хедера есть, он заметный, но не
> настолько большой, чтобы всё искупать.

Я реализовал более аккуратный cpio хинтинг для rsyncable_gzwrite().

Также появились первые результаты rsyncability тестирования.
А именно, мы тестируем rsyncability двух rpm пакетов, как если
бы они были собраны уже с помощью rsyncable_gzwrite().

test-rsynability glibc-core-2.5.1-alt4.x86_64.rpm glibc-core-2.5.1-alt5.x86_64.rpm => "speedup is 15.99"
test-rsynability glibc-core-2.3.5-alt7.x86_64.rpm glibc-core-2.5.1-alt5.x86_64.rpm => "speedup is 1.00"
test-rsynability glibc-2.3.5-alt7.x86_64.rpm glibc-2.5.1-alt5.x86_64.rpm => "speedup is 1.28"
test-rsynability firefox-2.0.0.13-alt1.x86_64.rpm firefox-2.0.0.14-alt1.x86_64.rpm => "speedup is 1.97"
test-rsynability xorg-x11-server-1.4.0.90-alt17.x86_64.rpm xorg-x11-server-1.4.0.90-alt19.x86_64.rpm => "speedup is 1.48"

Например, "speedup is 1.97" для пакета firefox означает, что примерно
половина кусков между этими двумя пакетами совпадают (если бы эти пакеты
были собраны с rsyncable_gzwrite), а другая половина кусков не совпадает;
так что по размеру придётся скачивать примерно половину фаерфокса.

Вот код для тестирования.

gzdio.c:
#include <stdio.h>
#include <assert.h>
#include <rpmio.h>
int main()
{
	FD_t Fd = Fdopen(fdDup(fileno(stdout)), "w9.gzdio");
	assert(Fd);
	char buf[BUFSIZ];
	size_t n, m;
	while ((n = fread(buf, 1, sizeof(buf), stdin))) {
		m = Fwrite(buf, 1, n, Fd);
		assert(m == n);
	}
	Fclose(Fd);
	return 0;
}

(gzdio.c надо линковать с новым librpmio, в котором сидит
rsyncable_gzwrite).

test-rsynability:
#!/bin/sh -efu
f1="$1" f2="$2"
shift 2
rpm2cpio "$f1" |./gzdio >cpio1.gz
rpm2cpio "$f2" |./gzdio >cpio2.gz
rsync -v -e ./rsync-shell foo:cpio1.gz cpio2.gz

rsync-shell:
shift && exec "$@"
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 197 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20080531/1529c918/attachment-0002.bin>


Подробная информация о списке рассылки Devel