[PATCH] write-tree performance problems
From: Chris Mason <hidden>
Date: 2016-06-15 22:41:53
Hello everyone, I did a quick experiment with applying/commit 100 patches from the suse kernel into a kernel git tree, which quilt can do in 2 seconds. git needs 1m5s. The primary performance problem during each commit is write-tree recalculating the hash of each directory, even though the contents of most directories are not changing. I've attached a very quick and dirty mod of write-tree.c, it takes an optional tree id (sha1) and list of directories. The hash of any directories not in the list are read in from existing files instead of being recalculated. You have to pass each sub dir with a modified file. So, if you change fs/super.c and fs/ext3/super.c, you would call "write-tree sha1 fs fs/ext3" With this patch, the time to apply 100 commits goes down to 22 seconds. It could be faster (and easier to use) if the index stored the hash of trees instead of just blobs, but that would be a larger change. I was able to get the commit time down to 13 seconds by changing read-tree.c, update-cache.c and read-cache.c to store/read the index in tmpfs instead of on the local filesystem. I haven't attached the patch for that, but it seems easiest to move .git/index into .git/index_dir/index, and let the user decide where to put index_dir. Quick speed summary, apply/commit 100 patches quilt push -a : 2s git (unmodified): 1m5s git (tree hash reduction) 22s git (tree hash, tmpfs index) 13s This patch is against pasky's tree from this morning, but also applies to linus' tree. It's nasty stuff, but will hopefully get some discussion started on speeding things up. -chris
Attachments
- fast-dirs.diff [text/x-diff] 4526 bytes · preview