原文はこちら。
https://blogs.oracle.com/linuxkernel/faster-startup-times-with-oracle-linux-7
Steve Sistareは、Oracleのカーネル開発アーキテクトです。 このエントリでは、システムの起動を高速化するためのヒントとテクニックを紹介します。
10月にPasha Tatashinが、特に大規模なシステム向けに、カーネルの起動を大幅に高速化するという成果をブログで公開しました。
quietオプションを有効化するには…
タイムアウト設定を変更するには…
ブリッジを確認するには…
STPを無効にすると、起動時間は以下のようになりました。DHCPの遅延をなくしたため、NetworkManager-wait-onlineの時間がはるかに小さいことに着目してください。
全部まとめると、こんな感じです。
https://blogs.oracle.com/linuxkernel/faster-startup-times-with-oracle-linux-7
Steve Sistareは、Oracleのカーネル開発アーキテクトです。 このエントリでは、システムの起動を高速化するためのヒントとテクニックを紹介します。
10月にPasha Tatashinが、特に大規模なシステム向けに、カーネルの起動を大幅に高速化するという成果をブログで公開しました。
Accelerating Linux Boot Timeしかし、カーネルの起動は、作業の一部にすぎません。というのも、ユーザランドでサービスを開始する必要があるためです。とはいえ、起動時間は重要なものであり、設定に依存します。Oracle Linuxは、デフォルトで幅広い要件を満たすように構成されていますが、構成を調整すれば、起動時間を大幅に短縮できます。
https://blogs.oracle.com/linuxkernel/accelerating-linux-boot-time
Silence the console
設定できる単一の改善ポイントは、カーネルのコマンドラインを "quiet"に設定することです。これにより、カーネルのメッセージがコンソールに表示されなくなります。これらのメッセージは、コンソールが低ボーレート設定のシリアルインターフェイス経由で接続されているときに、起動中に長時間かかることがあります。Oracle Linux 7を実行するx86システムではデフォルトのILOMシリアルコンソール速度が9600ボーなので、quietオプションを有効にすると、systemd-analyzeによって報告されたkernel + initrd + userspace時間が62.259秒から21.425秒に短縮されました。代わりにシリアルレートを115200ボーに増やすことができますが、それは面倒な作業を伴います。ILOM、BIOS、GRUB、およびカーネルのコマンドライン引数でシリアルレートを変更する必要があります。その設定をしたとしても、115200ボーよりもquietのほうが数秒速いです。また、カーネルメッセージは失われません。カーネルが正常に起動した場合には、dmesgとjournalコマンドで閲覧できます!失敗時にカーネルの出力を見る必要があるカーネル開発時は、quietを使用しないでください。最後に、(エミュレートされたコンソールデバイスとは対照的に)準仮想化コンソールデバイスを使用するVMをブートする場合、シリアルボーレートによって制限されないため、quietではほとんど改善されません。quietオプションを有効化するには…
- /etc/default/grubを編集
- GRUB_CMDLINE_LINUX 文字列に"quiet"を追加
- "grub2-mkconfig -o /boot/grub2/grub.cfg"を実行
Use up-to-date packages
可能な限り最新のOracle Linuxアップデートを使用して、最新のパッケージと最適化を入手してください。たとえば、古いバージョンのNetworkManagerパッケージには、余計な「キャリア待機」タイムアウトが有効になっていて、起動を5秒遅らせるバグがありました。これはOL7.4で修正されました。同様に、グラフィカルコンソールを持たないKVMゲストで、kbdパッケージがPUT_FONT ioctlが成功するために5秒間待機していたため、待ち時間は無駄でした。さらに悪いことに、これはinitdブートフェーズ中、userspaceフェーズ中にそれぞれ1回ずつ発生し、結果として10秒の遅延が発生しました。これもOL7.4で修正されています。Tune grub
grubの遅延を減らすか、またはなくしましょう。デフォルトでは、grubは5秒間休止するので、別のカーネルを選択したり、カーネルパラメータを変更することができますが、これは設定可能です。緊急時にこの補助が必要な場合は1に設定します。 KVMで実行している場合は0に設定します。カーネルのブートに失敗したときに、ゲストイメージを手動でマウントしてgrubファイルを直接編集するなど、パラメータを変更する他の方法があります。タイムアウト設定を変更するには…
- /etc/default/grubを編集
- GRUB_TIMEOUT=5 を GRUB_TIMEOUT=1 (または 0)に変更
- "grub2-mkconfig -o /boot/grub2/grub.cfg"を実行
Check autofs
autofsが正しく設定されていることを確認しましょう。/etc/nsswitch.confのautomountエントリが誤って設定されていると、このパッケージの最近の変更によりブート時に10秒の遅延が発生し、"automount[969]: problem reading master map, maximum wait exceeded"(automount [969]:マスターマップの読み込みに問題があり、最大待機時間を超過しました)というメッセージがジャーナルに記録されます。詳細については以下のURLを参照してください。[ANNOUNCE] autofs 5.1.3 release上記のTipsに従った後、私たちがどうやっているかを見てみましょう。systemd-analyzeコマンドを使用して、全体の起動時間と最上位のサービスが使用した時間を確認します。ここでは、Intel Xeon Platinum CPU上のOL7.4 KVMゲストを起動します。
https://lkml.org/lkml/2017/5/26/64
<... boot and login to the console ...>
# systemd-analyze
Startup finished in 697ms (kernel) + 879ms (initrd) + 3.877s (userspace) = 5.454s# systemd-analyze blame
1.799s kdump.service
1.166s NetworkManager-wait-online.service
396ms postfix.service
321ms network.service
247ms systemd-udev-settle.service
244ms tuned.service
151ms dev-mapper-ol\x2droot.device
148ms lvm2-monitor.service
119ms lvm2-pvscan@251:2.service
113ms plymouth-quit.service
112ms plymouth-quit-wait.service
104ms systemd-vconsole-setup.service
...
Tune the bridge
次に、ホストとゲスト間はブリッジインターフェイスでKVMを使用しており、ネットワークトポロジにループがないことがわかっている場合は、ブリッジ上のSTP(Spanning Tree Protocol)を無効にします。これにより、2秒以上のゲストブート時間が節約されます。STPが有効の場合、ブリッジは、転送遅延が切れるまで、新しく検出されたアドレスから受信したすべてのパケットをドロップします。これは、ループが存在するときにパケットのフラッディングを回避するためです。したがって、ゲストのDHCP要求パケットは廃棄され、dhclientタイムアウトと再試行につながります。ブリッジを確認するには…
転送遅延を確認するには…# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.525400fe7ca3 yes virbr0-nic
STPを無効化するには…# brctl showstp virbr0 | grep forward
forward delay 2.00 bridge forward delay 2.00
libvirtをお使いの場合、デフォルトの設定でSTPを無効化し、変更を永続化するためにホストを再起動します。# brctl stp virbr0 off
(一見すると、delay = '0'で問題が解決すると思うかもしれませんが、カーネルは最小値2秒を強制します)。# virsh net-edit default
"<bridge name='virbr0' stp='on' delay='0'/>を見つけて、onをoffに変更
STPを無効にすると、起動時間は以下のようになりました。DHCPの遅延をなくしたため、NetworkManager-wait-onlineの時間がはるかに小さいことに着目してください。
$ systemd-analyze
Startup finished in 678ms (kernel) + 903ms (initrd) + 2.746s (userspace) = 4.328s
$ systemd-analyze blame
1.700s kdump.service
397ms postfix.service
294ms network.service
252ms systemd-udev-settle.service
206ms tuned.service
203ms dev-mapper-ol\x2droot.device
168ms NetworkManager-wait-online.service
157ms plymouth-quit-wait.service
157ms plymouth-quit.service
135ms lvm2-monitor.service
95ms systemd-vconsole-setup.service
...
Disable optional services
"systemctl disable <name.service>"を使用して、不要なサービスを無効にします。 上記のように、"systemd-analyze blame"コマンドを使用して候補を表示しましょう。たとえば、パニック後にカーネルクラッシュダンプを取得する必要がない場合や、問題が発生して初めて有効化したい場合は、kdump.serviceを無効にすると、起動時間が約2秒短縮されます。メールサーバーを実行していない場合は、postfix.serviceを無効にします。tuned.serviceは目立つチューニングをしていないと確信しているなら、無効にしましょう。全部まとめると、こんな感じです。
$ systemctl disable kdump.service
$ systemctl disable postfix.service
$ systemctl disable tuned.service
<... 再起動してコンソールにログイン ...>
$ systemd-analyze
Startup finished in 681ms (kernel) + 863ms (initrd) + 1.136s (userspace) = 2.681s
$ systemd-analyze blame
299ms network.service
273ms systemd-udev-settle.service
178ms dev-mapper-ol\x2droot.device
160ms NetworkManager-wait-online.service
149ms lvm2-monitor.service
148ms plymouth-quit-wait.service
136ms plymouth-quit.service
94ms systemd-vconsole-setup.service
...