インテル コンパイラー 1000本ノックプロジェクト 6ページ

SSHクライアント「OpenSSH」

 OpenSSHは、SSHプロトコルによって暗号化されたネットワーク通信を利用してリモートサーバーにアクセスしたり、ファイルを送受信するためのツールだ。

 SSHプロトコルではRSAやDSAといった公開鍵暗号を利用して通信内容を暗号化し、安全な通信を実現している。しかし、RSAやDSAによる暗号化/復号処理はそれなりに計算量が必要であるため、インテル コンパイラーを使用することで処理の高速化が期待できる。

OpenSSHのコンパイル(Linux環境)

 OpenSSHのコンパイルには、OpenSSHのほかデータ圧縮/展開ライブラリ「zlib」やOpenSSLに含まれる「libcrypt」が必要だ(コンパイル設定によってはそのほかのライブラリも必要であるが、今回は最小限の構成でコンパイルを行っている)。まずはこれらをインテル コンパイラーでコンパイルし、最後にOpenSSHをコンパイルすることになる。

 なお、以下では「~/local/」ディレクトリ以下にこれらをインストールするよう設定を行っている。それ以外のディレクトリへのインストールを行う場合は適宜「prefix=」以下を変更してほしい。

 まずzlibのコンパイルであるが、zlibのソースアーカイブはzlibのWebサイトから入手できる。今回はzlib 1.2.3(アーカイブファイルは「zlib-1.2.3.tar.gz」)を使用した。このアーカイブファイルを適切なディレクトリに展開し、次のように実行する。

$ cd zlib-1.2.3
$ CC=icc CFLAGS="-O3 -ip" ./configure --shared
$ make
make install prefix=$HOME/local

 また、~/local/ディレクトリ以下にインストールされたライブラリを使用するため、下記のように「LD_LIBRARY_PATH」環境変数を設定しておく。

export LD_LIBRARY_PATH=~/local/lib/:$LD_LIBRARY_PATH

 以上で、~/local/lib/ディレクトリ以下にzlibのスタティックライブラリおよび共有ライブラリがインストールされ、利用可能になる。

 続いて、OpenSSLのコンパイルを行う。ソースアーカイブは公式Webサイトから入手が可能だ。今回はOpenSSL 0.9.8(アーカイブファイル名は「openssl-0.9.8k.tar.gz」)を使用した。

 適切なディレクトリにアーカイブを展開し、以下のように実行する。

$ cd openssl-0.9.8k
$ CC=icc ./config --prefix=$HOME/local --shared
$ make
$ make test
$ make install

 最後に、OpenSSH本体のコンパイル作業を行う。OpenSSHのソースアーカイブは、ミラーサイト(JAIST)から入手可能だ。今回はOpenSSH 5.2p1(アーカイブファイル名は「openssh-5.2p1.tar.gz」)を使用した。ダウンロードしたアーカイブを展開後、以下のように実行する。

$ cd openssh-5.2p1
$ CC=icc CFLAGS="-O3 -ip -I$HOME/local/include" LDFLAGS="-L$HOME/local/lib" ./configure --prefix=$HOME/local --with-privsep-path="$HOME/local/empty"
$ make
$ make install

 以上の作業が完了すると、~/local/bin/ディレクトリ以下に「ssh」や「scp」、「sftp」といったSSH関連コマンドがインストールされているはずだ。

パフォーマンス検証

 コンパイラの違いによる差異を確認するため、sftpコマンドを使用してファイルをアップロード/ダウンロードするのにかかった時間を測定した。使用した環境は次の表12のとおりである。また、コンパイルオプションについてはデフォルトの設定を用いた。

表12 テストに使用した環境
構成要素 サーバー側 クライアント側
CPU Core 2 Duo E6550(2.33GHz) Core i7 920(2.66GHz)
メモリ 2GB 3GB
ネットワークインターフェイス 10/100BASE-TX 1000BASE-T
OS Windows Vista Business SP2 Debian GNU/Linux 5.0
サーバー/クライアントソフト freeSSHd OpenSSH

 以上の環境で、約660MBのDebian GNU/Linux 5.0インストールCDイメージをアップロードおよびダウンロードするのにかかった時間を測定したところ、次の表13のような結果となった。

表13 OpenSSHのパフォーマンス比較
条件 コンパイラ かかった時間 転送速度
アップロード インテル コンパイラー 64秒 約10.3MB/s
GCC 64秒 約10.3MB/s
ダウンロード インテル コンパイラー 58秒 約11.4MB/s
GCC 59秒 約11.2MB/s

 ファイル転送ではネットワークの速度がボトルネックになることが多いため、残念ながら今回の検証結果ではコンパイラの違いによる差は誤差の範囲内でしか見られなかった。

インテル コンパイラーでオープンソースソフトウェアのコンパイルに挑戦しよう

 いくつかのオープンソースソフトウェアを実際にコンパイルしてみたが、多くのソフトウェアの場合インテル コンパイラーで簡単にコンパイルが可能である。さらに、ソースコードの修正を加えずとも、インテル コンパイラーを使用するだけでパフォーマンスの向上が見られたソフトウェアも多くあった。

 インテル コンパイラー 1000本ノックプロジェクトでは、これからもインテル コンパイラーによるオープンソースソフトウェアのコンパイルを行っていく予定だ。また、プロジェクトではインテル コンパイラーを使用して作成したソフトウェアの紹介や、コンパイルしてほしいソフトウェアの希望などもプロジェクトのフォーラムで受け付けているので、気軽に意見を寄せてほしい。