2007年10月18日木曜日

(FreeBSD) FreeBSD7 + SCHED_ULE + (オマケに)HyperThreading = 超快適!!

この写真は10月8日



今年の初めころから、すでに、FreeBSD 7.0-CURRENTな環境でお仕事をしています。





さすがに万が一のトラブルに備えて、お仕事用マシンとは別に、動作テスト用マシンがあって、そっちのほうは、月1くらいの割合で、cvsup(最近はcsupというコマンドもある)して、最新版の7-CURRENTを追いかけていくようにしています。
テストマシンで問題がないようなら、お仕事用マシンも、アップデートする、ということを続けてきました。


ところで、すでに、7.0-RELEASEに向けて、RELENG_7ブランチが切られていて、headブランチは、8-CURRENTになっているみたいです。



詳しくは、このあたりを参考に:
http://www.freebsd.org/releng/index.html



最近、お仕事用マシンで、ちょっと重い処理を裏で実行するようになったのですが、そうしたら、ユーザーインターフェイス周りのレスポンスがものすごく悪くなり、「もっさり感」が急上昇!!  かなりイライラがつのってました。なにしろ、X Window System(xorg 7.3)上で、マウスを動かすだけでも、ポインタがひっかかるような動きになるほどで。



もうこうなったらダメもとで、ってことで、HyperThreadingを有効にし(←たいてい効果ないのでいつも切っておくのが私の流儀)、かつ、プロセス・スケジューラを、従来のSCHED_4BSDから、SCHED_ULEに変更してみました。



そ う し た ら ・ ・ ・



劇的な効果あり! すごく快適になりました。マシンの処理速度が、2~3ランク上になったくらいの、レスポンスのよさ。Firefoxなどが、するする動くようになってしまいました。



実際のところ、処理速度が向上したのではなく、その時々で、適材適所に、うまいことCPUパワーを振り分けられるようになったのだと思います。



とくに、ユーザーインターフェイスまわりなど、即、反応して欲しい部分について、優先的に処理が行われるようになったんじゃないですかね・・・プロセスごとに、そんな属性はないと思うんですけが(priorityだけで、こうもうまくいくのか疑問)、いったい、どういう仕組みで実現されているのか、てんでわかりませんけど(笑)。



(ちゃんと目を通してないですけど)currentのメーリングリストでは、FreeBSD 7.1-RELEASEから、SCHED_ULEをデフォルトにしよう、とか提案されていました。7.0-RELEASEじゃないところが、保守的な感じでほほえましいですね。



SCHED_ULEは、マルチプロセッサ構成のときに特に効果が出るらしいですが、ユニプロセッサ(CPUコアが1個だけ)の場合でも、ユーザーインターフェイス周りの反応がよくなるらしいです。





SCHED_ULEにするには、カーネルコンフィギュレーションファイルで

options         SCHED_4BSD

と書いてあるところを、

options        SCHED_ULE

に変更して、カーネルを再構築します。

■ 過去記事
SCHED_ULE、そのものについては触れてませんが、参考までに。







SCHED_ULEは、FreeBSD7だけのものではなくて、6.2-STABLEでも使えるみたいなのですが、これまでの経験上、動いたことが1度もないです。必ず、ブート途中でカーネルがフリーズしてしまうのです。



フリーズするときの条件は



  • 6.2-STABLE (今年の春ごろ以降~今の最新)


  • CPUは、Xeonなどが2個の、SMP構成


  • SCHED_ULE


のときで、これらが必要十分条件ではないです。



フリーズするのは、たいてい、/etc/rcがはじまった後で、ログインプロンプトが出るまでの間に、フリーズしてしまいます(pingにも反応しない)。ひどいときは、シングルユーザーモードでも起動しないこともありました。



HyperThreadingを有効にしたときは、よりフリーズしやすくなるような、そんな感触。



たしかSCHED_4BSDのままでも、HyperThreadingを有効にしただけでフリーズしたこともあったような・・・ だからHTTを切ったんだったかな?



しかも、まったく異なるハードウェアのマシンで、2~3台ほど試して、どれもみなフリーズする・・・


今回、SCHED_ULEの非常によい効果に感激し、もう一度、最新の6.2-STABLEなマシンで、SCHED_ULEを試したのですが、やっぱりフリーズ。



あ~もういいや、ってことで、そのマシン、7-CURRENTにアップデートしてしまいました。今は、FreeBSD 7-CURRENT+HyperThreading+SCHED_ULEで、順調に動いてます(・・・実は1つ変なところがあるけど、見なかったことにしている)。



あとで気づいたのですが、もしかしてフリーズする原因は、cpufreqモジュールや、powerdが関係しているかもしれません。
そういえば、フリーズしたマシンは、どれもpowerdを動かしていました。



もうOSをアップデートしてしまったので、簡単には確認できなくなってしまいましたが。



ちなみに、FreeBSD 7-CURRENT+HyperThreading+SCHED_ULEなマシンでは、powerdも動かしています。



0 件のコメント:

コメントを投稿