Raspberry Pi Zero 2のネットワークデーモンに関して

2023-11-07

Raspberry Pi Zero 2 Wにおけるネットワークデーモンのシステム起動時間への影響について検証しました。

対象は、NetworkManager、systemd-networkd、networking.service (ifup/down)の三つの主要なネットワーク管理システムです。

テスト環境

2023年10月10日のRaspberry Pi OSリリースに伴い、デフォルトのネットワークデーモンがdhcpcd1からNetworkManager2に変更されました3。 デフォルトで、network-online.target4が、networking.serviceNetworkManager.serviceを依存関係として指定しています。

$ systemctl list-dependencies network-online.target 
network-online.target
🟢 ├─networking.service
🟢 └─NetworkManager-wait-online.service

測定結果は、systemd-analyzeコマンドで計測した10回の試行の平均値です。

NetworkManagerの概要

NetworkManagerはユーザーフレンドリーなインターフェースを提供し、複数のネットワークインターフェースを効率的に切り替えることを可能にするデーモンです。 NetworkManager.serviceを有効にすることで、OS起動時に自動的にNetworkManagerが起動し、ネットワーク接続を管理します。NetworkManager.serviceにはNetworkManager-wait-online.service5NetworkManager-dispatcher.serviceがalsoとして登録されています。

NetworkManager-wait-online.serviceは、特定のインターフェース(例: eth0)にキャリア(物理的接続)が存在するかを確認するサービスです。これにより、ネットワーク接続が必要な他のサービスやアプリケーションが適切なネットワーク接続完了後に起動することを保証します。

起動順序

NetworkManager.serviceに続き、NetworkManager-wait-online.serviceが起動し、適切なネットワーク接続が確立されるまで他のサービスの起動を待機します。以下はそのプロセスのイメージです。

NetworkManager.serviceとNetworkManager-wait-online.service

起動時間の計測 1

以下の表は、有線LANアダプターとネットワークケーブルの接続状態に応じた、各サービスの起動時間を示しています。

eth adapterNetwork CableNetworkManager.service [s]NetworkManager-wait-online.service [s]Kernel Time [s]Userspace Time [s]Total Time [s]
1.11821.64576.438712.059218.4982
××1.15081.57736.287711.589317.8774
×1.12536.63186.462717.111123.5741

LANアダプターがない場合、ドライバが不要なためカーネルの起動時間が短縮されます。一方で、アダプターがありながらネットワークケーブルが未接続の場合、NetworkManager-wait-online.serviceは約5秒間停止します。これはcarrier-wait-timeoutのデフォルト設定(5000ミリ秒)によるものです。NetworkManager.conf6で変更可能です。

/etc/network/interfacesとの干渉

/etc/NetworkManager/NetworkManager.confに以下の記述があるので、/etc/network/interfacesで定義されたインターフェースはNetworkManagerによって管理されないようです。

[ifupdown] 
managed=false

/etc/network/interfaces ファイルが基本的に空で、そして /etc/network/interfaces.d ディレクトリも空であるため、networking.service が起動時に実際に何も設定するインターフェースがない可能性があります。このため、networking.serviceは何のエラーも発生せずにすぐに終了します。

networking.service

networking.serviceは、伝統的なDebian系ネットワーク管理方法を提供するデーモンで、/etc/network/interfacesファイルに基づいたネットワーク設定をifupコマンドを使用し適用します。 このデーモンは、特に静的IP設定や特定のネットワーク設定スクリプトに依存する環境に適しています。 Debianの特定の修正により、/etc/default/networkingの設定が--read-environmentオプションがなくても読み込まれるようになっていますが、これは推奨されている方法ではなさそうです7

インターフェースの設定例

以下は、eth0インターフェースをDHCPを介して自動的に起動するための設定例です。

$ cat /etc/network/interfaces
source /etc/network/interfaces.d/*

auto eth0
iface eth0 inet dhcp

この設定により、ifupが実行されるとdhclient8プロセスが開始され、eth0インターフェースにIPアドレスが割り当てられます。

$ ps -f -p 549
UID          PID    PPID  C STIME TTY          TIME CMD
root         549       1  0 11:48 ?        00:00:00 dhclient -4 -v -i -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases -I -df /var/lib/dhcp/dhclient6.eth0.leases eth0

dhclientのデフォルトのタイムアウト設定は60秒ですが、これはdhclient.confでカスタマイズ可能です。

起動時間の計測 2

以下の表は、有線LANアダプターとネットワークケーブルの接続状態に応じた、networking.serviceの起動時間を示しています。

eth adapterNetwork Cablenetworking.service [s]Kernel Time [s]Userspace Time [s]Total Time [s]
10.72406.466019.600726.0674
××1.89006.284910.342116.6274
×62.68966.449271.564178.0136

アダプターが接続されていてもネットワークケーブルが接続されていない場合、dhclientがタイムアウトするまでの長い待機時間が発生します。 アダプターが存在しない場合、起動時間が著しく短縮されることが確認できます。 これは、ネットワーク構成の自動探索が行われないためだと思われます。

systemd-networkd

systemd-networkdは、システムの起動と密接に統合されたネットワーク設定を提供するデーモンです。これを利用するためには、systemd-networkd.serviceを起動し、通常このサービスを有効にするとsystemd-networkd-wait-online.serviceも同時に有効になります。 systemd-networkd-wait-online.serviceはネットワークが利用可能になるまで起動を待機するサービスで、デフォルトで120秒のタイムアウトが設定されています9

インターフェースの設定例

systemd-networkdを使用するには、以下のような設定ファイルを/etc/systemd/networkに配置します。 ここでName=eth0は対象のネットワークインターフェースを指定し、DHCP=yesでDHCPを介して自動的にIPアドレスを取得するよう指示します。

networkctlコマンドでネットワークインターフェースを確認し、以下のように有効にします。 設定ファイルは/usr/lib/systemd/networkディレクトリまたは/etc/systemd/networkディレクトリに置きます。/etc/systemd/networkディレクトリにある設定ファイルが優先されます。

# /etc/systemd/network/50-wired.network
[Match]
Name=eth0

[Network]
DHCP=yes

起動時間の計測 3

以下の表は、有線LANアダプターとネットワークケーブルの接続状態に応じた、systemd-networkd.servicesystemd-networkd-wait-online.serviceの起動時間を示しています。

eth adapterNetwork Cablesystemd-networkd.service [s]systemd-networkd-wait-online.service [s]Kernel Time [s]Userspace Time [s]Total Time [s]
2.20732.71456.447010.849517.2969
××2.0444120.39146.3001126.4118132.7122
×2.0385120.37826.4466126.4923132.9396

アダプターが接続されており、ネットワークケーブルが繋がっている場合には、systemd-networkd及びsystemd-networkd-wait-online.serviceの起動は迅速です。 しかし、ネットワークケーブルが接続されていない場合、systemd-networkd-wait-online.serviceは設定されたタイムアウト値まで待機し、その結果として起動時間が大幅に増加します。

まとめ

Raspberry Pi Zero 2 Wでの異なるネットワークデーモンのパフォーマンスと特徴について検証しました。 NetworkManager、networking.service、systemd-networkdの三つのデーモンを対象に、それぞれの起動時間の影響と使用状況に適した環境を評価しました。

個人的には、特にLANアダプターなしで、ネットワークケーブルが接続されていない状態での起動速度が速い方が良いので、networking.serviceがありです。 (ただ、そもそも、Bookwormになってカーネルの起動時間が長くなったので、とりあえずはBullseyeベースを使う気がします。最悪、自分でビルドしてどうにかしようと思います。)

参考文献