MQ performance on large repo

Greg Ward greg at gerg.ca
Fri Feb 26 16:30:49 CST 2010


On Fri, Feb 26, 2010 at 4:19 PM, Greg Ward <greg at gerg.ca> wrote:
> I'm going to dig into the decodedir() calls, since that looks like the
> lowest hanging fruit.  Suggestions are welcome.

Looks like fncache is the culprit.  Here's what my .hg/store/fncache looks like:

  $ wc -l .hg/store/fncache
  247385 .hg/store/fncache

But:

  $ sort -u .hg/store/fncache | wc -l
  28520
  $ find .hg/store/data -type f | wc -l
  26812

Lots of duplicate lines in that fncache!

Looks like the performance hit boils down to store.fncachestore
testing if a path is in fncache ("path not in fnc", store.py around
line 304). That single __contains__() call accounts for a big chunk of
the 7-8 sec runtime of qrefresh.  The last little bit of stack trace
leading up to one of those 247385 calls to decodedir() is

  File "/home/gward/src/hg-crew/mercurial/repair.py", line 130, in strip
    repo.sopener(file, 'a').truncate(troffset)
  File "/home/gward/src/hg-crew/mercurial/store.py", line 304, in fncacheopener
    and path not in fnc):
  File "/home/gward/src/hg-crew/mercurial/store.py", line 283, in __contains__
    self._load()
  File "/home/gward/src/hg-crew/mercurial/store.py", line 266, in _load
    self.entries.add(decodedir(line[:-1]))

...so really, it's loading my 247385-line fncache that hurts.  And I
expect it will hurt any call to repair.strip().

So, a possible workaround:

  $ rm .hg/store/fncache

Indeed, that speeds things up noticeably:

  * qrefresh: 5.0 .. 5.5 sec (from 7-8 sec)
  * qpop: ~3.5 sec (from ~5 sec)
  * qpush: ~1.5 sec (from ~4 sec)

Huh.  I've been reading the code and the fncacheRepoFormat wiki page,
and remain unenlightened.  What purpose does .hg/store/fncache serve?

Greg


More information about the Mercurial-devel mailing list