某職場で、こっそりVMware Playerを使って、Windows上でFreeBSD 5-STABLEをインストールして使っています。
portsの更新にportsnapを使っているのですが、どうも、たまにというか、ときどきというか、実はけっこうひんぱんに、portsnap実行中に、パソコンのファンがものすごい騒音をたてて全力で回りだすことがありました。
topコマンドで調べてみると、phttpgetというプロセスが、ほぼ100%、CPU時間を使い切っています。どうみても、このphttpgetが暴走しているとしか思えません。
あー、もー、portsnap、使えないー
と思ったりもしましたが、あるとき、ktraceとかgdbを使ってじっくりと調べてみました。その結果、phttpgetにバグがあることを見つけました。
場所は、
src/usr.sbin/portsnap/phttpget/phttpget.c
のreadlnという関数の中にある、whileループです。
HTTPでデータをダウンロードしてくるときに、ネットワークソケットをnon-blockingにして読み出しているのですが、recv()が返すデータ読み出し量が0になるケースが、考慮されていませんでした。
つまり、データ転送の途中で、ネットワークコネクションが切れたかなんかすると、non-blocking readになっているので、そのデータ読み出し処理のループが、全力で無限ループする、いわゆるbusy loop状態になってしまうのです。
やったね、ふふーん、お手柄だね>>自分
とか思ってCVSで最新のソースコードを見たら、
なんだ、もうなおってたんですか・・・
6.0-RELEASEや、中途半端な時期に5-STABLEをインストールした人、portsnapがおかしいと思ったら、これをチェックするといいかもしれませんね。
☆ ☆ ☆ ☆ ☆
自宅でportsnapを使ってたときは大丈夫だったのに、その某職場でだけ、なぜ問題が起きたか・・・どうも、そこのネットワークで使っているプロキシーサーバーが非常におかしな動作をしているようなんです。昨今の情勢から、企業のネットワークでは、プロキシーサーバでウイルスチェックをやってることがあるんですが、これが、まー、なんですか、そのぉ、
余計な処理をするせいで、遅くなるわ、不安定になるわで、使えない
Windows上で使っているFirefoxも、10秒間くらい、フリーズしたかと思うくらい、ピタっと固まってしまうことが、頻繁に起きます。
なんか、正直ものが損をする、になっちゃってるわけですよ。
個人的には、そんなウイルスチェックで守ってあげてると、いわゆる温室育ちで、やわな人間になってしまうので、いざというときの抵抗力が弱ってしまうと思うんですよね。
1度や2度、コンピューターウイルスに感染するといった失敗を経験して、人間が学習することで、未知のウイルスや、フィッシング詐欺とかに対する、心構え、ってのができるんじゃないかと思うんですよね。
というわけで、よいネットワーク管理者は、たまーに、悪影響を与えることの少ないウイルスを、無作為に選んだユーザーに送りつけて、訓練してあげるのがいいんじゃないかと思います。
☆ ☆ ☆ ☆ ☆
■ 追記
- portsnapでwgetを使わせる
- 腐れproxyサーバの呪いなのか、ファイルのダウンロードが失敗してうまくいかないので、phttpgetの代わりにwgetを使うようにしたところ、うそのように問題がなくなりました。