Systemdは起動時に予期せず長時間サービスを有効にします。

Systemdは起動時に予期せず長時間サービスを有効にします。

systemd-analyze plotシステム起動時にサービスを実行するのにかかる時間を分析するために使用します。update_sysfs_cpu_permissions.service驚くほど長い時間(755ms)がかかり、ほとんどの時間をアクティブではなくアクティブ状態で送信する非常に簡単なワンショットサービスがあります。

サービスファイルの内容:

# /etc/systemd/system/update_sysfs_cpu_permissions.service
[Unit]
Description=Give the group `cpu_tuners` permissions to write to the files /sys/.../cpufreq/policy*/* if the `root` user can write to them

[Service]
Type=oneshot
User=root
# For every file of mode rw-r--r-- change mode to rw-rw-r-- and owners to root:cpu_tuners (instead of root:root)
# mindepth and maxdepth are to identify we only want to change files inside policy* (though, it's not a very strong constraint and could be replaced with something stricter)
ExecStart=/usr/bin/find /sys/devices/system/cpu/cpufreq/ -mindepth 2 -maxdepth 2 -type f -perm 644 -exec /bin/sh -c 'chown root:cpu_tuners "$1"; chmod 664 "$1"' _ {} \;

[Install]
WantedBy=multi-user.target

サービスを手動で実行するには時間がかかりません。

$ time sudo systemctl start update_sysfs_cpu_permissions.service

real    0m0.155s
user    0m0.019s
sys 0m0.010s
$

フルプロット:https://i.stack.imgur.com/EPh93.jpg

サービスがアクティブになるということはどういう意味ですか?起動時に実行するのに時間がかかるのはなぜですか?

答え1

起動時に実行するのに時間がかかるのはなぜですか?

ブートプロセス(bootchartなど)をより詳細に追跡しないと話すことはできませんが、私の考えでは起動中にCPUを離して他のサービスと競いますか?ディスク入出力、/bin/find、、実行/bin/sh可能ファイルをディスクからメモリにロードする必要があるためです。/bin/chmod/bin/chown

また、ほとんどの時間は、アクティブ状態ではなくアクティブ状態で費やされます。

これは意図的に設計されています。 Type=oneshot サービスにはいいえデフォルトは「アクティブ」状態です。 Type = oneshotサービスの完全な目的は、すべてのExecStart =が実行されたときに「アクティブ」になり、ExecStart =コマンドが完了するまで「開始」操作が完了しないようにすることです。

サービスがアクティブになるということはどういう意味ですか?

「有効化」とは、装置が呼び出されたが、依然として依存関係および順序付けの目的で「準備」されていないことを意味する。たとえば、データベースサーバーデーモンを使用している場合、起動、ソケット設定、ログ再生などに少し時間がかかることがあります。この間、プロセスは実行中ですが、まだクライアント接続を許可していません。つまり、他のサービスでそれを使用しようとすることを意味します。失敗するでしょう。

したがって、起動ジョブが実行されると待つ依存関係を開始し続ける前に、サービスが「アクティブ化」状態から離れていることを確認してください(存在する場合)。たとえば、httpd.serviceはキューで待機し、php-fpm.serviceはまだ「アクティブ」状態です。

  • Type = forkingの場合、「アクティブ化」はsystemdがプロセス「デーモン」を見るまで続きます(従来の分岐または二重分岐方式 - より具体的には初期の親プロセスまで続きます)。やめる、その子を引き継ぐようにしてください)。

  • Type = notifyの場合、プロセスが指定されたソケットまたはパイプを介してsystemdに「READY = 1」メッセージを送信するまで、「アクティブ化」が続行されます。

  • Type=simpleの場合、デフォルトでは「アクティブ化」状態はありません(人々は「Type = simpleがsystemdを使用する実際の方法です」と文句を言うとこれを忘れる傾向があります)。

  • Type = oneshotの場合は、あなたの場合と同じように「アクティブ化」してください。サービスがタスクを完了するまで続きます。つまり、ExecStart =のすべてのコマンドが完了するまでです。

(ExecStartPost = Type = simpleの場合でも「アクティブ」状態を拡張でき、一部の操作に使用できます。〜しなければならないサービスの開始後、実際に使用する準備が整う前に完了します。 )

したがって、この例では「アクティブ化」を維持することは、他のブートサービスがデバイスを一覧表示した場合、After=/ bin / findが完了し、権限が実際に更新されるまで正しく遅延されることを意味します。

User=root を削除してみてください。正しく文書化されていない副作用がある可能性があります。

ユーザー設定=いいえPAMName= は UID/GID のみを変更します。

関連情報