あのォ・・・
RT-LinuxというOSがあるんですけどォ、使い方がよく判らないんですゥ.
"rtlinux"を検索すると、HOWTOなどに混じってサンプルプログラムも散見されます.しかしそれらは2000年前後の古い内容であって、これを書いている2018年のRT-Linuxには合わないんです.例えば、rtl.h/rtl.mkなんていうファイルは現在のRT-Linuxには在りませんから.
最新のRT-Linuxを入手してインストは出来ても、RT APIの仕様が判らない.APIのヘッダファイルがどれかすら判らない.そんな状況です.
どうやらその答えは、たぶんですけどこういう事情じゃないかと思います.
・かつてはrtl.hに定義されているような、RT-Linux固有のAPIが在った
・2018年時点ではそのようなRT-Linux固有のAPIは
・LinuxにもRT-Linuxにも標準装備のpthreadがある
・pthreadには、スレッド優先度という機能がある
・スレッド優先度を高くするとリアルタイム性が改善される
・スレッド優先度=最高設定にしたとき、Linuxならベストエフォートだが、RT-Linuxならリアルタイム性が保証される
つまり、RT-Linuxについて学び使うにはpthreadそのものが対象となる(らしい).
追記:/lib/x86_64-linux-gnu/librt-2.24.so というのがあり、これはリアルタイムライブラリのようです.こちらにlibrtの解説があります.
nm librt-2.24.soでは関数名は表示されませんでした.
strings librt-2.24.soではそれっぽい関数名が出てきました.一例を示します.
pthread_self
pthread_getschedparam
pthread_cond_signal
pthread_setschedparam
__clock_getres
__clock_gettime
__clock_settime
__clock_nanosleep
以下では、kona linux 4.0 でRT-Linuxをインストールして動作テストしてみる辺りまでをレポします.
【Linuxディストリ】
Kona-Linux 4.0 Jackを使います.JackはRT-Linux対応版です.(自分でごにょごにょやればJack以外でもRT化はできます.Jackならお膳立てされとると、そんなかんじー)
【リアルタイムカーネルへのupgrade】
Kona-Linux 4.0 Jackをinstallした直後は、リアルタイムカーネルはinstallされていません.install後に管理者自身ががやらなくちゃいけません.
どうしたらリアルタイムカーネルをinstallできるのか?
これらはやってもムダでした.
apt-get update
apt-get upgrade
メニュー → システムツール → パッケージアップデーター
メニュー → システムツール → GDbiパッケージインストーラー
rebootすると現れることのある「リアルタイムカーネルにupgradeするよう促すダイアログ」から入ってkernel upgradeするのがJackのお膳立てです.しかし、このダイアログが出るかどうかが気まぐれで困りました.強制的に同ダイアログを出すには、こうします.
メニュー → 実行 → initdesktop.sh
upgradeが完了するまでには1時間ぐらいかかります.
upgradeが完了するまでには1時間ぐらいかかります.
リアルタイムカーネルがインストされると、このような名前のdirectoryができているはずです.
/usr/src/linux-headers-4.14.24-rt19-kona-rt
また、uname -a ではこのように表示されます.
Linux rtl 4.14.24-rt19-kona-rt #1 SMP PREEMPT RT Mon Mar 12 19:05:16 JST 2018 x86_64 GNU/Linux
(これらはaptがupdateされると数字が変わります)
【同じリアルタイムカーネルをビルドしてみる】
ムダな行為ではありますが、同じversionのkernelをコンパイルしてみます.
1)linux kernel 4.14.24 source (これ自体は通常Kernel)
ここからLinux sourceを辿れます.
https://www.kernel.org/pub/
下へ降りてゆきます.
https://www.kernel.org/pub/linux/kernel/v4.x/
大量のファイルがあるので、中間ぐらいまでscrollすると linux-4.14.24.tar.gz がありますのでDLします.保存directoryは/usr/src/です.tar xvfzで解凍します.
2)kernel 4.14.24をRT化するpatch
uname表示結果から4.14.24かつrt19を探します.
kernel sourceをDLしたご近所にRT化patchがあります.
https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/
rt19はこのファイルです.
patch-4.14.24-rt19.patch.gz
DLします.保存directoryは/usr/src/です.gzip -dで解凍します.
3)patchをあてる
cd linux-4.14.24
cat ../patch-4.14.24-rt19.patch | patch -p1
4)configする
通常はここでコンパイルの前にconfigするのですが、わたしのマシンにはRT-Linuxをインスト済みなので既存のconfigをコピってそれで良しとしちゃいます.
cp /usr/src/linux-headers-4.14.24-rt19-kona-rt/.config .config
古い.configを読み込ませます.
make oldconfig
5)ビルドする
make
make modules_install
make install
もしかしたらncursesが無いと文句言われるかも.その際はこれで回避.
apt-get install ncurses-dev
リブートすると、、、RT-Linux kernelになってるはずです.
わざわざ再コンパイルしてみた理由は、rtl.hやrtl.mkが生成されるかなと期待したからなのですが、そんなファイルは生成されませんでした.フッやっぱりな、とシニカルな笑みを浮かべたわたしなのでしたー
【リアルタイム性の動作チェック】
rt-testsというtoolがあるのでそれを使います.
apt-get install rt-tests
apt-get install libnuma-dev ←念のため
実行例1 最高優先度 RT-Linux
cyclictest -t 5 -i 10000 -l 1000 -c CLOCK_REALTIME -p 99
T:0 (16648) P:99 I:10000 C:1000 Min: 9 Act:12 Avg:15 Max: 30
T:1 (16649) P:99 I:10500 C: 952 Min: 8 Act:16 Avg:16 Max: 51
T:2 (16650) P:99 I:11000 C: 909 Min:10 Act:18 Avg:17 Max: 61
T:3 (16651) P:99 I:11500 C: 869 Min: 8 Act:29 Avg:22 Max: 57
T:4 (16652) P:99 I:12000 C: 833 Min: 7 Act:17 Avg:16 Max: 49
cyclictestコマンドは、周期実行されるスレッドのjitterを測定してるらしいです.
P:99が最高優先度で、P:0が最低優先度の意味だと思います.
Max:の数字がjitter最大値uSecです.
知見は、
・P:99だとjitterが少ない
・P:0だとjitterが大きい
・でもRTのおかげなのかどうかは不明
なお、ここでCPUに負荷を与える方法は、裏でLinux Kernelをビルドするコトでやってます.yes > /dev/null & では負荷が軽すぎて性能差が出ませんでした.
cyclictestコマンドのoption説明、
-t 5 スレッドを5つ起動する
-i 10000 周期実行サイクル10mSec
-l 1000 1000回で停止
-c clock source
-p 優先度
次に、起動時のGRUB画面で通常Kernelをセレクトして、cyclictestをやってみました.果たしてRTとの性能差は見られますかどうか?
実行例3 最高優先度 通常Kernel
cyclictest -t 5 -i 10000 -l 1000 -c CLOCK_REALTIME -p 99
T:0 (11947) P:99 I:10000 C:1000 Min: 2 Act:13 Avg:15 Max: 972
T:1 (11948) P:99 I:10500 C: 952 Min: 2 Act:12 Avg:13 Max: 802
T:2 (11949) P:99 I:11000 C: 909 Min: 2 Act:10 Avg:11 Max: 42
T:3 (11950) P:99 I:11500 C: 869 Min: 3 Act:14 Avg:12 Max: 240
T:4 (11951) P:99 I:12000 C: 833 Min: 3 Act:11 Avg:12 Max: 244
いや~これは通常Kernelですと優先度最高でもjitterが大きくてだいぶやられちゃってますね.RTの恩恵がひしひしと伝わってきます.他の条件でも試しましたが、煩雑になるので割愛します.
【まとめ】
Kona Linux 4.0にRT-Linuxを無事インストできました.
裏でkernelをビルドするという過大なCPU負荷をかけた状態でなら、RT-Linuxの恩恵を実感できました.
RTOSですと音楽再生音質が優れるという説を耳にしますが、それはCPU負荷が大きいときには顕著ですが、CPU負荷が小さいケースではRTOSでも音質改善は少ないと想像します.
これを書いている時点でのRT-Linuxには、RT-Linux固有のAPIは存在せず、専らプロセスの優先度設定によってRT性を強化する仕組みのように思われます.
cyclictest.cがincludeしているヘッダファイルを調べましたが、thread関連はいつもお馴染みの pthread.h sched.h ぐらいで、RT-Linux patchで追加されたヘッダファイルは見当たりません.
残念ながらpthreadの使い方はあまり判っていません.
情報は古いですが、pthreadの関数一覧はこれらが参考になるかと.
pthread.h
sched.h
timer割り込みしたいなぁ、、、
追記:このページにSCHED_FIFOなどのスケジューラ優先度設定についての解説があり、参考になります.FIFOが最強でOTHERが最弱.
https://linuxjm.osdn.jp/html/LDP_man-pages/man7/sched.7.html
その2へ
かしこ
また、uname -a ではこのように表示されます.
Linux rtl 4.14.24-rt19-kona-rt #1 SMP PREEMPT RT Mon Mar 12 19:05:16 JST 2018 x86_64 GNU/Linux
(これらはaptがupdateされると数字が変わります)
【同じリアルタイムカーネルをビルドしてみる】
ムダな行為ではありますが、同じversionのkernelをコンパイルしてみます.
1)linux kernel 4.14.24 source (これ自体は通常Kernel)
ここからLinux sourceを辿れます.
https://www.kernel.org/pub/
下へ降りてゆきます.
https://www.kernel.org/pub/linux/kernel/v4.x/
大量のファイルがあるので、中間ぐらいまでscrollすると linux-4.14.24.tar.gz がありますのでDLします.保存directoryは/usr/src/です.tar xvfzで解凍します.
2)kernel 4.14.24をRT化するpatch
uname表示結果から4.14.24かつrt19を探します.
kernel sourceをDLしたご近所にRT化patchがあります.
https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/older/
rt19はこのファイルです.
patch-4.14.24-rt19.patch.gz
DLします.保存directoryは/usr/src/です.gzip -dで解凍します.
cd linux-4.14.24
cat ../patch-4.14.24-rt19.patch | patch -p1
4)configする
通常はここでコンパイルの前にconfigするのですが、わたしのマシンにはRT-Linuxをインスト済みなので既存のconfigをコピってそれで良しとしちゃいます.
cp /usr/src/linux-headers-4.14.24-rt19-kona-rt/.config .config
古い.configを読み込ませます.
make oldconfig
5)ビルドする
make
make modules_install
make install
もしかしたらncursesが無いと文句言われるかも.その際はこれで回避.
apt-get install ncurses-dev
リブートすると、、、RT-Linux kernelになってるはずです.
わざわざ再コンパイルしてみた理由は、rtl.hやrtl.mkが生成されるかなと期待したからなのですが、そんなファイルは生成されませんでした.フッやっぱりな、とシニカルな笑みを浮かべたわたしなのでしたー
【リアルタイム性の動作チェック】
rt-testsというtoolがあるのでそれを使います.
apt-get install rt-tests
apt-get install libnuma-dev ←念のため
実行例1 最高優先度 RT-Linux
cyclictest -t 5 -i 10000 -l 1000 -c CLOCK_REALTIME -p 99
T:0 (16648) P:99 I:10000 C:1000 Min: 9 Act:12 Avg:15 Max: 30
T:1 (16649) P:99 I:10500 C: 952 Min: 8 Act:16 Avg:16 Max: 51
T:2 (16650) P:99 I:11000 C: 909 Min:10 Act:18 Avg:17 Max: 61
T:3 (16651) P:99 I:11500 C: 869 Min: 8 Act:29 Avg:22 Max: 57
T:4 (16652) P:99 I:12000 C: 833 Min: 7 Act:17 Avg:16 Max: 49
実行例2 最抵優先度 RT-Linux
cyclictest -t 5 -i 10000 -l 1000 -c CLOCK_REALTIME
T:0 (25417) P: 0 I:10000 C:1000 Min: 7 Act:15 Avg:16 Max: 335
T:1 (25418) P: 0 I:10500 C: 952 Min: 7 Act: 8 Avg:16 Max:1004
T:2 (25419) P: 0 I:11000 C: 909 Min: 7 Act:24 Avg:19 Max: 513
T:3 (25420) P: 0 I:11500 C: 869 Min: 8 Act:18 Avg:19 Max: 493
T:4 (25421) P: 0 I:12000 C: 833 Min: 8 Act:15 Avg:18 Max: 545
cyclictestコマンドは、周期実行されるスレッドのjitterを測定してるらしいです.
P:99が最高優先度で、P:0が最低優先度の意味だと思います.
Max:の数字がjitter最大値uSecです.
知見は、
・P:99だとjitterが少ない
・P:0だとjitterが大きい
・でもRTのおかげなのかどうかは不明
なお、ここでCPUに負荷を与える方法は、裏でLinux Kernelをビルドするコトでやってます.yes > /dev/null & では負荷が軽すぎて性能差が出ませんでした.
cyclictestコマンドのoption説明、
-t 5 スレッドを5つ起動する
-i 10000 周期実行サイクル10mSec
-l 1000 1000回で停止
-c clock source
-p 優先度
次に、起動時のGRUB画面で通常Kernelをセレクトして、cyclictestをやってみました.果たしてRTとの性能差は見られますかどうか?
実行例3 最高優先度 通常Kernel
cyclictest -t 5 -i 10000 -l 1000 -c CLOCK_REALTIME -p 99
T:0 (11947) P:99 I:10000 C:1000 Min: 2 Act:13 Avg:15 Max: 972
T:1 (11948) P:99 I:10500 C: 952 Min: 2 Act:12 Avg:13 Max: 802
T:2 (11949) P:99 I:11000 C: 909 Min: 2 Act:10 Avg:11 Max: 42
T:3 (11950) P:99 I:11500 C: 869 Min: 3 Act:14 Avg:12 Max: 240
T:4 (11951) P:99 I:12000 C: 833 Min: 3 Act:11 Avg:12 Max: 244
いや~これは通常Kernelですと優先度最高でもjitterが大きくてだいぶやられちゃってますね.RTの恩恵がひしひしと伝わってきます.他の条件でも試しましたが、煩雑になるので割愛します.
【まとめ】
Kona Linux 4.0にRT-Linuxを無事インストできました.
裏でkernelをビルドするという過大なCPU負荷をかけた状態でなら、RT-Linuxの恩恵を実感できました.
RTOSですと音楽再生音質が優れるという説を耳にしますが、それはCPU負荷が大きいときには顕著ですが、CPU負荷が小さいケースではRTOSでも音質改善は少ないと想像します.
これを書いている時点でのRT-Linuxには、RT-Linux固有のAPIは存在せず、専らプロセスの優先度設定によってRT性を強化する仕組みのように思われます.
cyclictest.cがincludeしているヘッダファイルを調べましたが、thread関連はいつもお馴染みの pthread.h sched.h ぐらいで、RT-Linux patchで追加されたヘッダファイルは見当たりません.
残念ながらpthreadの使い方はあまり判っていません.
情報は古いですが、pthreadの関数一覧はこれらが参考になるかと.
pthread.h
sched.h
timer割り込みしたいなぁ、、、
追記:このページにSCHED_FIFOなどのスケジューラ優先度設定についての解説があり、参考になります.FIFOが最強でOTHERが最弱.
https://linuxjm.osdn.jp/html/LDP_man-pages/man7/sched.7.html
その2へ
かしこ
0 件のコメント:
コメントを投稿