読者です 読者をやめる 読者になる 読者になる

FIELD NOTES: 書を持って街へ出よう

合同会社フィールドワークス プログラマ兼代表のブログ

Cryptokitを組み込んだプログラムが遅くなった場合の対処方法

技術調査

今まで作ってきたプログラムに暗号ライブラリCryptokitを組み込んだら,プログラムの動作が急に遅くなってしまいました。どうやら,乱数を生成している箇所で数秒〜数十秒の待ちが発生している模様です。

問題が発生した環境は,VMWare Fusion上で稼動しているFedora 14です。

調査

psコマンドでプロセスの状態を確認してみると,random_readという関数で止まっていました。random_readをキーに検索したところ,以下のことがわかりました。

  • Linuxの乱数は「エントロピープール」を元に乱数を生成する。
  • エントロピープールが枯渇すると乱数生成時に待ちが発生する(ただし,/dev/randomを使用した場合。/dev/urandomを使用すれば精度は悪くなるが待ちは発生しない)。
  • エントロピープールの量(ビット数?)は,‘cat /proc/sys/kernel/random/entropy_avail’で確認できる。1000以下であれば,枯渇状態である。

実際にentropy_availを調べてみると,100〜500ぐらいだったので,エントロピープールが枯渇している状態なのは間違いなさそうです。

対策

対策としては,rng-toolsを導入して,エントロピー発生源としてハードウェア乱数発生器を利用するというのが定石のようです。

早速,rng-toolsパッケージをインストールしたところ,既にインストール済みとのこと。

# yum install rng-tools
読み込んだプラグイン:langpacks, presto, refresh-packagekit
Adding ja_JP to language list
インストール処理の設定をしています
パッケージ rng-tools-3-2.fc14.i686 はインストール済みか最新バージョンです
何もしません

しかし,/etc/init.d配下にはそれらしいサービスは存在していません。

仕方がないので,RNGD Init Script Missing in Red Hat, CentOS, Fedora [TuxHelp.org]を参考にスクリプトを追加しました。

ただし,ハードウェア乱数発生器/dev/hdrngは存在していなかったので,/dev/urandonを使うようにスクリプトを一部修正しました。

#HRNGDEVICE=/dev/hwrng
HRNGDEVICE=/dev/urandom

結果

この状態でrngdサービスを起動させると,entropy_availの値が2000前後になりました。Cryptokitを組み込んだプログラムでも待ちが発生しなくなったので,たしかに効果があったようです。

ただし,rng-toolsパッケージがインストール済みだったのに動いていなかった理由は謎です。おそらく,以下のような理由だと想像していますが,裏は取れませんでした。

  1. VMWare上で動いているので,/dev/hdrngを作ることができなかった。
  2. rng-toolsパッケージインストール時に/dev/hdrngが存在しなかったので,起動する設定がされなかった。