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年間熟成してから 出荷してるとか。ウィスキーやブランディーと同じ工程なんだな。 オイラーも六角さんの様に、現地を訪問してみたいぞ。

その前に、ちょっとお勉強。 米焼酎と日本酒の製法の違いとは?覚えておきたい蒸留酒と醸造酒の作り方 とか、 焼酎の作り方をわかりやすく解説|製造工程を詳しく説明 が出てきた。

九州まで行くのは大変なので、こちらで購入できないか、酒蔵ならぬ酒屋巡り。 そしたら、麦と芋にはさまれて、米が置いてあった。地元産。しかもシェリー樽 バージョンだった。ラッキーですね。

良い香りで、女房が旨い旨いと、がんばって飲んでくれて。残り僅か。


This year's Index

Home