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を再起動したところ、異常に遅い問題は解消しました。

Eclipseの更新サイトを閉じたLANで使用するには

不幸にも外界から遮断されたネットワーク環境でのソフトウェア開発を余儀なくされるという、開発効率よりも情報保護が優先されるのが昨今の日本の状況です。一方開発ツールはオンライン前提だったりします。Eclipseを閉じたLANで使用し、かつ定期的に更新を反映したり新しいプラグインを利用できるようにしたいと思い、すこし調査をしてみました。
(こうした調査は閉じたLANではできないので、自宅作業になります)

更新サイトの丸ごとダウンロード

Eclipseの場合、更新サイトのURL以下のファイル群をそのまま手元にコピーすれば、更新の設定でローカルのファイルシステムや別URLを指定して更新することができます。
そこで、rsyncを使ってごそっと取ってきたいわけですが、本家URL(eclipse.org)はrsyncが制限されていましたので、ミラーサイトから取ってきます。

Eclipse 3.3 (Europa)の場合、標準で設定されている更新サイトは以下の2つです。

  1. Eclipseプロジェクト更新サイト
  2. Eclipseディスカバリー・サイト

このミラーサイトを近隣に探します。日本のサイトでは、以下が出てきました。

rsyncのコマンドは、以下のミラーサイトスクリプトを参考にします。
http://www.eclipse.org/downloads/eclipse.org-rsync.sh.txt

RSYNC_HOSTを上記ミラーサイトに設定し、RSYNCH_PATHにはミラーサイト上で更新用のディレクトリを探してそれを設定します。

ダウンロードすると、hoge.jarとhoge.jar.pack.gzと同じファイルが2種類のアーカイブで落ちてきました。その分サイズが大きくなってしまうので、ここはhoge.jarだけでよいように、rsyncのオプションでpack.gzを除外した方がよさそうです。その際は、site.xmlのなかのpack200="true"の記述はたぶんpack200="false"のように修正した方がよいかもしれません(未確認)。

Eclipseディスカバリー・サイトのダウンロードで・・・

やたらにサイズが大きいので見てみると、stagingというディレクトリの下にほとんど同じ構成のファイル群があります。いらなさそうなので削除。

Subclipseプラグインを閉じたLANで・・・

Subclipseは、更新サイトのディレクトリ一式をまとめたファイルを提供しているので、これをローカルファイルシステムや閉じたLAN上のWebサーバに置きます。
http://subclipse.tigris.org/servlets/ProjectDocumentList

Subclipseを使うときは、SubversionApache 2.0用の方をインストールすべし

Windows上にて

Subclipseを入れていざインポートしようとしたらEclipse(Europa)が落ちてしまいました。
JavaVMが吐くエラー情報によれば、libapriconv-1.dll, libapr-1.dllあたりがスタック情報に載っていました。

とりあえずSubversion 1.4.6 for Apr2.2をアンインストールして、Apr2.0をインストールしたら問題解消。


CD-RやDVDには焼けない・・・

CD-RかDVD-Rに更新ファイル群を置けば、気軽に閉じたLANで更新ができると思ってましたが、いざファイル群を焼こうとしたら、ファイルパスが長すぎてエラーとなってしまいました。
確かにEclipseのファイルは長い・・・