2018年3月21日水曜日

kona linux 4.0 jack リアルタイムカーネル (RTLinux) を試す (1) 導入

リアルタイムOSってのを使ってみたくありませんか?

あのォ・・・
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時間ぐらいかかります.

リアルタイムカーネルがインストされると、このような名前の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

実行例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 件のコメント:

コメントを投稿