Linux リアルタイムカーネルを使いたかった - TK's HP

TK's HP ホーム » スポンサー広告 » linux » Linux リアルタイムカーネルを使いたかった

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Linux リアルタイムカーネルを使いたかった

Ubuntuの公式ページによると、Ubuntu10.04はリアルタイムカーネルでは無いらしい。

最近私のまわりでリアルタイムカーネルが良いという話を聞くので、少し調べてみたところ、簡単にリアルタイムカーネル化できそうだったので、やってみた。

リアルタイムカーネルのインストール
$sudo apt-get install linux-rt
使い方は、インストール後に再起動し、grubからlinux-****-rtと最後に'rt'がついたカーネルを選べば良いらしい。
もし気に入らなかったら今まで通り'linux-***-generic'とついたカーネルを選択すれば、元の環境に戻るので気楽にインストールできる。


リアルタイムカーネルのテストプログラムのインストール
$ sudo apt-get install rt-tests

テストコマンド

$ sudo cyclictest -t 5 -n -p 99 -i 5000 -d 5000 -c CLOCK_REALTIME -q
引数の意味は以下の通り。
-t 5 スレッドを5個立ち上げる
-n 高精度タイマーclock_nanosleepを使う
-p プロセスの優先度を99(最小0-99最大の範囲)
-i 5000 スレッドのsleep時間のベースを5000usに設定する
-d 5000  スレッドのスレッド間の時間差を5000usに設定する
-c CLOCK_REALTIME sleepのクロックにCLOCK_REALTIMEを使用する。
-q SIGINTが送られるまで(Ctrl-Cが押されるまで)結果を表示しない



私が書いているプログラムが最低でも5000us周期以上でしか動かないので、この値を使用しています。

結果はこんな感じ

T: 0 ( 2229) P:99 I:5000 C: 272 Min: 13 Act: 88 Avg: 57 Max: 128
T: 1 ( 2230) P:98 I:10000 C: 136 Min: 13 Act: 35 Avg: 44 Max: 107
T: 2 ( 2231) P:97 I:15000 C: 91 Min: 9 Act: 19 Avg: 44 Max: 107
T: 3 ( 2232) P:96 I:20000 C: 68 Min: 9 Act: 56 Avg: 35 Max: 71
T: 4 ( 2233) P:95 I:25000 C: 55 Min: 8 Act: 36 Avg: 26 Max: 50
T : スレッド番号
P : 優先度
I : sleepする時間(usec)
C : 更新したカウント数
Min : 指定したsleep時間との差の最小値
Act : 指定したsleep時間との差の今回の値
Avg : 指定したsleep時間との差の平均値
Max : 指定したsleep時間との差の最小値



以下の様に比較実験を行いました。
カーネル比較実験
環境は
リアルタイムカーネル:Ubuntu 10.04 with Linux 2.6.31-10-rt
普通のカーネル:Ubuntu 10.04 with Linux 2.6.32-24-generic
CPU:celeron su2300 (1.2GHz * 2 , cache 1MB)
memory:3.1G(4G積んでるけど32bitOSなので最後まで認識しない)


実行コマンド
$ sudo cyclictest -t 5 -n -i 5000 -d 5000 -c CLOCK_REALTIME -q & sleep 600 ; sudo kill -SIGINT `ps a | grep cyclictest | head -n 1 | cut -d ' ' -f 2`
の様な感じで後ろにコマンドを追加して600秒(10分)経過したら自動的に終了するように設定しています。
また、このコマンドを実行しているよこで、普通にブラウザなども立ち上げて作業していたので、必ずしもすべて同じ環境とは限りません。


普通のカーネル

優先度:無
nanosleep
$ sudo cyclictest -t 5 -n -i 5000 -d 5000 -c CLOCK_REALTIME -q
T: 0 ( 1946) P: 0 I:5000 C: 119807 Min: 12 Act: 80 Avg: 140 Max: 15756
T: 1 ( 1947) P: 0 I:10000 C: 59904 Min: 13 Act: 133 Avg: 124 Max: 15574
T: 2 ( 1948) P: 0 I:15000 C: 39937 Min: 14 Act: 69 Avg: 115 Max: 13559
T: 3 ( 1949) P: 0 I:20000 C: 29953 Min: 14 Act: 93 Avg: 96 Max: 15542
T: 4 ( 1950) P: 0 I:25000 C: 23963 Min: 11 Act: 148 Avg: 89 Max: 15687

setitimer
$ sudo cyclictest -t 5 -i 5000 -d 5000 -c CLOCK_REALTIME -q
T: 0 ( 2040) P: 0 I:5000 C: 119745 Min: 12 Act:310140 Avg:204198 Max: 314524
T: 1 ( 2041) P: 0 I:10000 C: 59902 Min: 10 Act:20036 Avg:14152 Max: 28233
T: 2 ( 2042) P: 0 I:15000 C: 39937 Min: 10 Act: 97 Avg: 70 Max: 12537
T: 3 ( 2043) P: 0 I:20000 C: 29953 Min: 10 Act: 19 Avg: 57 Max: 9100
T: 4 ( 2044) P: 0 I:25000 C: 23962 Min: 9 Act: 19 Avg: 46 Max: 12505


優先度:最高
nanosleep
$ sudo cyclictest -t 5 -n -p 99 -i 5000 -d 5000 -c CLOCK_REALTIME -q
$ T: 0 ( 2152) P:99 I:5000 C: 119806 Min: 8 Act: 26 Avg: 91 Max: 8262
T: 1 ( 2153) P:98 I:10000 C: 59904 Min: 9 Act: 120 Avg: 82 Max: 8318
T: 2 ( 2154) P:97 I:15000 C: 39936 Min: 7 Act: 9 Avg: 81 Max: 8318
T: 3 ( 2155) P:96 I:20000 C: 29953 Min: 7 Act: 96 Avg: 59 Max: 7856
T: 4 ( 2156) P:95 I:25000 C: 23962 Min: 7 Act: 10 Avg: 38 Max: 8178

setitimer
$ sudo cyclictest -t 5 -p 99 -i 5000 -d 5000 -c CLOCK_REALTIME -q
T: 1 ( 2189) P:98 I:10000 C: 59904 Min: 12 Act: 33 Avg: 78 Max: 8299
T: 2 ( 2190) P:97 I:15000 C: 39937 Min: 12 Act: 40 Avg: 112 Max: 8776
T: 3 ( 2191) P:96 I:20000 C: 29953 Min: 10 Act: 37 Avg: 50 Max: 8248
T: 4 ( 2192) P:95 I:25000 C: 23963 Min: 10 Act: 125 Avg: 40 Max: 7098


リアルタイムカーネル
優先度:無
nanosleep
$ sudo cyclictest -t 5 -n -i 5000 -d 5000 -c CLOCK_REALTIME -q
T: 0 ( 5053) P: 0 I:5000 C: 119808 Min: 22 Act: 29 Avg: 29 Max: 12903
T: 1 ( 5054) P: 0 I:10000 C: 59905 Min: 13 Act: 65 Avg: 96 Max: 13172
T: 2 ( 5055) P: 0 I:15000 C: 39937 Min: 18 Act: 80 Avg: 71 Max: 12838
T: 3 ( 5056) P: 0 I:20000 C: 29953 Min: 14 Act: 69 Avg: 73 Max: 12808
T: 4 ( 5057) P: 0 I:25000 C: 23963 Min: 19 Act: 66 Avg: 68 Max: 11861

setitimer
$ sudo cyclictest -t 5 -i 5000 -d 5000 -c CLOCK_REALTIME -q
T: 0 ( 5111) P: 0 I:5000 C: 119730 Min: 16 Act:409770 Avg:185398 Max: 409770
T: 1 ( 5112) P: 0 I:10000 C: 59903 Min: 16 Act:19307 Avg: 9981 Max: 19992
T: 2 ( 5113) P: 0 I:15000 C: 39937 Min: 14 Act: 27 Avg: 29 Max: 14014
T: 3 ( 5114) P: 0 I:20000 C: 29953 Min: 15 Act: 22 Avg: 23 Max: 5122
T: 4 ( 5115) P: 0 I:25000 C: 23963 Min: 15 Act: 27 Avg: 25 Max: 5097


優先度:最高
nanosleep
$ sudo cyclictest -t 5 -n -p 99 -i 5000 -d 5000 -c CLOCK_REALTIME -q
T: 0 ( 5159) P:99 I:5000 C: 119809 Min: 7 Act: 14 Avg: 14 Max: 112
T: 1 ( 5160) P:98 I:10000 C: 59905 Min: 6 Act: 12 Avg: 11 Max: 109
T: 2 ( 5161) P:97 I:15000 C: 39937 Min: 7 Act: 13 Avg: 11 Max: 24
T: 3 ( 5162) P:96 I:20000 C: 29953 Min: 8 Act: 13 Avg: 11 Max: 24
T: 4 ( 5163) P:95 I:25000 C: 23963 Min: 8 Act: 15 Avg: 11 Max: 29

setitimer
$ sudo cyclictest -t 5 -p 99 -i 5000 -d 5000 -c CLOCK_REALTIME -q
T: 0 ( 5437) P:99 I:5000 C: 119816 Min: 17 Act: 35 Avg: 24 Max: 204
T: 1 ( 5438) P:98 I:10000 C: 59909 Min: 16 Act: 33 Avg: 22 Max: 447
T: 2 ( 5439) P:97 I:15000 C: 39940 Min: 16 Act: 34 Avg: 22 Max: 235
T: 3 ( 5440) P:96 I:20000 C: 29955 Min: 16 Act: 22 Avg: 21 Max: 180
T: 4 ( 5441) P:95 I:25000 C: 23964 Min: 16 Act: 29 Avg: 22 Max: 287


考察
プロセスの優先順位を上げると、リアルタイムカーネルは圧倒的に結果が良くなったことから、リアルタイムカーネルの良さが分かる。
しかし、優先順位を設定しない場合でtimerを使用した場合(赤で表示)だと、評価が著しく悪くなっている。
このことから、リアルタイムカーネルだからといって、正しく使わなければ逆に性能が落ちてしまうことが分かる。


私の現在のプログラムは優先順位なんて設定していないし、usleepを使用しているプログラムがほとんどなので、とりあえず普通のカーネルを使用した方が性能が良いと考えられるので、当分手を出さない方が良さそうだ。
(一応sched_setschedulerで優先順位を設定できるで設定できそうだ。詳しくはcyclictestのソースを読むのが簡単。しかし下手に優先順位が高いプログラムを書くとデッドロックを起こすので、注意が必要そうだ。)

参考サイト
試験運用中なLinux備忘録
Real-Time Linux Wiki
Ubuntuの公式ページ
関連記事
記事に間違いなどがあればすぐに訂正いたしますので、コメントしてください。
コメント
非公開コメント

トラックバック

http://tclip.blog.fc2.com/tb.php/89-e7ad5ae0

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。