[トップ][一覧][最近の更新]

archives/2006/01

OpenBSD/rthread

Category of OpenBSD

あけましておめでとうございます。

作業環境のノートが故障しているので放置していましたが、 これからもちょくちょく更新します。よろしくお願いします。

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/libaoOpenBSD-cvs:ports/devel/glibOpenBSD-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、スレッドの振り分けの効率、どちらも良いとは言い難い。 今後に期待。