OpenBSD/rthread
あけましておめでとうございます。
作業環境のノートが故障しているので放置していましたが、 これからもちょくちょく更新します。よろしくお願いします。
rthreadねたその2
で、rthreadねた(OpenBSD/2005/12/04/rthread)を書いたのでその後の経過報告。
rthread自体はかなり安定しているようで、ここのところcommitも減少ぎみ。 対応ハードウェアは増加中(OpenBSD-cvs:src/lib/librthread/arch/)。
で、これだけではおもしろくないので、実際にrthreadワールドを体験してみる。
自宅にハードディスクがクラッシュしたまま腐っていた2cpuのデスクトップが転がっているので、 こいつにハードディスクを入れなおして-currentをインストール。 ちなみにこんなマシン。
cpu0: Intel Pentium III ("GenuineIntel" 686-class) 773 MHz cpu1: Intel Pentium III ("GenuineIntel" 686-class) 773 MHz
せっかくだからportsを全部rthreadでビルドすることにチャレンジ。 やりかたは簡単。以下のようにすべし。
まずはカーネルスレッドを有効にするためにOpenBSD-man:configに
option RTHREADS
を追加し、カーネルを再構築。
ユーザーランドをrthread専用に変更すべく、 marc-openbsd-tech:113363486715506のとおりに OpenBSD-cvs:src/lib/libc/sys/Makefile.incを変更。
gccの`-pthread'オプション指定時の動作をlibrthreadのリンクにさせるために、 OpenBSD-cvs:src/gnu/usr.bin/gcc/gcc/config/openbsd-libpthread.h の-lpthreadを-lrthreadに変更し、make buildする。
あとは普通にportsをビルドしていくわけだが、 autoconfにてpthreadの判定を-lpthreadが通るかどうかで判定している奴らがあるので、 この場合は、configureをいじるなり、 configure.inをいじるなりして対処(-lpthreadを-ptheradに変更)すべし。 具体的には OpenBSD-cvs:ports/audio/libao、OpenBSD-cvs:ports/devel/glib、OpenBSD-cvs:ports/graphics/glitz など。
で、これだけなのだが、それなりに動いているようだ。
OpenBSD-man:topに-Tオプションが追加されたので、 プロセスとスレッドを見てみる。
load averages: 0.93, 0.85, 0.69 18:11:08 39 processes: 1 running, 37 idle, 1 on processor CPU0 states: 6.2% user, 0.0% nice, 2.4% system, 0.0% interrupt, 91.4% idle CPU1 states: 1.0% user, 0.0% nice, 0.2% system, 0.0% interrupt, 98.8% idle Memory: Real: 192M/235M act/tot Free: 11M Swap: 0K/1024M used/tot PID USERNAME PRI NICE SIZE RES STATE WAIT TIME CPU COMMAND 21326 xxxxxxxx 2 0 59M 81M sleep/0 poll 9:38 28.56% firefox-bin 15859 _x11 2 0 51M 86M sleep/0 select 4:38 12.60% Xorg 2750 xxxxxxxx 32 0 59M 81M sleep/0 thrsle 2:16 5.96% firefox-bin 29648 xxxxxxxx 2 0 6388K 11M run/0 - 0:34 0.44% gkrellm 942 xxxxxxxx 2 0 2060K 4380K sleep/0 select 0:07 0.05% enlightenment 5080 xxxxxxxx 2 0 59M 81M sleep/0 poll 0:10 0.00% firefox-bin ...
firefox-binのpidがばらばらだからって複数起動してるわけじゃないよ(ちなみにOpenBSDはpidを常にかき混ぜるようになってる)。 thrsleはスリープしているスレッドのことなんだろうな。
ということでfirefoxがrthreadで動いてることは確認できた。めでたしめでたし。
スレッドの効率
スレッドの効率はやはり気になるところなので、調べてみる。
pthreadのコードは書いたことがないのでちょっと自信がないけど、 10スレッド生成して1000000まで数えるだけのサンプル(files:thread-counter.tar.gz)。
-lrthreadのとき。
$ time ./thread-counter 1000000: 162732 103183 69927 96880 85715 63803 78509 130350 208901 ./thread-counter 0.00s user 0.01s system 0% cpu 9.098 total
-lpthreadのとき。
$ time ./thread-counter 1000000: 139003 107625 107625 107625 107625 107625 107624 107624 107624 ./thread-counter 1.97s user 0.02s system 93% cpu 2.118 total
libpthreadの方が速いのがなんとも。 といってもrthreadは全力で走ってないようだ。なんでだろ。
1cpuでもやってみる。
こんなマシン。
cpu0: Intel Pentium III ("GenuineIntel" 686-class, 128KB L2 cache) 702 MHz
-lrthreadのとき。
$ time ./thread-counter 1000000: 584249 252305 12919 0 0 0 70030 0 80497 ./count 0.00s user 0.02s system 0% cpu 15.264 total
スレッド生成が異様に遅い。なんでだろ。
-lpthreadのとき。
$ time ./thread-counter 1000000: 139574 107554 107554 107553 107553 107553 107553 107553 107553 ./count 2.21s user 0.01s system 72% cpu 3.045 total
まとめ
rforkによるspawn、スレッドの振り分けの効率、どちらも良いとは言い難い。 今後に期待。