GPSのPPSを用いた、Stratum 1のNTPサーバ。
CPUがだいぶ古かったので、新しくしたら、何故かjitterが(当然offsetも)大幅に悪化。
こんなはずでは…。
環境
- OS
- Arch Linux
- kernel 4.8〜4.9 (調査中にupdateしちゃった)
- GPS/PPS/ntpd周辺 (旧環境・新環境共通)
- GPSは、Garmin GPS 18x LVC Firmware version 4.00
- PPSは、RS-232CのDCDに接続
- RS-232Cは、USB-シリアル変換経由ではなく、マザーボード上のもの (Novoton?)
- ntpdは、timepps.hを/usr/includeにコピーしてリビルドし、PPS対応に
-
/etc/ntp.confでの時刻源は、Generic NMEA - PPSは、
# ldattach PPS /dev/ttyS0で、/dev/pps1を作成 (/dev/pps0はNICがPTP向けに使用)
- 旧環境
- Pentium Dual-Core E2200
- Intel DG965SS
- jitterは平均1usec未満
- offsetは数usec (環境温度に影響される)
- 新環境
- Core i7-3770
- ASUS B75M-PLUS
- jitterが数百usecというところからスタート
自分の環境で効いた、改善ネタ
ntpdのniceオプション
ntpdの起動オプションに-Nを追加する。ntpdのソースを見ると、SCHED_FIFOが設定される模様。設定したら、topでもPRがrtと表示された。
これは効果があった(記憶では)。ざっくり、数百usec->数usec(記憶では)。
OSのアップデート等と混ぜてしまったり、旧環境との比較の記録等がなく、正確な比較はできていないが…。
ntpdが優先されて困りそうなものもないし、設定してしまう。
-Nオプションの追加方法
Arch Linuxのsystemdの場合。
-
/usr/lib/systemd/system/ntpd.serviceのExecStartに、-Nを追加 # systemctl daemon-reload# systemctl restart ntpd.service
C state
これに気づくのが大変だった。
ArchWikiの周波数スケーリングの記事を見ながら、cpupowerに次いで、ふとi7zを実行したところ、99%、C6 stateに居る。
C6からの割り込み応答時間は、ぱっと探したところではわからなかったが、C7からで110usecという記事を発見。C6からでも10数usecはかかりそうな予感。古いCPUには無いstateと考えると、辻褄も合う。
完全省電力Offはいまいちなので、復帰が一瞬と思われる、C1までを使うように設定する。
なお、BIOS設定は無視されるとの情報もある。
Raspberry Piなら、CPUが違うので、関係ないね。
GRUBでの設定方法
Arch Linuxで実験。ArchWikiのカーネルパラメータ参照。
-
/etc/default/grubのGRUB_CMDLINE_LINUX_DEFAULTに、intel_idle.max_cstate=1を追記 # grub-mkconfig -o /boot/grub/grub.cfg- 再起動
intel_idle.max_cstate=1の効果を、図で
ちなみに、UPSのloadに変化は見られなかった。
その他、ググった改善ネタ
ASYNC_LOW_LATENCY
シリアルポートには、low latencyに設定するフラグがある。ただ、カーネルのソースをASYNC_LOW_LATENCYで検索すると、USB-シリアル変換などでは効果がありそうに見えたが、16550Aドライバでの扱いは、よくわからなかった。
おまじない程度に、やっておくかな。
# setserial /dev/ttyS0 low_latency
linuxppsの例では、udevのrulesの中で、setserialしている。
PPS Kernel Discipline
PPSを、Kernel Disciplineで使う。詳細はこちら。
Raspberry Piで成功してる方もいるようだが、やってみたところ、msオーダー(?)に悪化。
dmesgでhardppsと表示はされたものの、自分のやり方が根本的に間違っている気がする。
ppsctlのオプションを変えたりしたが、結果はあまり変わらなかった…。
試した内容 (間違っている気がする)
- kernelのconfigで、
CONFIG_NO_HZ=yをやめ、CONFIG_HZ_PERIODIC=yを選択。 - kernelを再コンパイル後、再起動。
-
こちらからpps-toolsの
ppsctlを用意 # ppsctl -b -f -a /dev/pps1-
/etc/ntp.confのfudge 127.127.20.0のflag3を1に # systemctl restart ntpd.service
CPU governor
CPUクロックを高クロックで固定する。
# cpupower frequency-set -g performanceで設定できそうだが、ぶんまわしたくないので、未確認。
宿題
- 一瞬、J3455でもやってみたが、
-Nだけでも、offsetは10usec前後、jitterは1usecくらいだったんだよなぁ(記憶では)。C stateはどこに居たんだろ。Atom系のC sataeは議論があったようだが、詳細未確認。 - Kernel Disciplineは、理解未達。
- Raspberry Piでも試したいが、まずPCでやっているのは、PTP対応NICが使えるから。
一言
ArchWikiが発想の源となった。感謝。
