PowerTOPとmlterm

tksmashiw2008-01-29

愛機(Fedora 8 on Vostro 1400)でPowerTOPを試してみた。
その結果、mltermが割り込み回数ダントツトップ(19.9回/秒)を記録。
まさかmltermがcpuのアイドルを妨げているとは!
そこで、原因を調べてみた。


# strace $(pidof mlterm)
Process 2653 attached - interrupt to quit
[]select[](18, [4 8 11 17], NULL, NULL, {0, 29000}) = 0 (Timeout)
read(8, 0x88a3970, 4096) = -1 EAGAIN (Resource temporarily unavailable)
read(8, 0x88a3970, 4096) = -1 EAGAIN (Resource temporarily unavailable)
[]select[](18, [4 8 11 17], NULL, NULL, {0, 50000}) = 0 (Timeout)
read(8, 0x88a3970, 4096) = -1 EAGAIN (Resource temporarily unavailable)
read(8, 0x88a3970, 4096) = -1 EAGAIN (Resource temporarily unavailable)
[]select[](18, [4 8 11 17], NULL, NULL, {0, 50000}) = 0 (Timeout)
・・・以下延々と続く

どうもselectが怪しいのでman selectしてみたら、selectは次のイベントを待つシステムコールで、
この場合は50000マイクロ秒=0.05秒でtimeoutしているようだ。(0.05秒/回と19.9回/秒で計算も合う。)
そこでmltermのソースディレクトリに移動し、


# []grep[] -rH '\Wselect(' .
./xwindow/x_term_manager.c: if( ( ret = []select[]( maxfd + 1 , &read_fds , NULL , NULL , &tval )) != 0)
./xwindow/x_window_manager.c: /* events should be flushed before waiting in []select[]() */
./doc/ja/README.dev: #####[]文字化け[]#####
./kiklib/src/kik_unistd.c: if( []select[]( 0 , NULL , NULL , NULL , &tval) == 0)

より、xwindow/x_term_manager.cをいじれば良さそうなことが分かった。
select_tut(2)を読むと、

select() を使うときは、タイムアウトは設定すべきでない。

と書かれているので、思い切って&tvalをNULLに書き換えてコンパイルしてみると、PowerTOPにmltermが表示されなくなった。
何か副作用があるかもしれないが、とりあえずめでたしめでたしということで。
Fedora用のrpm物置に置いておく。