time
Table of Contents
firefox 135
何気に河豚板で pkg_add -u
したら、firefox 135になった。英語から日本語への
翻訳がサポートされた。が、どうも昔追加したモジュールを上手に利用してるっぽい。
そういえばLubuntuはどうかなと思って 調べたら134だった。どうすんねん?
sudo snap refresh snap info firefox : channels: latest/stable: 135.0-2 2025-02-04 (5701) 270MB - : installed: 135.0-2 (5701) 270MB -
これでいいみたい。定期的に更新を確認してupgradeしてくれるみたいだけど、常に firefoxを起動してるんで、更新のタイミングを逃してしまってたみたいだ。
vmd vs. real at OpenBSD
前回OpenBSDでの仮想PCであるvmdで、対決を夢想した。でも、メモリー状況を 概算してみたら、十分な環境を作成できないと言う結論に至った。 そこで、厚かましく河豚板の作者さんに追試をお願いした。
マシンのスペックは次のようなモンスター
Hardware: DELL G5 5590 CPU: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz (6core) Memory: 34146570240 (32564MB) vmdの場合は 8G 割り当て
実験方法
# sysctl hw.smt=1 ;; マルチプロセッサー時、SMT有効にする # rcctl stop obsdfreqd # apmd -H # cd /usr/src/sys/conf # config GENERIC # cd ../compile/GENERIC # make clean # make depend # time make [-j13]
測定はご丁寧に2回づつ実施頂いたが、実行時間(real)で比べて遅い方を掲載する。 vmdでマルチ・プロセッサーは、まだサポートされていない為、-j1相当のみになる。
vmd 14m13.10s real 8m42.59s user 1m23.28s system real 12m35.34s real 10m10.11s user 1m41.80s system real -j13 2m19.20s real 20m00.33s user 4m39.92s system
注目は、vmd/realな比較で、usr,system共、vmdの方が速い。どんなマジック? vmdの時の、収集漏れが有るのではなかろうか。
実マシンで、一人船頭の場合 10m10.11s(user)で終了する仕事量が、船頭が 13人(-j13だが、6コアなんで実質 -j6)になると、延べ時間が20mと倍増。 system時間に至っては、3倍近くも余分にかかっている。これ、談合に時間ばかり かかっていて正味の仕事が疎かになってるんだな。
正に、船頭多く船は山に登るの 実例ではなかろうか。でも、皆の協力で、仕事全体は、速やかに完了してる。 全体は上手く取り繕って、投入した人数分の仕事をした様に見えるけど、CPU時間で 課金されるとしたら、無駄金って事になるな。まるで、どかかの土木工事のJV (ジョイント・ベンチャー)みたいな構図。大阪でIRの為の地均しのために、実施 される、万博が、そうなっていない事を祈るのみ。
実行時間の比率を求めてみた。
;; vmd / real > (apply / (map tos '(14m13.10s 12m35.34s))) 1.1294251595308074 ;; -j1 / -j13 > (apply / (map tos '(12m35.34s 2m19.20s))) 5.426293103448277
次は、実マシンで課金時間の根拠になるuser+sysをそれぞれ求め、そこから無駄時間を 計算してみた。
> (define j13 (apply + (map tos '(20m00.33s 4m39.92s)))) ;; = 1480.25 > (define j1 (apply + (map tos '(10m10.11s 1m41.80s)))) ;; = 711.91 > (- j13 j1) 768.34
無駄時間の方が、一人でやった場合の時間を上まわっている。
なお、同マシンはWindowsも稼動するそうで、Hyper-Vなる仮想でOpenBSDを 起動しようとしたら出来なかった由。腐った仮想だ事。昔、VirtualBOXや VMWareでもOpenBSDが起動しない時代があった。今は大丈夫なんで、Windowsの 力の入れ方が透けて見えるな。
その節は面倒な願い事を心よく引き受けて頂き、まことにありがとうございました。
hdd speed
前回はSSDのスピードを簡易測定して 309M/s な値を得た。ならば旧式なHDDはどうだろう? i386が鎮座してる10年越えなThinkPad SL510で測定してみる。 一応HDDのスペック 。 日立ってか国産のハードディスクって、とっくに撤退してるんだな。
ob$ dd if=/dev/zero of=mydmy bs=1M count=500 500+0 records in 500+0 records out 524288000 bytes transferred in 7.293 secs (71889208 bytes/sec)
リナ流に表現すると、71M/s か。SSDの1/4な性能だな。まてまて、HDDって、データが ディスク上で、何処に配置されてるかで変化するぞ。そんな経験があったな。再度 検証してみるか。その為のスクリプトを作成した。
vmd vs. real な対決では、測定を2回実施いただいたんで、悪い結果を採用した。悪い方を 採用しておけば、それより悪くなる確率は小さいだろうと踏んだからだ。よく、健康 診断の前日はアルコールや油分は控えましょうと案内されてる。毎日がそうなら、いいけど 、それじゃ非日常だろう。
今回はスクリプトに実行させるので、何回でも好きなだけ計測できる。んで、20回測定する 事にした。20回に1回ぐらいはバラツキが2σを越える可能性が有るだろうと見越したんだ。
#! /bin/sh dmy=$1 for t in `seq 20` do dd if=/dev/zero of=$dmy bs=1M count=500 2>&1 | grep trans | sed 's#.*secs (##' | sed 's# bytes/sec)##' rm $dmy done
ddからのメッセージはstderrに出てくるので、2>&1 | としてパイプに合流させてる (kshの制限で |& が使えないからね)。 それから、書き込むファイル名は、コマンドラインから絶対パスで指定する事にしてる。 何故か?
ディスクの任意の場所を指定するのは、やってやれない事は無いけどOSと喧嘩するはめになるんで、 危険すぎる。そこで、パーテション配置すなわち、 絶対パスで妥協しよう。現状。
ob$ df -h Filesystem Size Used Avail Capacity Mounted on /dev/sd0a 989M 321M 619M 35% / /dev/sd0f 9.7G 756M 8.5G 9% /home /dev/sd0d 23.2G 3.4G 18.7G 16% /usr /dev/sd0e 38.7G 5.2G 31.6G 15% /usr/local /dev/sd0g 153G 74.1G 71.7G 51% /var mfs:83844 743M 8.0K 706M 1% /tmp
真面目にパーテションを切ってパスを分解してる。一方、物理的な配置表。
ob$ disklabel sd0 # /dev/rsd0c: label: HITACHI HTS54502 16 partitions: # size offset fstype [fsize bsize cpg] a: 2104448 64 4.2BSD 2048 16384 12960 # / b: 4209033 2104512 swap # none c: 488397168 0 unused d: 50347680 6313568 4.2BSD 2048 16384 12960 # /usr e: 83891424 56661248 4.2BSD 2048 16384 12960 # /usr/local f: 20980896 140552672 4.2BSD 2048 16384 12960 # /home g: 326863552 161533568 4.2BSD 4096 32768 26062 # /var
こんな具合に(オフセットを見れば)、それぞれのスタート位置が判明する。/ が、一番 外周に配置。/usr/localは外周よりちょっと中心に近い位置。/varは直径の半分よりも 内周っぽい所が空いているって推測できる。
ob# ./hdd.sh /var/my500Mdummy >atVAR
後は、こんな風にしてデータを採取すればよい。 次はデータの表示だな。バラツキが有る(はず)なので、箱ヒゲ図か。gnuplotで普通に描画 すると、見難いものになってしまう。ここは皆様の知恵を拝借しましょ。
箱ひげ図 (boxplot, box-and-whisker plot)
awkを駆使して、ラベル付けと、長桁を丸めて、M/sにした。
: sakae#lu:set$ cat atVAR | awk '{print("var", $1 / 10^6)}' >> hdd.txt sakae@lu:set$ less hdd.txt root 81.6648 root 80.9961 : root 79.2934 root 82.2929 local 75.0914 local 73.958 local 76.083 : var 68.4896 var 70.1576
作業はこんなの。Y軸の範囲をちょいと変更して、色々なショットを描画。
フル・ショット 地に足が着いた、全景表示
ミドル・ショット 中間的な表示
クローズ・アップ 針小棒大な強調表示
マスコミが良くグラフで 分りやすく表示してくれるけど、結構自分の主張を強調するように、表示範囲を いじっているから注意。
gnuplot> set grid gnuplot> set yrange [50:100] gnuplot> plot 'hdd.txt' using (0):2:(0):1 with boxplot gnuplot> set terminal svg gnuplot> set output 'hddM.svg' gnuplot> replot
一番外周の / (root) エリアが高速。後は、local、varの順に、内周に行く程、 性能は悪化していく。この理由は、外周が一番速い為である。
time
これまた、前回、プロセスの実行時間計測に活躍してくれたコマンド。これが、どう 実装されているか、DeepSeekしてみる。知恵はローカルに詰っているぞ。
man time
もちろん、参照先はOpenBSDのそれです。
分かりきったコマンドだけど、一応確認
-l The contents of the rusage structure are printed. -p The output is formatted as specified by IEEE Std 1003.2-1992 ("POSIX.2").
-pのPOSIX.2 って、リナ軍団が勝手に決めた仕様だな。bash風な出力になる。 もう一つの -l は、標準提供のtimeだとエラーになる。
vm$ time -l emacs . ksh: time: -l unknown option
しょうがないので、ソースから作成したtimeで試す。
vm$ ./time -l emacs . 753.08 real 1.15 user 0.27 sys 44492 maximum resident set size 0 average shared memory size 0 average unshared data size 0 average unshared stack size 19547 minor page faults 6 major page faults 0 swaps 4 block input operations 84 block output operations 0 messages sent 0 messages received 3 signals received 80 voluntary context switches 80 involuntary context switches
ソースに対面
核心部分だけを抽出してみた。
clock_gettime(CLOCK_MONOTONIC, &before); switch (pid = vfork()) { case 0: /* child */ execvp(*argv, argv); while (wait3(&status, 0, &ru) != pid) continue; clock_gettime(CLOCK_MONOTONIC, &after); timespecsub(&after, &before, &during); fprintf(stderr, "%9lld.%02ld real ", (long long)during.tv_sec, during.tv_nsec / 10000000); fprintf(stderr, "%9lld.%02ld user ", (long long)ru.ru_utime.tv_sec, ru.ru_utime.tv_usec / 10000); fprintf(stderr, "%9lld.%02ld sys\n", (long long)ru.ru_stime.tv_sec, ru.ru_stime.tv_usec / 10000);
起動前に時計を確認。forkして子供として指定コマンドを実行。終了をwait3で待って、リソース の使用情報を収集。また時計を確認。そして差分をrealとして表示。後は使用情報を user/systemに分けて表示。まあ、何と素直なプログラムでしょう。
疑問が有ります
このソースから、22m13.34s みたいな表示は生まれるのか? どうやっても無理だろう。 それから、-l オプションも供えつけのtimeではエラーになってた。
素直に考えると、提供されてるソースからコンパイルされたものでは無いって事。
ちょいと河豚板で実験。1時間を越えるrealな待ちをしたら、どう表示してくる?
eq$ time sleep 3605 60m05.00s real 0m00.00s user 0m00.00s system
1h00m05.00sじゃないのね。ふーん、そんなもんですかい。
eq$ doas make cc -O2 -pipe -Werror-implicit-function-declaration -MD -MP -c time.c cc -o time time.o eq$ ./time sleep 63 63.00 real 0.00 user 0.00 sys
ソースからコンパイルしたバイナリーを、そのまま実行すると、ソースの通りに動作する。 ならば、
eq$ doas mv time /usr/bin/ override r-xr-xr-x root/bin for /usr/bin/time? y eq$ time sleep 65 1m05.01s real 0m00.00s user 0m00.00s system
所定の位置に配置すると、挙動(表示)が変った。なお、河豚板では、出荷されたバイナリーが 通常アクセスする場所からリンクされている。
eq$ gdb time (gdb) b 109 Breakpoint 1 at 0x23cc: file time.c, line 109. (gdb) r sleep 63 Starting program: /ram/usr/bin/time sleep 63 Breakpoint 1, main (argc=2, argv=0x71c27bf42d60) at time.c:109 109 fprintf(stderr, "%9lld.%02ld real ", (gdb) p during.tv_sec $1 = 63 (gdb) c Continuing. 63.00 real 0.00 user 0.00 sys
gdbで挙動を観察しようとすると、ソースに記述された通りの挙動を示す。何じゃらホイ?
これって、量子力学の有名なやつ、量子の位置と運動量は、同時に決定できない、みたい なものだな。で、その魔界は、/usr/bin に存在するとな。
shell's time
/usr/binに存在するって、何気ない一言が、Ah 体験のきっかけですよ。簡単な実験を 敢行。
vm$ /usr/bin/time -l sleep 65 65.01 real 0.00 user 0.00 sys 580 maximum resident set size : vm$ \time -l sleep 65 65.01 real 0.00 user 0.00 sys 580 maximum resident set size 0 average shared memory size : vm$ time -l sleep 65 ksh: time: -l unknown option
これはもう、shellが間に介在してるって結論しかないな。(コマンドの前に、バックスラッシュ を置くと、エイリアスを無視するって約束が有る)
timeがshellの内部エイリアスなんだな。man kshしたら、こんな機能を提供してますって 説明が出てきた。
time [-p] [pipeline] If a pipeline is given, the times used to execute the pipeline are reported. If no pipeline is given, then the user and system time used by the shell itself, and all the commands it has run since it was started, are reported. The times reported are the real time (elapsed time from start to finish), the user CPU time (time spent running in user mode), and the system CPU time (time spent running in kernel mode). Times are reported to standard error; the format of the output is: 0m0.00s real 0m0.00s user 0m0.00s system If the -p option is given, the output is slightly longer: real 0.00 user 0.00 sys 0.00
大騒ぎした割に、平凡な結論だったな。自省をこめてkshのソースを確認。
c_sh.c
/* * time pipeline (really a statement, not a built-in command) */ int timex(struct op *t, int f, volatile int *xerrok) clock_gettime(CLOCK_MONOTONIC, &ts0); rv = execute(t->left, f | XTIME, xerrok); if (t->left->type == TCOM) tf |= t->left->str[0]; clock_gettime(CLOCK_MONOTONIC, &ts1); timespecsub(&ts1, &ts0, &ts2); if (tf & TF_POSIX) p_ts(shl_out, 1, &ts2, 5, "real ", "\n"); else p_ts(shl_out, 0, &ts2, 5, NULL, " real ");
user/sysの計算部分は省略したけど、当然この関数内にある。
p_ts(struct shf *shf, int posix, struct timespec *ts, int width, char *prefix, char *suffix) { if (posix) shf_fprintf(shf, "%s%*lld.%02ld%s", prefix ? prefix : "", width, (long long)ts->tv_sec, ts->tv_nsec / 10000000, suffix); else shf_fprintf(shf, "%s%*lldm%02lld.%02lds%s", prefix ? prefix : "", width, (long long)ts->tv_sec / 60, (long long)ts->tv_sec % 60, ts->tv_nsec / 10000000, suffix); }
おまけで、表示部分も付けておきます。これを最初に発見してれば、1時間も実行放置 して、1hXXmYYs となるか、調べなくても済んだのにね。まあ、人生なんて、そんなもんだよ。
LTS 24.04.2
24.04 LTSの2回目のポイント・リリースらしい。暫時セキュリティーアップデートが 行なわれるんだけど。それを半年毎にまとめて(8、2月)ISOにしてるそうだ。 真面目にアップデートしてる人は、単なる通過点。
sakae@lu:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04.2 LTS Release: 24.04 Codename: noble
そして、Proに加入しろと煩い宣伝が目につきだした。始めた頃は、こんな宣伝は なかったんだけどな。
sakae@lu:~$ sudo apt upgrade パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています... 完了 状態情報を読み取っています... 完了 アップグレードパッケージを検出しています... 完了 Get more security updates through Ubuntu Pro with 'esm-apps' enabled: vlc-plugin-qt libvlc5 vlc-data libvlccore9 vlc vlc-bin vlc-l10n libcjson1 emacs-nox libpostproc57 vlc-plugin-samba libavcodec60 vlc-plugin-notify libavutil58 libswscale7 vlc-plugin-access-extra vlc-plugin-skins2 vlc-plugin-svg emacs-el vlc-plugin-video-splitter libswresample4 vlc-plugin-video-output libavformat60 emacs-common libvlc-bin emacs-bin-common vlc-plugin-base vlc-plugin-visualization libavfilter9 Learn more about Ubuntu Pro at https://ubuntu.com/pro アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
DRINK
NHKの飲み鉄を観ていたら、熊本から宮崎方面への列車で、酒蔵を尋ねていた。 米焼酎ですって。麦か芋ばかりかと思っていたら、意外な材料が出てきて 、ちょっと驚いた。
その蔵では減圧蒸留後、シェリー酒の貯蔵に使った樽で3年間熟成してから 出荷してるとか。ウィスキーやブランディーと同じ工程なんだな。 オイラーも六角さんの様に、現地を訪問してみたいぞ。
その前に、ちょっとお勉強。 米焼酎と日本酒の製法の違いとは?覚えておきたい蒸留酒と醸造酒の作り方 とか、 焼酎の作り方をわかりやすく解説|製造工程を詳しく説明 が出てきた。
九州まで行くのは大変なので、こちらで購入できないか、酒蔵ならぬ酒屋巡り。 そしたら、麦と芋にはさまれて、米が置いてあった。地元産。しかもシェリー樽 バージョンだった。ラッキーですね。
良い香りで、女房が旨い旨いと、がんばって飲んでくれて。残り僅か。