torutkのブログ

ソフトウェア・エンジニアのブログ

Subversion(svnserve)が異常に遅い問題の解決(ident)

自宅のLinuxPC上に稼動しているSubversionサーバ(svnserve)が異常に応答が遅い問題がありましたが、そう毎日使うものでもないので放置していました。

今日、TortoiseSVNのバージョンアップ(Ver 1.4.8)とEclipseSubclipseを組み込んで使い勝手を調べたので気になり、WiresharkでクライアントPCとLinuxPCとのパケットをモニターしたところ、Subversionのアクセスをする度にsvnserve側のLinuxPCからなぜかクライアント側のPCにTCPのコネクション要求パケット[SYN]が発生しています。これが、3回リトライしてACKがない時点でsvnserve側からsvnの応答が帰ってきているように見えます。

リトライはTCPの教科書的に、3秒後、6秒後、12秒後と徐々に時間を空けてくるので合計21秒は無駄な待ちが発生していました。

さて、このidentによるTCPコネクションの発生ですが、xinet経由でsvnserveを起動する設定をしていますが、その設定ファイルの記述で

service svn
{
        disable = no
        socket_type = stream
        protocol = tcp
        wait = no
        user = svn
        server = /usr/bin/svnserve
        server_args = -i -r /home/svn/repos
        log_on_success += DURATION HOST USERID
        log_on_failure += HOST USERID
}

と記述しています。ここでUSERIDという指定があると、identプロトコルによる問い合わせをリモートにするとのことです。この記述をした当初はxinetdを良く知らなかったので、どこかで見つけた設定をぱくってきて動いたからいいやとしたためですね。USERIDの記述をlog_on_success、log_on_failureから外してxinetdを再起動したところ、異常に遅い問題は解消しました。