From: Junio C Hamano <hidden> Date: 2016-06-15 22:55:55
Jeff King [off-list ref] writes:
This is a repost from here:
http://thread.gmane.org/gmane.comp.version-control.git/211176
which got no response initially. Basically the issue is that read-only
repos (e.g., a CI server) whose workflow is something like:
git fetch $some_branch &&
git checkout -f $some_branch &&
make test
will never run git-gc, and will accumulate a bunch of small packs and
loose objects, leading to poor performance.
Patch 1 runs "gc --auto" on fetch, which I think is sane to do.
Patch 2 optimizes our pack dir re-scanning for fetch-pack (which, unlike
the rest of git, should expect to be missing lots of objects, since we
are deciding what to fetch).
I think 1 is a no-brainer. If your repo is packed, patch 2 matters less,
but it still seems like a sensible optimization to me.
[1/2]: fetch: run gc --auto after fetching
[2/2]: fetch-pack: avoid repeatedly re-scanning pack directory
-Peff
Both makes sense to me.
I also wonder if we would be helped by another "repack" mode that
coalesces small packs into a single one with minimum overhead, and
run that often from "gc --auto", so that we do not end up having to
have 50 packfiles.
When we have 2 or more small and young packs, we could:
- iterate over idx files for these packs to enumerate the objects
to be packed, replacing read_object_list_from_stdin() step;
- always choose to copy the data we have in these existing packs,
instead of doing a full prepare_pack(); and
- use the order the objects appear in the original packs, bypassing
compute_write_order().
The procedure cannot be a straight byte-for-byte copy, because some
objects may appear in multiple packs, and extra copies of the same
object have to be excised from the result. OFS_DELTA offsets need
to be adjusted for objects that appear later in the output and for
objects that were deltified against such an object that recorded its
base with OFS_DELTA format.
But other than such OFS_DELTA adjustments, it feels that such an
"only coalesce multiple packs into one" mode should be fairly quick.
On Sat, Jan 26, 2013 at 10:32 PM, Junio C Hamano [off-list ref] wrote:
Jeff King [off-list ref] writes:
quoted
This is a repost from here:
http://thread.gmane.org/gmane.comp.version-control.git/211176
which got no response initially. Basically the issue is that read-only
repos (e.g., a CI server) whose workflow is something like:
git fetch $some_branch &&
git checkout -f $some_branch &&
make test
will never run git-gc, and will accumulate a bunch of small packs and
loose objects, leading to poor performance.
...
I also wonder if we would be helped by another "repack" mode that
coalesces small packs into a single one with minimum overhead, and
run that often from "gc --auto", so that we do not end up having to
have 50 packfiles.
Yes. This does help....
When we have 2 or more small and young packs, we could:
- iterate over idx files for these packs to enumerate the objects
to be packed, replacing read_object_list_from_stdin() step;
- always choose to copy the data we have in these existing packs,
instead of doing a full prepare_pack(); and
- use the order the objects appear in the original packs, bypassing
compute_write_order().
Hmm, sounds familiar. Seems like its what we do in JGit for Android. :-)
From: Jeff King <hidden> Date: 2016-06-15 22:55:56
On Sat, Jan 26, 2013 at 10:32:42PM -0800, Junio C Hamano wrote:
Both makes sense to me.
I also wonder if we would be helped by another "repack" mode that
coalesces small packs into a single one with minimum overhead, and
run that often from "gc --auto", so that we do not end up having to
have 50 packfiles.
When we have 2 or more small and young packs, we could:
- iterate over idx files for these packs to enumerate the objects
to be packed, replacing read_object_list_from_stdin() step;
- always choose to copy the data we have in these existing packs,
instead of doing a full prepare_pack(); and
- use the order the objects appear in the original packs, bypassing
compute_write_order().
I'm not sure. If I understand you correctly, it would basically just be
concatenating packs without trying to do delta compression between the
objects which are ending up in the same pack. So it would save us from
having to do (up to) 50 binary searches to find an object in a pack, but
would not actually save us much space.
I would be interested to see the timing on how quick it is compared to a
real repack, as the I/O that happens during a repack is non-trivial
(although if you are leaving aside the big "main" pack, then it is
probably not bad).
But how do these somewhat mediocre concatenated packs get turned into
real packs? Pack-objects does not consider deltas between objects in the
same pack. And when would you decide to make a real pack? How do you
know you have 50 young and small packs, and not 50 mediocre coalesced
packs?
-Peff
On Sun, Jan 27, 2013 at 1:32 PM, Junio C Hamano [off-list ref] wrote:
I also wonder if we would be helped by another "repack" mode that
coalesces small packs into a single one with minimum overhead, and
run that often from "gc --auto", so that we do not end up having to
have 50 packfiles.
When we have 2 or more small and young packs, we could:
- iterate over idx files for these packs to enumerate the objects
to be packed, replacing read_object_list_from_stdin() step;
- always choose to copy the data we have in these existing packs,
instead of doing a full prepare_pack(); and
- use the order the objects appear in the original packs, bypassing
compute_write_order().
Isn't it easier and cheaper to create the "master index", something
like bup does?
--
Duy
From: Martin Fick <hidden> Date: 2016-06-15 22:55:57
Jeff King [off-list ref] wrote:
On Sat, Jan 26, 2013 at 10:32:42PM -0800, Junio C Hamano wrote:
quoted
Both makes sense to me.
I also wonder if we would be helped by another "repack" mode that
coalesces small packs into a single one with minimum overhead, and
run that often from "gc --auto", so that we do not end up having to
have 50 packfiles.
When we have 2 or more small and young packs, we could:
- iterate over idx files for these packs to enumerate the objects
to be packed, replacing read_object_list_from_stdin() step;
- always choose to copy the data we have in these existing packs,
instead of doing a full prepare_pack(); and
- use the order the objects appear in the original packs, bypassing
compute_write_order().
I'm not sure. If I understand you correctly, it would basically just be
concatenating packs without trying to do delta compression between the
objects which are ending up in the same pack. So it would save us from
having to do (up to) 50 binary searches to find an object in a pack,
but
would not actually save us much space.
I would be interested to see the timing on how quick it is compared to
a
real repack, as the I/O that happens during a repack is non-trivial
(although if you are leaving aside the big "main" pack, then it is
probably not bad).
But how do these somewhat mediocre concatenated packs get turned into
real packs? Pack-objects does not consider deltas between objects in
the
same pack. And when would you decide to make a real pack? How do you
know you have 50 young and small packs, and not 50 mediocre coalesced
packs?
If we are reconsidering repacking strategies, I would like to propose an approach that might be a more general improvement to repacking which would help in more situations.
You could roll together any packs which are close in size, say within 50% of each other. With this strategy you will end up with files which are spread out by size exponentially. I implementated this strategy on top of the current gc script using keep files, it works fairly well:
https://gerrit-review.googlesource.com/#/c/35215/3/contrib/git-exproll.sh
This saves some time, but mostly it saves I/O when repacking regularly. I suspect that if this strategy were used in core git that further optimizations could be made to also reduce the repack time, but I don't know enough about repacking to know? We run it nightly on our servers, both write and read only mirrors. We us are a ratio of 5 currently to drastically reduce large repack file rollovers,
-Martin