Re: upload-pack is slow with lots of refs
- From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- Date
- Oct 3, 2012, 23:54 UTC
- Message-ID
- <CACBZZX5Sm++Wjyoue-qk7TjwxUM3QihXfWGtEHhOq=VtkgvNbQ@mail.gmail.com>
- In-Reply-To
- <20121003231529.GA11618@sigill.intra.peff.net>
On Thu, Oct 4, 2012 at 1:15 AM, Jeff King <peff@peff.net> wrote:
Show 45 quoted lines
> On Thu, Oct 04, 2012 at 12:15:47AM +0200, Ævar Arnfjörð Bjarmason wrote:
>
>> I think he was wrong, I tested this on git.git by first creating a lot
>> of tags:
>>
>> parallel --eta "git tag -a -m"{}" test-again-{}" ::: $(git rev-list HEAD)
>>
>> Then doing:
>>
>> git pack-refs --all
>> git repack -A -d
>>
>> And compiled with -g -O3 I get around 1.55 runs/s of git-upload-pack
>> on 1.7.8 and 2.59/s on the master branch.
>
> Thanks for the update, that's more like what I expected.
>
>> FWIW here are my results on the above pathological git.git
>>
>> $ uname -r; perf --version; echo 0000 | perf record
>> ./git-upload-pack .>/dev/null; perf report | grep -v ^# | head
>> 3.2.0-2-amd64
>> perf version 3.2.17
>> [ perf record: Woken up 1 times to write data ]
>> [ perf record: Captured and wrote 0.026 MB perf.data (~1131 samples) ]
>> 29.08% git-upload-pack libz.so.1.2.7 [.] inflate
>> 17.99% git-upload-pack libz.so.1.2.7 [.] 0xaec1
>> 6.21% git-upload-pack libc-2.13.so [.] 0x117503
>> 5.69% git-upload-pack libcrypto.so.1.0.0 [.] 0x82c3d
>> 4.87% git-upload-pack git-upload-pack [.] find_pack_entry_one
>> 3.18% git-upload-pack ld-2.13.so [.] 0x886e
>> 2.96% git-upload-pack libc-2.13.so [.] vfprintf
>> 2.83% git-upload-pack git-upload-pack [.] search_for_subdir
>> 1.56% git-upload-pack [kernel.kallsyms] [k] do_raw_spin_lock
>> 1.36% git-upload-pack libc-2.13.so [.] vsnprintf
>>
>> I wonder why your report doesn't note any time in libz. This is on
>> Debian testing, maybe your OS uses different strip settings so it
>> doesn't show up?
>
> Mine was on Debian unstable. The difference is probably that I have 400K
> refs, but only 12K unique ones (this is the master alternates repo
> containing every ref from every fork of rails/rails on GitHub). So I
> spend proportionally more time fiddling with refs and outputting than
> I do actually inflating tag objects.An updated profile with your patch:
$ uname -r; perf --version; echo 0000 | perf record
./git-upload-pack .>/dev/null; perf report | grep -v ^# | head
3.2.0-2-amd64
perf version 3.2.17
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.015 MB perf.data (~662 samples) ]
14.45% git-upload-pack libc-2.13.so [.] 0x78140
12.13% git-upload-pack [kernel.kallsyms] [k] walk_component
11.01% git-upload-pack libc-2.13.so [.] _IO_getline_info
10.74% git-upload-pack git-upload-pack [.] find_pack_entry_one
8.96% git-upload-pack [kernel.kallsyms] [k] __mmdrop
8.64% git-upload-pack git-upload-pack [.] sha1_to_hex
6.73% git-upload-pack libc-2.13.so [.] vfprintf
4.07% git-upload-pack libc-2.13.so [.] strchrnul
4.00% git-upload-pack libc-2.13.so [.] getenv
3.37% git-upload-pack git-upload-pack [.] packet_write> Hmm. It seems like we should not need to open the tags at all. The main > reason is to produce the "peeled" advertisement just after it. But for a > packed ref with a modern version of git that supports the "peeled" > extension, we should already have that information.
B.t.w. do you plan to submit this as a non-hack, I'd like to have it in git.git, so if you're not going to I could pick it up and clean it up a bit. But I think it would be better coming from you.