はじめに
MacBook でスリープ解除後にシステム時刻がズレることがあります。
そもそもですが、パソコン内のシステム時刻は、日本の標準時とは多少ズレます。
実際のシステム時刻のズレを NICT のサイトで確認してみましょう。
私の MacBook の場合、正常時は以下のようになります。
正常時ですが、0.2 秒遅れていることがわかります。
今回の記事では、この時刻が大きく過去にズレてしまう事象について、原因と解決策を記載します。
問題の事象について
今回の事象は、このシステム時刻がスリープ解除時にさらに大きくズレてしまうというものです。
NICT サイトで確認すると以下のようになります。
25712.4 秒 (7 時間強) の遅れが生じていることがわかります。
原因の概要
原因としては、システムクロックがスリープ解除時にハードウェアクロックと時刻同期していない状況かと思います。(雑な予想ですが)
※ 根本原因は詳細に調査していませんが、おそらく特定のプロセスが悪さしているか、リソースの過剰消費等かと考えてます
※ 事象再現時に pmset -g assertions コマンドでスリープの妨害状況を確認してみてもいいかもです
システムクロックとハードウェアクロックとは
まず、普段 MacBook を使用しているときにユーザが参照する時刻は、システムクロックです。
先ほどの NICT の画像で言う所の「コンピュータの内蔵時計」に該当します。
端末にはシステムクロックともう一つ、ハードウェアクロックというものが存在します。
以下、ざっくりとしたそれぞれの説明です。
- システムクロック(ソフトウェアクロック):
- OS が稼働中に時刻を保持する
- スリープモードに入るとシステムクロックは停止する
- スリープモード解除時に RTC と同期する
- 高精度(ナノ秒単位で記録。厳密にはハードウェアカウンタが記録)
- ハードウェアクロック(RTC):
- システムがスリープ中やオフライン環境、シャットダウン中でも時刻を保持する
- 独立した電源(CMOS バッテリー)で駆動する
- 低精度(秒単位で記録)
今回はスリープ解除時に時刻ずれが生じていることから、システムクロックと RTC の同期に問題があった可能性が高いと考えています。
加えて、NTP サーバとの同期も行われていないために過去の時間が参照されているものと考えています。
RTC そのものに問題がないかは、ネットワークを切断した状態で OS 起動し、時刻を確認してみると良いでしょう。
(timedatectl コマンドが使えれば早いのですが、残念ながら Mac OS では利用できません)
解決策
日付と時刻を自動的に設定を再有効化する方法
Mac のシステム設定からポチポチする方法です。
- まず、システム設定を開き、一般→日付と時刻を選択します。
- 「日付と時刻を自動的に設定」のチェックを外して再度チェックします。
これで、NTP サーバと能動的に同期します。
NTP サーバとの同期するコマンドを実行する方法
Terminal 等から以下のコマンドを実行する方法です。
sudo sntp -sS time.apple.com
この方法も、さくっと同期できます。
キャッシュの削除と timed プロセスの再起動
システム時刻の設定や同期情報を保存するキャッシュファイルとして、/var/db/timed/com.apple.timed.plist が保持されます。
また、 timed デーモンは macOS のシステム時刻同期を管理するプロセスです。
これらの削除、再起動を行い時刻同期の正常化を図ります。
キャッシュファイルの削除
## キャッシュファイルの削除
$ sudo rm /var/db/timed/com.apple.timed.plist
timed プロセスの再起動
## timed プロセスの再起動
### プロセス ID 確認
$ ps aux | grep timed
root 53877 0.0 0.0 34125288 440 s001 R+ 9:14AM 0:00.00 grep timed
system-user 50148 0.0 0.0 33690860 2928 ?? S 8:51AM 0:00.08 /usr/libexec/timed
_timed 49951 0.0 0.0 33691084 3584 ?? Ss 8:49AM 0:00.11 /usr/libexec/timed
### プロセスキル
$ kill 49951
補足: キャッシュファイルの内容確認方法
ちなみに、/var/db/timed/com.apple.timed.plist はバイナリ形式で保存されているため、読みたい人は XML 形式にして読むか、defaults read コマンドで読みましょう。
## XML 形式変換
sudo plutil -convert xml1 /var/db/timed/com.apple.timed.plist
cat /var/db/timed/com.apple.timed.plist
## defaults read コマンド
$ sudo defaults read /var/db/timed/com.apple.timed.plist
さいごに
もしいずれの解決策でも改善しない場合は、カーネルが古すぎるかもしれません。
OS を最新版にアップデートして改善するか試しましょう。
それでも改善しない場合は、ハード側の問題かもしれませんので、最終手段レベルですが SMC, NVRAM をリセットしてみてもいいかもしれません。
以下の公式ドキュメントを参考にしてみてください。
以上です。
コメント