On Thu, Jul 04, 2019 at 07:05:30PM +0900, Mike Hommey wrote:
> Hi,
>
> I was looking at the disk size of the gecko repository on github[1],
> which started at 4.7GB, and `git gc --aggressive`'d it, which made that
> into 2.0G. But to achieve that required quite some resources.
>
> My first attempt failed with OOM, on an AWS instance with 16 cores and
> 32GB RAM. I then went to another AWS instance, with 36 cores and 96GB
> RAM. And that went through after a while... with a peak memory usage
> above 60GB!
>
> Since then, Peff kindly repacked the repo on the github end, so it
> doesn't really need repacking locally anymore, but I can still reproduce
> the > 60GB memory usage with the packed repository.
>
> I gathered some data[2], all on the same 36 cores, 96GB RAM instance, with
> 36, 16 and 1 threads, and here's what can be observed:
>
> With 36 threads, the overall process takes 45 minutes:
> - 50 seconds enumerating and counting objects.
> - ~22 minutes compressing objects
> - ~22 minutes writing objects
>
> Of the 22 minutes compressing objects, more than 15 minutes are spent on
> the last percent of objects, and only during that part the memory usage
> balloons above 20GB.
>
> Memory usage goes back to 2.4G after finishing to compress.
>
> With 16 threads, the overall process takes about the same time as above,
> with about the same repartition.
>
> But less time is spent on compressing the last percent of objects, and
> memory usage goes above 20GB later than with 36 threads.
>
> Finally, with 1 thread, the picture changes greatly. The overall process
> takes 2.5h:
> - 50 seconds enumerating and counting objects.
> - ~2.5h compressing objects.
> - 3 minutes and 25 seconds writing objects!
>
> Memory usage stays reasonable, except at some point after 47 minutes,
> where it starts to increase up to 12.7GB, and then goes back down about
> half an hour later, all while stalling around the 13% progress mark.
>
> My guess is all those stalls are happening when processing the files I
> already had problems with in the past[3], except there are more of them
> now (thankfully, they were removed, so there won't be more, but that
> doesn't make the existing ones go away).
>
> I never ended up working on trying to make that diff faster, maybe that
> would help a little here, but that would probably not help much wrt the
> memory usage. I wonder what git could reasonably do to avoid OOMing in
> this case. Reduce the window size temporarily? Trade memory with time,
> by not keeping the objects in memory?
>
> I'm puzzled by the fact writing objects is so much faster with 1 thread.
Here's a perf report from the portion of "Writing" that is particularly
slow with compression having happened on 36 threads:
100.00% 0.00% git [unknown] [k] 0xffffffffffffffff
99.97% 0.02% git git [.] write_one
99.97% 0.00% git git [.] write_pack_file
99.97% 0.00% git git [.] cmd_pack_objects
99.96% 0.00% git git [.] write_object (inlined)
99.96% 0.00% git git [.] write_reuse_object
(inlined)
99.92% 0.00% git git [.] write_no_reuse_object
98.12% 0.00% git git [.] get_delta (inlined)
72.36% 0.00% git git [.] diff_delta (inlined)
64.86% 64.20% git git [.] create_delta_index
26.32% 0.00% git git [.] repo_read_object_file
(inlined)
26.32% 0.00% git git [.] read_object_file_extended
26.32% 0.00% git git [.] read_object
26.32% 0.00% git git [.] oid_object_info_extended
26.25% 0.00% git git [.] packed_object_info
26.24% 0.00% git git [.] cache_or_unpack_entry
(inlined)
24.30% 0.01% git git [.] unpack_entry
17.62% 0.00% git git [.] memcpy (inlined)
17.52% 17.46% git libc-2.27.so [.]
__memmove_avx_unaligned_erms
15.98% 0.22% git git [.] patch_delta
7.60% 0.00% git git [.] unpack_compressed_entry
7.49% 7.42% git git [.] create_delta
7.29% 0.00% git git [.] git_inflate
7.29% 0.23% git libz.so.1.2.11 [.] inflate
1.94% 0.00% git git [.] xmemdupz
1.14% 0.00% git git [.] do_compress
0.98% 0.98% git libz.so.1.2.11 [.] adler32_z
0.95% 0.00% git libz.so.1.2.11 [.] deflate
... that's a large portion of time spent on deltas...
Mike