そうだ、スケジューラを作ろう

開発:スケジューラを作ろうと思います。

社長:まあ、時間の管理は全ての基本ですからね。

開発:システムを管理したり何したりするにも、時間の記録と、時間に応じたアクションを管理することが重要です。ですが、たとえば cron では分単位でしかアクションを制御できないので、話にならないわけです。50年前の遺物と言えます。

管理:最低でも秒単位、できればミリ秒単位ですね。

開発:性能を測ったりする上では、ミリ秒の精度では足りないのは明らかです。ですがUnixやWindowsでのユーザ向けプログラムならマイクロ秒はかなり十分です。で、ちょっとプログラムを書きかけたのですが、以前からマイクロ秒を扱うシステムの関数のデータ構造が統一されていないのが嫌な気分なわけです。ならいっそナノ秒にということに。

開発:nanosleep()という関数は、Linunx にも MacOSに互換なものとしてある上、これ、シグナルの処理ともセットになっているので、効率も使い勝手も良いと思います。

社長:おっと、1993にはもう存在したということですか… 私がDeleGateを作り始めた時にはもうあったんですね。

開発:コマンドセット的には、time と date のナノ秒版である ntime と ndate。あとスケジューラとしての nschedかと思います。

基盤:ログを眺めるのに tail -f コマンドをよく使うのですが、あれのタイムスタンプ付き版も欲しいですね。

社長:私は cat というか tee コマンドのタイムスタンプ付き版をDeleGateの中で使ってましたね。

開発:つまり tail -f と cat と tee を統合してタイムスタンプを付けるコマンドですね。

社長:複数のファイルを見張って tail -f してマージしてくれるのも良いですね。

開発:tee の fan out に対して fan in というわけですね。それはまあ、shell でマルチプロセスにすれば出来なくもないですが、一つのプロセスにしたほうが効率が良いですね。というかどうせファイルディスクリプタをselectするだけだから、どこかにソケットをつなげて受信しても良い。popenでも良いかもですね。コマンド引数的には、-i ifile1 -i ifile2 -i iprogram -o ofile1 -o ofile2 -o oprogram 的な。

社長:要は URL を書けばよいのかなと思いますね。あと -o に加えて -a とか。ていうかコレ、実装は要するにプロキシサーバみたいなものになりますね。

基盤:なら、入力と出力を同じソケットにつなげてサーバとかクライアントにしてしまうとか。

社長:まあ変換サーバですね。そういえばそもそも、昔の inetd に登録するプログラムってだいたいそういうものでした。今で言えば CGI プログラムみたいな。

開発:出力がマルチキャスト的になると、どこかの受信者が滞ると全体がフリーズしてしまう危険はあります。となると出力にもタイムアウトを付けないといけない。

社長:fan in をマージして一つのファイルなりプロセスに渡す場合、どこから来たデータかにタグを付ける必要もあるでしょうね。

開発:そういえば、SSDとか想定するなら、CPUがネックになる場合、たとえば 並列 find + grep できると高速化できるのにと思います。

社長:どこからきたどういうコンテンツのデータはどこへ送るとか書けると、ルータになりますね。リフレクタにもなりそう。

開発:入力をパターンマッチして変換できると便利ですね。sed を通すとか?

社長:バスみたいですね。viabusもそんな感じでした。

基盤:だんだんスケジューラじゃなくなって来たような…

社長:スケジューラは、時間という入力を得て自分がデータを発信するんだと思います。順々に処理を実行するとか。データじゃなくてシグナルでも良いかな。となると送り先はプロセスですね。

開発:入力の仕様、変換の仕様、出力の仕様をそれぞれに書いて、結線する感じですね。それぞれオートマトンでも良いですが、メモリに余裕があればスレッドにしてしまうのが良いですかね。

基盤:1スレッドに1MBあげても、1000スレッドで1GBですから、今どきのコンピュータなら楽勝ですね。

社長:プロセスにするかスレッドにするかオートマトンにするかは、処理内容によって選択するんでしょうね。プロセス単位であればいわゆるコマンドshellによるプログラム組み合わせ機能になります。

社長:入力部分は言語処理系になりますね。正規表現だけだと弱いので、LL1くらいは入れたい。BNFで記述する。うーん、ついに学生時代まで戻りました(笑)

開発:学生時代に自分で書いたプログラムの発掘なら、知財とか著作権の問題が無くて良いですね(^-^)

社長:スケジューリングのタイミングの指定ですが、時刻表示のワイルドカード的なものが直感的で良いですね。2020-08-02/02:00:00.000 とか、*-*-*/00:00:00 とか、*-*-*/0,6,12,18:00:00:00.000 とか、*-*-*/*:*:00.000 とか。

基盤:IPv6アドレスの省略形みたいのが書きやすいですね。

開発:日付と時刻の間の区切り記号というのが悩ましいところですね。あれは標準があったはずなので、それに従うと良いのだとは思いますが。

開発:ところで今、nanosleepの時間精度をいろんなマシンで観察しているのですが、かなり面白い状況です。他の負荷が高い時に遅れるのは仕方がないとして、スカスカの時にどのくらいの精度があるかなのですが。

開発:ざっくり言って、Unixでも数ミリ秒程度の精度はあるように見えます。ガラ空きの当社アマゾンセール印度支局のAmazon Linuxなんて、数マイクロ秒のふらつきしかないですね。

開発:一方そこそこ仕事をしている東京本部では、時々大きく遅延します。といっても10ミリ秒程度ですが。

開発:通常利用中のMacMiniでも数ミリ秒程度のふらつきです。

開発:何もしてないParallels上のUbuntu 18.04でふらつきが大きいのは、ホストのiMacが何やら色々仕事をしてるからかも知れません。

開発:同じく暇人なHyper/V上のUbuntu 18.04ではふらつきは小さい。0.2ms以下です。これはホストのLenovo自体が暇だからかも知れません。

開発:暇人の最たるものと言えばラズパイ4です。なんといっても組み込み系ですし、さぞやと思ったのですが、それほどでもありませんでした。

社長:プロセスのプライオリティを上げてやるとどうなりますかね?

開発:nice とか使うの、何十年ぶりですかねぇw。sudo nice -20 !

社長:かなり改善はしますね。というかこれ、メモリ空間の中にSysTickレジスタが見えているはずだから、1ms前になったらビジーループでSysTickを観察したりとかすれば、1マイクロ秒より高い精度でスケジュールできるでしょうね。本当のnanosleepができる。

開発:ところで、いつの頃からかラズパイにつながらなくなったなーと思っていたのですが、Etherケーブルが抜けていました。

基盤:物理層の法則ですね。

開発:同じARM LinuxのよしみでQNAPでも動かないかなーとバイナリを持っていきましたが、だめでした。なんというか、実行形式として認識しないようになっているといいますか。

基盤:QNAPは Cortex-A53ですね… ラズパイだと Pi4 は A72 ですが、Rapsberry Pi 3 が Cortex-A53だそうですが。

開発:おおっと、そうですか。A72とA53でバイナリに互換性が無いんですかねー… Mシリーズとか全部互換なんですが。あああれも下位互換ていうだけですね。何にしても実行形式として認知してくれないって、動的ライブラリの関係のような気もするんですが。なにせQちゃんはデバッグ系の機能を全部落としてますから、追えないというか… static link にしてみますかね…

社長:認知されましたね。

開発:てことは、ラズパイ3のバイナリなら動く可能性がありますね。

基盤:ラズパイ3て結構高いんですよね。アマゾンで一番安いところが5200円くらい… まあ、オークションとかでならただ同然かもですが。

基盤:あ、pi 3 A+ 3,300円でありますね。Etherは無いですが無線LANあり。

社長:承認。

開発:早晩QNAPもA72版を出すでしょうけどね… 2万円を維持してくれるかどうかはわかりませんが、ラズパイだって価格は 3 と 4 で変わらないわけだし…

社長:ブラウザのウィンドウとかタブとか、やってる内容ごとにスケジューリングと言うか、少なくとも優先度は変えたいですね。メモリもコンパクションするか否かとか。

社長:それはそうと、わたしはこの、おいしい牛乳パックの注ぎ口のキャップに、テコの原理が採用されたことに、非常に感動しています。目からうろこというか。ぐび。

基盤:ヒトにやさしい技術の使われ方ですね。

— 2020-0801 SatoxITS

Parallels Desktop祭り

基盤:それで Parallels Desktop ですが、どうしましょう。

開発:試用版で色々やってみて、機能性能的に問題なく使えることはわかりました。使いやすいし見た目も、この動作状況のインジケータとかなかなかかわいい。Hyper/Vには無い楽しさです。Mac上で動かすVMサーバとしてはベストのソリューションかも知れません。

基盤:私はこの、Parallels用のUbuntuパッケージの詰め合わせというかセンスが、なんだか好きですね。Parallels用にちゃんと設計されている感じもしますし。 あと、/bin/sh -> /bin/dash になってるところが面白いというか、一事が万事的な感じがします。

経理:アース渦巻第4巻に点火しました。ちょっと飽きたので、今度金鳥も試しましょう。

基盤:それで、選択肢は3つ。スタンダードは1万円で買い切り永久使用できますが、ゲストVMあたりRAM 8GB、4CPUという制約があります。6コアと16GBを持ってるホストの能力をフルに活かすには、4CPUはちょっと残念なところです。

経理:そういうエディション設計ですねw

基盤:それと、このツールの元気さだと、今後の向上が期待できるのでは無いかと思いますので、最新版が使えるサブスクリプションのほうが良いかと思われます。1万円/年です。

社長:では、Proをサブスクライブしましょう。

基盤:なんか安売りクーポンとか乱発してるみたいですが…

経理:ネットで検索しても、どのクーポンが、現在これに使えるのかさっぱりわからないです。このサイトから行ってみます… 1000円お得。

基盤:Toolbox と Access が消えちゃってるのがなんか嫌ですね。

開発:毎年30%オフとかならすごいですが、クーポンて初年度だけですよね。

基盤:毎年新規にサブスクライブするとか。

開発:こういう怪しげなキャンペーンとかクーポンとかやめたほうがいいんじゃないですかね。製品と会社のイメージを落とします。

社長:Microsoftも当初は、WindowsNTキャンペーンのタダ版CDを垂れ流ししてましたけどね。10枚以上は持ってましたw

社長:えーと、もうかれこれ小一時間クーポンを探していますが、この労力によって最低賃金の時給1時間相当を得られるのか?に疑問を持ちます。我社の本来の労働単価は一桁以上違うわけです。普通に買いましょう。

経理:了解です。では、試用版のボタンから行きます。

基盤:ああ、ビジネス版には ToolBox が無償でバンドルされてなかったりするようですね。

経理:ではPro版をPaypalでぽちっ。ライセンスキー出ました。

基盤:では、表示されたライセンスキーをコピペしてぽちっと。

開発:「購入」が消えましたね (^-^)

社長:昔はこの、ライセンスキーを手入力させるソフトが多くて、さんざんつらい思いをしたものです。今で例えれば劣悪版のReCAPTCHAみたいでした。よい時代になりましたね。

* * *

基盤:おっと、MacOS も仮想マシンにできるのですね。Android仮想マシンも面白そう。

開発:Fedora とか CentOS も懐かしいのでインストールしてみますか。

社長:Ubuntuの前はもっぱらFedoraでしたね。

基盤:では片っ端からインストール…

開発:なるほどこれがAndroid OSですか。動きますね。ってこれ、ARM をエミュレーションしてるんですかね。そのせいか、非常に遅い。

基盤:… 死にましたね。

開発:ホストのメモリが16GBでは辛いでしょうね。

基盤:16GB x 2 の追加を2万円くらいでいけます。

社長:しかし仮想マシンイメージのダウンロードにギガビットインターネットは本当にありがたいですね。

基盤:そういうわけで、MacOSのインストールにだけは1時間ばかりかかりましたが、他のOSは数分ですね。

開発:サーバ用のVMなら軽いですが、さすがにデスクトップのOSを数台同時に走らせるのは厳しいですね。CPUがほとんどシステム時間になりますし。

基盤:なにより、メモリがキツイと思います。やはり32GB増量計画ですね。

社長:10年前には各種OS各バージョンの仮想マシンを50台くらいVMwareに持ってましたが、時々クラッシュして2度と立ち上がらなくなるのが恐ろしかったものです。なのでスナップショットは欠かせなかった。昨日から見ていると、クラッシュすることはなきにしもあらずでも、ちゃんと回復しますね。これはゲストOS側の進歩もあるのかなと思います。

開発:当面はUbuntuが主要なお客さんOSだと思いますが、全然問題ないようですので、これからはParallelsですね。

基盤:Hyper/VとホストのLenovoには結構投資しましたが…

開発:まあいずれ、何か実用に生きるか、少くとも思い出にはなるんじゃないですかね。

基盤:そうですか…。では一区切りつきましたので、記念写真をパシャ。

— 2020-0802 SatoxITS