OpenSSH5.6でControlPersistを使ってみる。

oktlinux,PostgreSQL

こんにちは。三十路突入したばかりのoktです。
あぁもう30歳かと嘆いていたら各所から怒られました。

さて、先日、OpenSSH 5.6がリリース(http://www.openssh.org/txt/release-5.6)されました。
普段使っているCentOS5のOpenSSHは4.3なのですが、ControlMasterオプションや5.6で追加されたControlPersistオプションを使いたくなったので、CentOS5.5に入れてみました。

まず、OpenSSHのビルドに必要なものを拾ってきます。

[root@host ~]# wget http://www.jmknoble.net/software/x11-ssh-askpass/x11-ssh-askpass-1.2.4.1.tar.gz
[root@host ~]# mv x11-ssh-askpass-1.2.4.1.tar.gz ~/rpm/SOURCES

下記のパッケージも必要なので、EPELからダウンロード・インストールします。

[root@host ~]# wget http://download.fedora.redhat.com/pub/epel/5/i386/libedit-2.11-2.20080712cvs.el5.i386.rpm
[root@host ~]# wget http://download.fedora.redhat.com/pub/epel/5/i386/libedit-devel-2.11-2.20080712cvs.el5.i386.rpm
[root@host ~]# yum localinstall libedit-2.11-2.20080712cvs.el5.i386.rpm libedit-devel-2.11-2.20080712cvs.el5.i386.rpm

次にOpenSSH5.6のソースをダウンロード、SPECファイルを取り出し修正します。

[root@host ~]# wget http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-5.6p1.tar.gz
[root@host ~]# tar zxf openssh-5.6p1.tar.gz
[root@host ~]# cp openssh-5.6p1/contrib/redhat/openssh.spec ~/rpm/SPECS ; rm -rf openssh-5.6p1
[root@host ~]# vi ~/rpm/SPECS/openssh.spec
BuildPreReq: perl, openssl-devel, tcp_wrappers
BuildPreReq: /bin/login
BuildPreReq: libedit,libedit-devel # 追加
[root@host ~]#

~/rpm/SOURCES にOpenSSH5.6のソースを置きます。

[root@host ~]# mv openssh-5.6p1.tar.gz ~/rpm/SOURCES/

最後にrpmbuildでパッケージを作成します。

[root@host ~]# cd ~/rpm/SPECS
[root@host ~]# rpmbuild -ba openssh.spec

※作業記録から書き起こしているので細かいところで躓いても関知しません。

はい。
では、OpenSSH5.6のパッケージも出来たのでインストールも済んでいる事にして次へ進みます。

~/.ssh/configに下記のようにControlMasterとControlPersistの設定を追加します。

[user@host ~]$ mkdir ~/.ssh/connections
[user@host ~]$ cat << EOF >> ~/.ssh/config
ControlMaster auto
ControlPath ~/.ssh/connections/%r_%h_%p
ControlPersist yes
EOF
[user@host ~]$

設定を追加したら、リモートのホストに接続してみます。
接続して直ぐ切断したいのでこんな感じでやってみます。

[user@host ~]$ time ssh user@10.0.0.1 -C "exit"
 
real 0m0.105s
user 0m0.020s
sys 0m0.005s
[user@host ~]$

timeコマンドの結果、完了に0.1秒ほどかかったのがわかりました。
ControlPathに指定したディレクトリを見ると、下記のようにソケットファイルが作成されています。

[user@host ~]$ ls -l ~/.ssh/connections
total 0
srw------- 1 user user 0 Sep 3 16:22 user_10.0.0.1_22
[user@host ~]$

10.0.0.1との接続はこの状態でも確立されていて、再利用可能な状態です。
もう一度接続してみます。

[user@host ~]$ time ssh user@10.0.0.1 -C "exit"
 
real 0m0.006s
user 0m0.000s
sys 0m0.003s
[user@host ~]$

追加でもう一度。

[user@host ~]$ time ssh user@10.0.0.1 -C "exit"
 
real 0m0.006s
user 0m0.002s
sys 0m0.002s
[user@host ~]$

2度目以降は0.006秒で終わっていて、1度目と比較した場合には18倍程度の差があります。
1度目の実行では確立済みのコネクションがなかったので実行時間が長いのですが、2度目以降は確立済みのコネクションがすでにあるため、再利用され実行時間が短縮されています。

ControlMasterによる多重接続時のコネクション再利用は以前からあったのですが、多重度が低い場合は効果が得られない場合がありました。OpenSSH5.6からは、ControlPersistを使うことで継続的にコネクションの再利用が可能になりました。

lsyncdを使ったファイルミラーリングや、PostgreSQLでscp等を使ってWALをリモートサーバに送る場合にはレスポンスの改善が期待できそうです。

oktlinux,PostgreSQL

Posted by okt