LoginSignup
5
5

More than 5 years have passed since last update.

PPS使用ntpdのjitterを改善する

Last updated at Posted at 2017-01-30

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でもPRrtと表示された。
これは効果があった(記憶では)。ざっくり、数百usec->数usec(記憶では)。
OSのアップデート等と混ぜてしまったり、旧環境との比較の記録等がなく、正確な比較はできていないが…。
ntpdが優先されて困りそうなものもないし、設定してしまう。

-Nオプションの追加方法

Arch Linuxのsystemdの場合。
1. /usr/lib/systemd/system/ntpd.serviceExecStartに、-Nを追加
2. # systemctl daemon-reload
3. # 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のカーネルパラメータ参照。
1. /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULTに、intel_idle.max_cstate=1を追記
2. # grub-mkconfig -o /boot/grub/grub.cfg
3. 再起動

intel_idle.max_cstate=1の効果を、図で

ntp_offset-day.png

ちなみに、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オーダー(?)に悪化。
dmesghardppsと表示はされたものの、自分のやり方が根本的に間違っている気がする。
ppsctlのオプションを変えたりしたが、結果はあまり変わらなかった…。

試した内容 (間違っている気がする)

  1. kernelのconfigで、CONFIG_NO_HZ=yをやめ、CONFIG_HZ_PERIODIC=yを選択。
  2. kernelを再コンパイル後、再起動。
  3. こちらからpps-toolsのppsctlを用意
  4. # ppsctl -b -f -a /dev/pps1
  5. /etc/ntp.conffudge 127.127.20.0flag31
  6. # 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が発想の源となった。感謝。

参考文献

GPSD Time Service HOWTO

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5