用語集/よく見かけるプロセス

logd

別名: 統合ログ

結論

logdは、統合ログを動かすmacOSのプロセスです。統合ログとは、macOSとアプリが動作中に報告する内容を記録した、システム全体の記録です。すべてのプロセスがログメッセージをlogdに渡し、logdはそれを圧縮して、最近のものをメモリに保持し、残りをディスク上のログストアに保存します。コンソールアプリやターミナルのlogコマンドは、そこから読み取ります。

logdは1つだけで、rootで動き、Macの起動時にlaunchdが起動します。macOS Sierra以降、ほとんどのメッセージは/var/logのテキストファイルには書かれなくなりました。アプリはメッセージをlogdに渡し、logdはそれを圧縮したバイナリ形式で/var/db/diagnosticsに保存し、各メッセージの固定の文字列は/var/db/uuidtextに保管します。ファイルを開くのではなく、コンソールやlogコマンドでログを読むのはそのためです。

CPUとディスクの使用量は、Macのほかの部分がどれだけログを記録しているかに比例します。静かなMacなら1パーセントにも満たない量です。logdがリストの上位にいるとき、logd自身が悪いことはまずありません。ほかのプロセスがいつもよりずっと速くメッセージを書き込んでいて、logdはそれを保存する仕事をしているのです。

logdのCPUやディスクの使用率が高い理由

アプリかバックグラウンドのプロセスが、ループでログを記録しています。サーバに接続できないネットワーククライアント、止まった同期、同じエラーを繰り返し報告するドライバなど、1秒に何度も失敗と再試行を繰り返すプロセスは、1分間に何十万ものメッセージを書き込むことがあります。logdはそのすべてを圧縮して保存するので、CPUと“書き込みバイト数”がそれに応じて上がります。

トラブルシューティングのために追加のログ記録をオンにしても、同じことが起きます。バグ報告のためにインストールしたログ記録プロファイルや、log configコマンドによる変更で、logdはふだんはメモリにだけ保持するメッセージまで保存するようになります。

対処法

logdではなく、ログを大量に書き込んでいるプロセスを見つけて、そちらに対処します。ターミナルでlog stats --last 5mを実行すると、過去5分間にログを記録した量の多い順にプロセスが並びます。一番上のアプリを終了するかアップデートし、止まったバックグラウンドのプロセスなら、Macを再起動します。

もう必要ないログ記録プロファイルをインストールしているなら、システム設定 → 一般 → デバイス管理で削除します。logdを終了しても効果はありません。macOSがすぐに起動し直し、ログを大量に書き込んでいるプロセスはそのまま続けます。

ログを大量に書き込んでいるプロセスを見つける方法

保存しているのはlogdなので、知るべきなのは誰が書き込んでいるかです。負荷はアクティビティモニタで、原因はターミナルでわかります。

  1. アクティビティモニタを開いて“CPU”タブをクリックし、“表示” → “すべてのプロセス”を選んで、検索フィールドにlogdと入力します。その“% CPU”を確認します。
  2. “ディスク”タブをクリックし、logdの“書き込みバイト数”を見守ります。数値が急速に増えるなら、大量のメッセージをディスクに保存しています。
  3. 検索フィールドを空にして、“CPU”タブを“% CPU”で並べ替えます。ログを大量に書き込んでいるプロセスは、それ自体も忙しいことが多く、毎回新しいPIDで再起動を繰り返していることもあります。
  4. ターミナルを開いてlog stats --last 5mを実行します。processesの下に、過去5分間に最も多くログを記録したプロセスが、イベント数とバイト数とともに表示されます。WindowServerなど一部のシステムプロセスはどのMacでも大量にログを記録するので、割合が異常に大きいプロセスや、本来アイドル状態のはずのプロセスを探します。
  5. そのプロセスが何を書いているかを読むには、Nameをプロセス名に置き換えてlog show --last 5m --predicate 'process == "Name"'を実行します。リアルタイムで見るには、同じ条件でlog streamを使い、止めるにはControl+Cを押します。

logdの普通の状態と気にすべき状態

普通: logdのCPU使用率は数パーセントを大きく下回り、Macの起動時、スリープ解除時、多くのアプリを一度に開いたときに短時間だけ上がります。

確認する価値あり: logdが何分もCPUのリストの上位に居続ける、またはほとんど何もしていないのに“書き込みバイト数”が急速に増え続ける。よくある原因は次のとおりです:

  • 失敗と再試行を短い間隔で繰り返すプロセス。たとえばサーバに接続できないネットワーククライアントや、止まってしまった同期です。
  • クラッシュしてはすぐに再起動されるヘルパー。毎回同じ起動と失敗をログに記録します。
  • log configで有効にされた、またはバグ報告のためにインストールしたログ記録プロファイルで有効にされた、デバッグや情報レベルのログ。
  • アプリ自体の設定で詳細なログ記録がオンになっている、またはすべてをログに記録するテスト版のアプリ。
  • ストリーミングしたままのコンソールや、ライブのログを常に読み取るツール。この負荷は主に、logdの相棒であるdiagnosticdに表れます。

コンソールでログを読む

“アプリケーション” → “ユーティリティ”にあるコンソールでは、同じログをウインドウで見られます。ツールバーの“開始”をクリックするとメッセージが届くそばから表示され、検索フィールドにプロセス名を入力すると、そのプロセスに関するメッセージだけが表示されます。読むのが追いつかない速さで1つのプロセスが画面を埋め尽くしたら、それがlogdを忙しくさせているものです。

終わったらストリーミングを止めましょう。コンソールがライブのログを表示している間は、diagnosticdやログを記録するプロセスが余分に働くので、すでに忙しいMacでは逆効果です。

よくある質問

Macのlogdとは?

統合ログを支えるmacOSのプロセスです。すべてのアプリとシステムプロセスがログメッセージをlogdに送り、logdはそれを圧縮して保存し、コンソールやlogコマンドで表示できるようにします。

logdのCPU使用率が高いのはなぜ?

ほとんどの場合、ほかのプロセスがループでログメッセージを書き込んでいて、logdがそれをすべて保存しなければならないからです。ターミナルでlog stats --last 5mを実行すると、どのプロセスが最も多くログを記録しているかがわかります。

logdが保存しているログは削除できる?

できますが、その理由はめったにありません。ログストアがサイズの上限に達するとmacOSが古いメッセージを自動的に削除するので、際限なく大きくなることはありません。どうしても消去する必要があるなら、sudo log erase --allで保存されたメッセージを削除できますが、自分やAppleサポートが問題を診断するのに必要な履歴も一緒に消えます。/var/db/diagnosticsや/var/db/uuidtextを手動で削除しないでください。

Macのdiagnosticdとは?

統合ログシステムのもう1つの構成要素です。logdはメッセージを保存し、diagnosticdはそれをコンソールやlog streamにリアルタイムで届けます。CPUを多く使うのは、そのどちらかがライブのログを表示している間だけです。

logdを終了しても大丈夫?

macOSがすぐに起動し直すので後に残る害はありませんが、効果もありません。ログを大量に書き込んでいたプロセスはそのまま動き続け、logdは再起動するとすぐにまた同じ作業を始めます。

関連項目

アクティビティモニタより優れたものをお探しなら、Mac向けアクティビティモニタの代替アプリのおすすめをご覧ください。用語集のすべての用語も見られます。