git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Surprising use of memory and time when repacking mozilla's gecko repository

From
Mike Hommey <mh@glandium.org>
Date
Jul 5, 2019, 00:22 UTC
Message-ID
<20190705002216.logqmvrk5s354jss@glandium.org>
In-Reply-To
<20190704100530.smn4rpiekwtfylhz@glandium.org>
On Thu, Jul 04, 2019 at 07:05:30PM +0900, Mike Hommey wrote:
Show 57 quoted lines
> 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
Previous: Jakub NarebskiNext: Mike Hommey
Message 7 of 11 in “Surprising use of memory and time when repacking mozilla's gecko repository”
  1. Mike HommeyJul 4, 2019
  2. Eric WongJul 4, 2019
  3. Mike HommeyJul 4, 2019
  4. Jeff KingJul 5, 2019
  5. Mike HommeyJul 5, 2019
  6. Jakub NarebskiJul 5, 2019
  7. Mike HommeyJul 5, 2019
  8. Mike HommeyJul 5, 2019
  9. Jeff KingJul 5, 2019
  10. Mike HommeyJul 5, 2019
  11. Mike HommeyJul 5, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.