遠い昔、遥か彼方の銀河系での話*1。
その頃(というか今も)会社でWindows PCを使っていて、その中にCygwin無しでUnixっぽいCUI環境を構築して作業していた。ある時その擬似Unix環境のメンテや拡張が面倒になったのだけど、かといって今更Cygwinを入れるのも負けた感じでイヤだった。そこでQEMUを使って本物のPC-UNIXを動かして、その中にコンソール環境を構築しようと思い立った。
で、ベースとなるOSの選定を兼ねて、自宅のサブPC上のQEMUでCentOS 5.3とかDebian lennyとかFreeBSD 7.2とかを動かして少し実験してみた。
id:eel3:20090314:1237012192 の改修でサブPCの中身をPentium IIIからIntel Atom 330に入れ替えたところだった。その他の手持ちのPCはPentium 4 2.6GHzの自作PCにAMD Turion 64 X2 TL-52を積んだCressida NB(B5ノートPC)、VIA EPIA-N8000Eを積んだ自作ファイル鯖で、実はAtomといえども手持ちのPCの中では最高のスペックかもしれない状態だった。
実際、元々がPentium IIIの頃のアーキテクチャのPCだった訳で、それがクロックは上昇するしデュアルコアだし、メモリはPC-133からシングルチャネルとはいえDDR2になるし、ディスク周りもPATAからSATAに替わった。下回りが丸ごと近代化されたので、普通にGUI上で操作するだけでも随分と快適になった。
Atom 330はCPUパッケージに1.6GHzのAtom 230を2個載せたデュアルコアなCPUで、仕事でPentium MのノートPCを使っていたこともあり、私の人生で初めて本格的に使うマルチコアだった*2。しかもHyper-Threadingで擬似クアッドコアになっていた。
それは仮想マシンにFreeBSD 7.2を最小構成+manの構成でインストールした後、「この状態でPortsを入れたら、仮想ディスクのサイズはどの程度膨れ上がるのだろう?」と思い立って、
portsnap fetch extract update
――なんて実行してみた時だった。まあCPUパワーを食うこと。Portsツリー全体を取得して展開するのだから当たり前といえば当たり前だ。
しかしCPUを専有しているはずなのにホストOSでは他のアプリが比較的スムーズに動いていた。どういうことかと思って調べてみたら、4つのCPUのうち2つはCPUパワーを使い切る勢いで動作していて*3、残りの2 CPUは殆ど使われていなかった。どうやらデュアルコアの片一方がQEMU上のFreeBSDの動作に割り振られていて、もう片一方で他のアプリケーションを動かしていたようだった。Atom 330……恐ろしい子!
これはOSの実装や設定の影響を大きく受ける話だけど、仮にサブPCのCPUが1.6GHzデュアルコアじゃなくて3.2GHzシングルコアだったとしたら、FreeBSD on QEMU以外のアプリケーションはここまでスムーズには動かなかったと思う。シングルコアCPUのPCでは、プリエンプティブ・マルチタスクなOSを使っていても、あるアプリで高負荷な処理を実行している最中は他のアプリも遅くなる傾向にある。少なくとも今までの経験ではそうだ。
だけどマルチコアCPUのマシンでマルチコア対応のOSを動かしている場合、あるアプリで高負荷な処理を実行する時、そのプロセスを特定のコアに優先的に割り当てて、残りのコアで他のプロセスを処理するように分散させることが可能だ。こうすると、高負荷な処理を実行中でも、他のアプリは比較的スムーズに動くのだろう。
もっともCPU以外のパーツは多重化されていないので、例えばメモリへアクセスする際は排他処理や同期処理によるパフォーマンスの低下が発生することを考慮しないといけない。それに今ではメモリだってCPUより低速な訳で――例えばHDDはそのメモリよりもアクセス速度が遅いので、マルチコアで複数のプロセスを並列的に処理できるといっても、それぞれのプロセスがHDDにガリガリとアクセスするようでは、使い勝手はあまりよくない。SSDも(HDDよりは圧倒的に高速とはいえ)大まかな事情は同じだ。
それでも、何か重い処理を実行する時にデフォルトで「ながら処理」ができるのは便利だと思う。シングルコアCPUの環境でもプロセスの優先度を操作すれば何とかなるかもしれないけど、処理を開始してから優先度を変更する必要性に気づいた場合は実行中の重い処理の隙間をくぐるようにして優先度変更を行うわけで、その時点でUIの動作がストレスが溜まる程度に遅くて使い勝手が悪い状態になっているはずだ。
私に初めてマルチコアの一味違うところを見せつけたIntel Atom 330も、購入して3年以上経ってCeleron 847に交換してしまった。さて、この余ったボードをどうしようか?