トップ 最新 追記

Orz日記 by Akio Morita

ToDo:

  • 15 SAD Fit[]回りの障害事例の解析
  • 10 smart pointer版PEGクラスの再実装(Left Recursionまわり)
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|06|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|07|08|09|10|11|12|
2013|01|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|06|07|08|10|12|
2016|01|02|03|05|06|08|10|11|
2017|01|02|03|04|05|06|07|09|10|11|12|
2018|01|02|03|04|06|07|08|09|10|11|12|
2019|01|03|04|05|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|

2023-08-07 [長年日記]

_ [雑記]NTPのGPS/1PPS同期状態とfudgeパラメータ

fudge flag1=on/flag3=on/time1=0μsec 運用

  • pll freqは、NoisyだがCPU温度に相関
  • pll offsetは、概ね ±30μsecを維持

ntp_peers ntp_kernel_pll_offset ntp_kernel_pll_freq coretemp

fudge flag1=on/flag3=off/time1=0μsec 運用

  • pll freqは、なめらかにCPU温度に相関するも、一部応答遅れが見える
  • pll offsetの変化はなめらかだが、pll freq遷移時は大きくずれる(応答が遅れている)

ntp_peers ntp_kernel_pll_offset ntp_kernel_pll_freq coretemp

fudge flag1=on/flag3=off/time1=0→200μsec fudgetime1遷移

  • 12:08にfudgetime1変更
  • pll offset, GPS/1PPS peer offsetの中心値は、0を維持
  • ntp.nict.go.jpは、fudgetime1校正係数の補正でマイナス側にシフトしている(ジッターが大きく分かり辛い)

ntp_peers ntp_kernel_pll_offset ntp_kernel_pll_freq coretemp

fudge flag1=on/flag3=on/time1=0→200μsec fudgetime1遷移

  • 11:56にfudgetime1変更
  • pll offsetの中心値は、0を維持
  • GPS/1PPS peer offsetの中心値は、+200μsecへ遷移
  • ntp.nict.go.jp peer offsetは動いていない
  • GPS/1PPS peer offsetへ校正係数は反映されるが、PLL offsetは変わらない(Kernel側で、PLLがかかっている)

ntp_peers ntp_kernel_pll_offset ntp_kernel_pll_freq coretemp


2023-08-08 [長年日記]

_ [FreeBSD]FreeBSD 13.2-STABLE on Raspberry Pi4

buildworld/buildkernelしてみたが、UFS ROOTイメージだと 32GB SDHCでは不足することが判明

  • /usr/src 3.1GB
  • /usr/ports 2.5 GB
  • /usr/obj/usr/src/arm64.aarch64 16GB

amd64環境の6.2GBに比べてobjが大きい気がしたが、ZFS vs UFSの違いで透過圧縮が効いているためで、amd64環境もlogicalusedは14.1GBあった


2023-08-09 [長年日記]

_ [FreeBSD]FreeBSD 13.2-STABLE on Raspberry Pi4

/etc/src.conf

WITHOUT_DEBUG_FILES=
WITHOUT_PROFILE=
WITHOUT_TESTS=

を追加して、/usr/obj/usr/src/arm64.aarch64 4.5GBにダイエット成功

_ [SAD]SAD on RPI4

ieee_arithmeticモジュール問題( PR255890, GCC PR100662)の問題に関しては、lang/gcc12にパッチを当てて、sad-last.exeが出来るところまでは行った

aarch64-darwin向けに用意されているfpu-aarch64.hを援用したが、fpu-glibc.hの方が良いのかも…

--- libgfortran/configure.host.orig     2022-08-19 17:09:27.740690120 +0900
+++ libgfortran/configure.host  2023-08-09 12:45:37.841351000 +0900
@@ -60,6 +60,10 @@
         fpu_host='fpu-aarch64'
         ieee_support='yes'
         ;;
+      freebsd*)
+        fpu_host='fpu-aarch64'
+        ieee_support='yes'
+        ;;
     esac

 esac

自分フォークでbench2を取ってみた

*********** summary of the bench mark
       Function Test   6.1534
       Optics Test     9.287157
       Tracking Test   4.051647999999998
       Matching Test   .6251829999999998
       Overall Score (smaller is faster): .2919677321428571

比較対象として、Ryzen7950X(Tctl 75℃ limit with PBO)だと…

*********** summary of the bench mark
       Function Test   .641927
       Optics Test     1.036083
       Tracking Test   .3200790000000002
       Matching Test   .06863999999999981
       Overall Score (smaller is faster): .03012566369047619

なので、今時のCPUに対して1桁遅い

tcl buildが失敗するぽぃ

Tcl/Tk 8.4だとfpsetroundシンボルが見つからずtclshリンク時に失敗する

/usr/include/machine/ieeefp.hではextern fp_rnd_t fpsetround(fp_rnd_t)で宣言されているが、libcにシンボルが含まれない (amd64環境は入っている)

なんかバグっぽぃ…

_ [雑記]GPS/1PPSジッターのホスト依存性

比較対象はGPSレシーバ3号機

Host 1PPS jitter
Ryzen 7950X/B650M PG ~300μsec
Ryzen 5950X/X570 AUROS PRO 1~2μsec

どうも、Ryzen 7950X/B650M PGのUSBバス回り or CPUジッターが大きい模様…


2023-08-11 [長年日記]

_ [雑記]GPS/1PPSトレンド測定

GPSレシーバ1号機+Intel N305とGPSレシーバ3号機+Ryzen 5950Xのとある1日のGPS/1PPSによるNTP PLLのトレンドを測定した。

  • 各レシーバのアンテナは窓に並べて固定
  • PC筐体は同一の部屋に設置
  • チャートはmuninによる5分毎のサンプリングによる

Ryzen5950X環境だと、散発的に発生する大きなPLL offsetスパイクに引きずられて、PLL freqにスパイクで見える

PLL offsetに見えるノイズ成分は、Ryzen5950X環境側はノイズフロアは低いが、スパイク状のノイズが乗り安定性を損なっているように見える (N305環境は暗雑音多めだが、全般的な安定性は優秀)

GPSレシーバ1号機+Intel N305

ntp pll offset ntp pll freq cpu temp

GPSレシーバ3号機+Ryzen 5950X

ntp pll offset ntp pll freq cpu temp


2023-08-21 [長年日記]

_ [FreeBSD]Emacs29

editors/emacsに来ているのだが、幾つか互換用に残っていたシンボルが削除されている影響が…

japanese/anthy

src-util/anthy.elが影響を受けており、Toggleで日本語入力モードに入ったあと出られなくなる

必要なシンボルの置き換え

  • inactivate-current-input-method-function -> deactivate-current-input-method-function
  • inactivate-input-method -> deactivate-input-method

2023-08-25 [長年日記]

_ [FreeBSD]stable/14がbranchした

currentからstable/14の枝が生えたので、14.0向けた作業が本格化する模様

直前のcurrent mailing listだとZFSのdeadlockが報告されているので、予定通りにリリースされるかは微妙な気が…


2023-08-29 [長年日記]

_ [FreeBSD]NTP with 閏秒付きtime_t

最近は閏秒挿入を止める方向になっているので、今更感が漂うネタなのだが、 FreeBSDはWITH_ZONEINFO_LEAPSECONDS_SUPPORT付きでビルドするとsystem clockを閏秒付きで運用できる

timezone databaseも変更になるから localtime(3)とかは問題なく動くがgettimeofday(2)などが返すtime_tが閏秒付きの経過秒数になるので、POSIX的に問題が出る このため、FreeBSD libcにはtime2posix(3), posix2time(3)というposix time_tと閏秒付きの time_tを変換するユーティリティ関数が用意されている

さて、WITH_ZONEINFO_LEAPSECONDS_SUPPORT付き環境での時刻同期であるが、同梱のntpやnet/ntp, net/openntpは閏秒挿入分ずれてしまうので、 国際原子時間TAIベースで動作するdjbのsysutils/clockspeed内のclockspeed + sntpclockを時刻合わせに使うことになるのだが、これらは1PPS信号同期に対応していない

というわけで、contrib/ntpを改造してみた(net/ntpへの修正も同一)

ntpの内部実装は、システムクロックがPOSIX time_tであることを仮定しているので、適宜time2posixで変換してやればよいが、kernelからシステムクロックが渡ってくる場所が複数あるので、複数箇所の修正が必要となる

  • NTP peerとの同期に必要な修正箇所
    • get_systime @ libntp/systime.cでシステムクロックをNTP内部形式で返す部分
    • fetch_timestamp @ contrib/ntp/ntpd/ntp_io.cでsocketの拡張機能でkernelから受け取るパケット受信タイムスタンプをNTP内部形式で返すところ
  • driver20で1PPS同期に必要な修正箇所
    • refclock_ppsaugment @ contrib/ntp/ntpd/ntp_refclock.cでtime_pps_fetchから受け取るpps edgeのタイムスタンプをNTP内部形式で返す部分
      • GPS_NMEA driver(20)は、PPSモード時は pps edgeのタイムスタンプを内部処理で参照する(Note. ATOM driver(22)は、小数部しか参照しない)

以上3ヶ所の修正で、システムクロックへの閏秒挿入の有無と関係ないくNTP peerの同期および GPS_NMEA + 1PPSな同期が可能になった

diff --git a/contrib/ntp/libntp/systime.c b/contrib/ntp/libntp/systime.c
index 76fba7fe1608..cf99ae317c51 100644
--- contrib/ntp/libntp/systime.c.orig
+++ contrib/ntp/libntp/systime.c
@@ -186,6 +186,7 @@ get_systime(
       l_fp    lfpdelta;

       get_ostime(&ts);
+      ts.tv_sec = time2posix(ts.tv_sec);      /* Remove leapsecs on time_t */
       DEBUG_REQUIRE(systime_init_done);
       ENTER_GET_SYSTIME_CRITSEC();

diff --git a/contrib/ntp/ntpd/ntp_io.c b/contrib/ntp/ntpd/ntp_io.c
index bb35ffd68511..e185001037df 100644
--- contrib/ntp/ntpd/ntp_io.c.orig
+++ contrib/ntp/ntpd/ntp_io.c
@@ -3394,7 +3394,7 @@ fetch_timestamp(
                                       /*
                                        * bintime documentation is at http://phk.freebsd.dk/pubs/timecounter.pdf
                                        */
-                                      nts.l_i = pbt.sec + JAN_1970;
+                                      nts.l_i = time2posix(pbt.sec) + JAN_1970;       /* Remove leapsecs on time_t */
                                       nts.l_uf = (u_int32)(pbt.frac >> 32);
                                       if (sys_tick > measured_tick &&
                                           sys_tick > 1e-9) {
@@ -3438,6 +3438,7 @@ fetch_timestamp(
                                       }
                                       DPRINTF(4, ("fetch_timestamp: system usec network time stamp: %jd.%06ld\n",
                                                   (intmax_t)ptv.tv_sec, (long)ptv.tv_usec));
+                                      ptv.tv_sec = time2posix(ptv.tv_sec);    /* Remove leapsecs on time_t */
                                       nts = tval_stamp_to_lfp(ptv);
                               }
                               break;
diff --git a/contrib/ntp/ntpd/ntp_refclock.c b/contrib/ntp/ntpd/ntp_refclock.c
index a16c980e5b09..149f5fefe717 100644
--- contrib/ntp/ntpd/ntp_refclock.c.orig
+++ contrib/ntp/ntpd/ntp_refclock.c
@@ -1596,7 +1596,7 @@ refclock_pps(
       /*
        * record this time stamp and stuff in median filter
        */
-      pp->lastrec.l_ui = (u_int32)ap->ts.tv_sec + JAN_1970;
+      pp->lastrec.l_ui = (u_int32)time2posix(ap->ts.tv_sec) + JAN_1970;       /* Remove leapsecs on time_t */
       pp->lastrec.l_uf = (u_int32)(dtemp * FRAC);
       clk_add_sample(pp, dcorr);
       refclock_checkburst(peer, pp);
@@ -1695,6 +1695,7 @@ refclock_ppsaugment(
               return FALSE; /* WHICH edge, please?!? */

       /* convert PPS stamp to l_fp and apply fudge */
+      timeout.tv_sec = time2posix(timeout.tv_sec);    /* Remove leapsecs on time_t */
       *stamp = tspec_stamp_to_lfp(timeout);
       DTOLFP(ppsfudge, delta);
       L_SUB(stamp, delta);

カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記