MacBookでスリープ解除後にシステム時刻がズレる問題の解決策

Blog-Thumbnail_Apple-01 Apple

はじめに

MacBook でスリープ解除後にシステム時刻がズレることがあります。

そもそもですが、パソコン内のシステム時刻は、日本の標準時とは多少ズレます。

実際のシステム時刻のズレを NICT のサイトで確認してみましょう。

JST Clock

私の MacBook の場合、正常時は以下のようになります。

正常時ですが、0.2 秒遅れていることがわかります。

今回の記事では、この時刻が大きく過去にズレてしまう事象について、原因と解決策を記載します。

問題の事象について

今回の事象は、このシステム時刻がスリープ解除時にさらに大きくズレてしまうというものです。

NICT サイトで確認すると以下のようになります。

25712.4 秒 (7 時間強) の遅れが生じていることがわかります。

原因の概要

原因としては、システムクロックがスリープ解除時にハードウェアクロックと時刻同期していない状況かと思います。(雑な予想ですが)
※ 根本原因は詳細に調査していませんが、おそらく特定のプロセスが悪さしているか、リソースの過剰消費等かと考えてます
※ 事象再現時に pmset -g assertions コマンドでスリープの妨害状況を確認してみてもいいかもです

システムクロックとハードウェアクロックとは

まず、普段 MacBook を使用しているときにユーザが参照する時刻は、システムクロックです。
先ほどの NICT の画像で言う所の「コンピュータの内蔵時計」に該当します。

端末にはシステムクロックともう一つ、ハードウェアクロックというものが存在します。
以下、ざっくりとしたそれぞれの説明です。

  • システムクロック(ソフトウェアクロック):
    • OS が稼働中に時刻を保持する
    • スリープモードに入るとシステムクロックは停止する
    • スリープモード解除時に RTC と同期する
    • 高精度(ナノ秒単位で記録。厳密にはハードウェアカウンタが記録)
  • ハードウェアクロック(RTC):
    • システムがスリープ中やオフライン環境、シャットダウン中でも時刻を保持する
    • 独立した電源(CMOS バッテリー)で駆動する
    • 低精度(秒単位で記録)

今回はスリープ解除時に時刻ずれが生じていることから、システムクロックと RTC の同期に問題があった可能性が高いと考えています。
加えて、NTP サーバとの同期も行われていないために過去の時間が参照されているものと考えています。

RTC そのものに問題がないかは、ネットワークを切断した状態で OS 起動し、時刻を確認してみると良いでしょう。
(timedatectl コマンドが使えれば早いのですが、残念ながら Mac OS では利用できません)

解決策

日付と時刻を自動的に設定を再有効化する方法

Mac のシステム設定からポチポチする方法です。

  1. まず、システム設定を開き、一般日付と時刻を選択します。
  2. 日付と時刻を自動的に設定」のチェックを外して再度チェックします。

これで、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 をリセットしてみてもいいかもしれません。
以下の公式ドキュメントを参考にしてみてください。

Mac の SMC をリセットする - Apple サポート (日本)
SMC は、Mac の電源管理を司っています。電源管理や熱管理に関して起こりがちな問題の一部は、SMC をリセットすれば解決する場合があります。
Mac で NVRAM をリセットする - Apple サポート (日本)
NVRAM に記録されている一部の設定が Intel 搭載モデルの Mac で正常に働かない場合は、NVRAM をリセットしてみると解決できるかもしれません。

以上です。

コメント