comparison tests/test-revlog-mmapindex.t @ 34296:3c9691728237

revlog: add option to mmap revlog index Following on from Jun Wu's patch last October[1], we have found that using mmap for the revlog index in repos with large revlogs gives a noticable performance improvment (~110ms on each hg invocation), particularly for commands that don't touch the index very much. This changeset adds this as an option, activated by a new experimental config option so that it can be enabled on a per-repo basis. The configuration option specifies an index size threshold at which Mercurial will switch to using mmap to access the index. If the configuration option is not specified, the default remains to load the full file, which seems to be the best option for smaller repos. Some initial performance numbers for average of 5 invocations of `hg log -l 5` for different cache states: | Repo: | HG | FB | |---|---|---| | Index size: | 2.3MB | much bigger | | read (warm): | 237ms | 432ms | | mmap (warm): | 227ms | 321ms | | | (-3%) | (-26%) | | read (cold): | 397ms | 696ms | | mmap (cold): | 410ms | 888ms | | | (+3%) | (+28%) | [1] https://www.mercurial-scm.org/pipermail/mercurial-devel/2016-October/088737.html Test Plan: `hg log --config experimental.mmapindex=true` Differential Revision: https://phab.mercurial-scm.org/D477
author Mark Thomas <mbthomas@fb.com>
date Wed, 13 Sep 2017 17:26:26 +0000
parents
children b0c97e44576f
comparison
equal deleted inserted replaced
34295:3bb2a9f25fe9 34296:3c9691728237
1 create verbosemmap.py
2 $ cat << EOF > verbosemmap.py
3 > # extension to make util.mmapread verbose
4 >
5 > from __future__ import absolute_import
6 >
7 > from mercurial import (
8 > extensions,
9 > util,
10 > )
11 >
12 > def mmapread(orig, fp):
13 > print "mmapping %s" % fp.name
14 > return orig(fp)
15 >
16 > def extsetup(ui):
17 > extensions.wrapfunction(util, 'mmapread', mmapread)
18 > EOF
19
20 setting up base repo
21 $ hg init a
22 $ cd a
23 $ touch a
24 $ hg add a
25 $ hg commit -qm base
26 $ for i in `$TESTDIR/seq.py 1 100` ; do
27 > echo $i > a
28 > hg commit -qm $i
29 > done
30
31 set up verbosemmap extension
32 $ cat << EOF >> $HGRCPATH
33 > [extensions]
34 > verbosemmap=$TESTTMP/verbosemmap.py
35 > EOF
36
37 mmap index which is now more than 4k long
38 $ hg log -l 5 -T '{rev}\n' --config experimental.mmapindexthreshold=4k
39 mmapping $TESTTMP/a/.hg/store/00changelog.i (glob)
40 100
41 99
42 98
43 97
44 96
45
46 do not mmap index which is still less than 32k
47 $ hg log -l 5 -T '{rev}\n' --config experimental.mmapindexthreshold=32k
48 100
49 99
50 98
51 97
52 96
53
54 $ cd ..