[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: Slow ISVNClient.getChangelists on Linux/NFS share

From: Johan Corveleyn <jcorvel_at_gmail.com>
Date: Thu, 19 Oct 2017 10:44:13 +0200

On Thu, Oct 19, 2017 at 8:30 AM, Thomas Singer
<thomas.singer_at_syntevo.com> wrote:
> On 18.10.2017 19:56, Branko Čibej wrote:
>>
>> On 18.10.2017 13:31, Thomas Singer wrote:
>>>
>>> Hi,
>>>
>>> When performing following steps on my old Linux test machine (with
>>> slow hard disk):
>>>
>>> - have a SVN working copy at /home/user/test
>>> - sudo apt install nfs-kernel-server
>>> - add following line to /etc/exports:
>>> /home/user/test *(rw,sync,no_root_squash)
>>> - start the NFS server:
>>> sudo systemctl start nfs-kernel-server.service
>>> - mount the NFS share:
>>> sudo mount localhost:/home/user/test /home/user/test.nfs
>>>
>>> and then open /home/user/test.nfs in SmartSVN 9.2 (using SVN 1.9
>>> JavaHL binaries), adding/removing a file is very slow. It boils down
>>> to the call ISVNClient.getChangelists which takes ~8s on the NFS share
>>> (/home/user/test.nfs). First, I thought, it would be caused by the
>>> native-Java overhead calling the call-back ~11,000 times for my
>>> working copy, but when using the working copy directly
>>> (/home/user/test), the method just takes <1s though the ~11,000 times
>>> call-back invocations are still there.
>>>
>>> My working copy has no local modifications, no untracked or ignored
>>> files, no changelists.
>>>
>>> Is it expected that this method (ISVNClient.getChangelists) is so slow
>>> on a NFS share even if there are no changelists?
>>
>>
>> I don't know if it's "expected" but I bet that NFS is killing SQLite
>> performance.
>>
>>
>> https://www.mail-archive.com/sqlite-users@mailinglists.sqlite.org/msg88989.html
>>
>> I'm not sure about the reason but the most likely answer, apart from
>> slow data rate and latency when compared to a local filesystem (which,
>> in your case on loopback, should not be an issue), is that the OS can't
>> really use a cache for files on NFS since it has no way to know whether
>> or not it's valid. With a lot of random-access reads and writes, that
>> can be a HUGE slowdown, as you found.
>>
>>
>> Also this:
>> https://sqlite.org/faq.html#q5
>>
>> In other words, Subversion working copies on NFS are, and have always
>> been, a bad idea; not only because of SQLite but also because
>> Subversion's code itself relies on atomic renames, which NFS does not
>> provide.
>>
>> -- Brane
>
>
> What SVN command (on command line) I should test to get a similar result as
> from ISVNClient.getChangelists? I've tried "git status" and it just needs
> <1s on the NFS working copy.

I assume you meant "svn status", not "git status".

I have no idea what ISVNClient.getChangelists corresponds to compared
with the native 'svn' commandline. But one thing that might be
relevant: in the client-side configuration file 'config' there are two
properties that can have a big influence here:

(see %APPDATA%/Subversion/config on Windows, or ~/.subversion/config on Unix)
[[[
### Section for configuring working copies.
[working-copy]
### Set to a list of the names of specific clients that should use
### exclusive SQLite locking of working copies. This increases the
### performance of the client but prevents concurrent access by
### other clients. Third-party clients may also support this
### option.
### Possible values:
### svn (the command line client)
# exclusive-locking-clients =
### Set to true to enable exclusive SQLite locking of working
### copies by all clients using the 1.8 APIs. Enabling this may
### cause some clients to fail to work properly. This does not have
### to be set for exclusive-locking-clients to work.
# exclusive-locking = false
]]]

So with the above options you can make all clients (that use that
config file) respect "exclusive-locking" (with the exclusive-locking
flag), or just a subset of specific client applications (with the
exclusive-locking-clients property).

Perhaps your commandline 'svn' invocation uses the standard
~/.subversion/config file, which has the exclusive-locking flag set,
and your SmartSVN application might use another one (it can choose
another "config dir").

-- 
Johan
Received on 2017-10-19 10:44:40 CEST

This is an archived mail posted to the Subversion Dev mailing list.