Re: upload-pack is slow with lots of refs
From: Ævar Arnfjörð Bjarmason <hidden>
Date: 2016-06-15 22:54:56
On Thu, Oct 4, 2012 at 1:15 AM, Jeff King [off-list ref] wrote:
On Thu, Oct 04, 2012 at 12:15:47AM +0200, Ævar Arnfjörð Bjarmason wrote:quoted
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.quoted
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.