Linuxの起動が遅い? systemd-analyzeで原因を特定し、高速化する方法

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

課題:なぜサーバーの起動が遅いのか?

rebootコマンドを入力してコーヒーを淹れ終わっても、まだサーバーが立ち上がっていない…そんな経験はありませんか?初心者にとって、この待ち時間はどこでシステムが「詰まっている」のか分からず不安なものです。私が管理しているUbuntu 22.04のVPSでは、当初の起動時間に約120秒かかっていました。しかし、systemd-analyzeで調査した結果、わずか数ステップで25秒まで短縮することができました。

現在のLinux OSはsystemdを使用してプロセスを並列に起動します。この仕組みは高速ですが、サービスの依存関係(dependencies)による競合が発生しやすく、それが厄介なボトルネックとなることがあります。この記事では、起動プロセスの各層を紐解き、何が時間を浪費しているのかを正確に突き止める方法を解説します。

強力なツール:systemd-analyzeを理解する

systemd-analyzeは、標準で用意されている非常に便利なツールです。カーネルの実行開始から、ユーザー空間の全サービスが準備完了するまでのデータを収集します。

直感に頼るのではなく、このツールが提供するミリ秒単位の正確なデータに基づき、以下の4つの主要コマンドを活用しましょう:

  • time: 起動時間の概要を表示。
  • blame: 実行時間の長い順にサービスをランキング表示。
  • critical-chain: 起動時間を直接遅らせているサービスの連鎖を特定.
  • plot: 起動プロセス全体を視覚化するSVGチャートを出力。

実践:ボトルネックの特定と解消

ステップ1:総起動時間を確認する

まずは、比較の基準(ベンチマーク)となる全体像を把握しましょう。ターミナルを開いて以下のコマンドを実行します:

systemd-analyze

出力結果は通常、以下のようになります:

Startup finished in 3.452s (kernel) + 12.120s (userspace) = 15.572s 
graphical.target reached after 12.110s in userspace

ここで注目すべきはuserspace(ユーザー空間)の部分です。kernel(カーネル)の時間はハードウェアに大きく依存しますが、userspaceソフトウェアの設定次第で十分に最適化可能です。

ステップ2:時間を浪費しているサービスを特定する

どのプロセスが最もリソースを占有しているかを知るには、blameコマンドを使用します:

systemd-analyze blame

私のサーバーの実例では、network-manager-wait-online.serviceが10秒近くも無駄に費やしていました。また、plymouth-quit-wait.serviceも頻繁に上位に現れるサービスの一つです。

注意: 上位にあるサービスをすぐに削除しないでください。サービスAが遅いのは、サービスBのレスポンスを待っているからかもしれません。ここでさらに深い分析が必要になります。

ステップ3:クリティカルチェーン(重要サービス連鎖)を分析する

critical-chainコマンドを使用すると、プロセス間の因果関係を把握できます:

systemd-analyze critical-chain

結果はツリー形式で表示されます。@記号の後の数値は、そのサービスが起動を開始した時間です。このチェーン内のどこかが遅れると、ドミノ倒しのように起動プロセス全体が後ろにずれ込みます。

ステップ4:チャートで視覚化する

ターミナルのテキストベースでは分かりにくい場合、SVG形式の画像ファイルに出力してブラウザで確認しましょう:

systemd-analyze plot > boot_analysis.svg

このファイルをChromeやFirefoxで開くと、長さの異なる横棒グラフが表示されます。棒が長いほど、その部分は重点的な「ケア」が必要であることを意味します。

ステップ5:実践的な最適化テクニック

個人の経験に基づき、私は主に以下の3つの対策を適用しています:

  1. 不要なサービスを思い切って停止する: サーバーにBluetoothやモデムは必要ですか?必要なければ、ModemManager.servicebluetooth.serviceを即座に無効化しましょう。
    sudo systemctl disable bluetooth.service
  2. Network Managerの「落とし穴」に対処する: network-manager-wait-onlineは、ネットワーク接続が完了するまで起動プロセスを待機させます。静的IPを使用していて、起動直後のネットワーク接続にこだわらない場合は、maskコマンドを使用します:
    sudo systemctl mask network-manager-wait-online.service
  3. LVM/RAIDのクリーンアップ: 多くのディストリビューションでは、起動時にLVMディスクをスキャンします。標準的なext4パーティションのみを使用している場合、これらのサービスを停止することで貴重な2〜3秒を節約できます。

最適化の結果

調整後、再度確認コマンドを実行したところ、驚くべき結果が得られました:

Startup finished in 3.102s (kernel) + 4.220s (userspace) = 7.322s

ユーザー空間の時間が12秒から4秒強へと短縮され、約3倍高速化されました。リモートでのメンテナンスや再起動時のレスポンスも劇的に向上しています。

起動の最適化は、単に速度を上げるためだけでなく、OSがどのように動作しているかを深く理解するための素晴らしい方法です。systemdでの試行錯誤を恐れないでください。ただし、サービスをdisableにする前にその機能を十分に確認し、サーバーへの接続が失われるなどのトラブルを防ぐようにしましょう!

Share: