FreeBSD tcsh slowdown

昨日から,自宅のサーバ FreeBSD 10.1-RELEASE に手元の Mac OS から遠隔ログインすると,むちゃくちゃ遅い状態になっていた。脆弱性の発見されたパッケージを対策版にアップデートしたり,freebsd-update コマンドでシステムを最新化したりしたので,この過程でなにかよからぬ事態になったのかも知れなかった。

Mac OS から rlogin を発行しサーバに接続すると,login 時に出力される /etc/motd のメッセージまではただちに表示されるのだが,そのあとダンマリになってしばらくするとログインが完了する。リソース使用状況を確認すると,この間,仮想端末シェルプログラムである tcsh の CPU 利用率が 50% を消費していて,異常な事態が起きているように思われた。そして,ログインだけではなく,ログアウト時も考え込んでしまう。

/etc/motd まではさっさと処理し,そのあと処理がぴたっと止まり,ログアウト時も同様。となると,そのタイミングで行っている処理が怪しいということがわかる。tcsh の設定ファイルである .tcshrc 内の処理かと想定された。そこで,.tcshrc を読まずにシェルログインするオプションである -f を付けて tcsh を実行してみると,果たして速攻でログイン,ログアウト出来ることがわかった。やはり .tcshrc の記述内容のどこかに問題発現の契機が埋まっているということがはっきりした。

.tcshrc の記述は,コマンドエイリアスやら,実行パス,環境変数の定義ばかりであって,CPU リソースを要するような処理をしているとはとても思われない…,と,ふと気づく。

set history = 1000
set savehist = (1000 merge)

コマンド発行履歴を保持するコマンドヒストリ機能か。すぐ .history ファイルを確認してみる。と,なんとファイル容量が 300MB にもなっている。ログイン,ログアウト時にヒストリファイルを 300MB も読み書き・解析していれば,遅いのは当然である。私はコマンド履歴を 1000 程度しかもたないような定義にしているので,この容量はデカ過ぎる。なにかの間違いでこのファイルが肥大化されてしまったらしい。中味を見てみると,バイナリデータが混じっていてヒストリファイルとしては壊れていた。

となると,対策は簡単。.history ファイルを単純に消せばよかった。これで一瞬でログイン・ログアウトが出来るように復旧した。問題は解決。なぜにヒストリファイルが肥大化していたのか,根本原因はわからずじまいのわけだが,これ以上調べても今の資料では判明しそうにない。これを機会に /etc/motd のメッセージの出力を抑止し,/usr/games/fortune(ジョーク・名言表示プログラム)だけをログイン表示するように変えた。

20160714-rlogin-tcsh.png
Mac OS Terminal から FreeBSD Server に遠隔ログインする