概要
- Ampere One 192コアサーバー上でNervesを使った仮想IoTデバイス大量起動の実験報告
- KVMによるARM64仮想化で大幅なパフォーマンス・メモリ効率向上を確認
- little_loaderブートローダー導入でA/Bアップグレード等のNerves機能を実現
- メモリ・BEAM VM・Linuxカーネルのチューニングで5,100台以上の安定稼働を達成
- 実験知見をNerves公式ツール群へ還元予定
Ampere OneサーバーでのNerves仮想デバイス大量起動
- Ampere One 192コア・1TB RAMサーバー を使用した仮想IoTデバイスの大規模実験
- 目標は Nervesフレームワーク でできるだけ多くの仮想Linuxデバイスを同時起動
- 前回は500台、その後1,000台程度まで拡張
- KVM導入により大きな改善が見込まれたが、今回ついに実現
Nervesフレームワークの特徴
- BEAM VM をOSのように扱い、Linuxはカーネルやドライバ用途に限定
- 高水準言語 で組込みデバイス開発が可能
- erlinitによるinitプロセス、fwupによるA/Bパーティション・ファクトリーリセット等のアップデート機能
- ディスク暗号化、デルタ・ストリーミングアップデート なども標準搭載
little_loaderブートローダーの導入
- Frank Hunleth が開発したARM64用小型ブートローダー「little_loader」を採用
- uboot環境を参照し、Linuxカーネルをロードして起動
- NervesのA/Bアップグレード等の機能を有効化
- C言語 と ChatGPT の知見を活用し、最小限の実装で実現
- EL1での動作 のみ必要、EL2(VMの中でVMを動かす用途)は未対応
KVMによる高速化と省メモリ化
- qemu-system-aarch64 でARM64仮想マシンをエミュレート
- KVM(Kernel-based Virtual Machine) でハードウェア仮想化を有効化
- -cpu host 指定でホストCPUを直接利用、エミュレーションコスト削減
- 1コア・150MBメモリ で起動、GUI非表示(-nographic)でSSH経由操作
- 約500MBのメモリ削減、起動時間は数秒に短縮
ディスクイメージとNerves構成
- fwup で生成したrawディスクイメージ(special.img)をVMに提供
- イメージ内容
- uboot env形式データ
- Linuxカーネル(ファイルシステム外にRAW書き込み)
- MBRと4パーティション
- Root A(squashfs, 読取専用)
- Root B(squashfs, 読取専用)
- Application data(f2fs, 読書可)
- uboot envでA/Bアップグレードやカーネルロード先を指定
パフォーマンス・安定性の検証
- NervesCloud に3,389台同時接続でOOM Killer発動、3,000台は安定稼働
- 各VM構成:Bootloader、Linux、erlinit、BEAM/ERTS、Nerves基本機能、NervesHubLink
- メモリ使用量は 150〜250MB/VM 程度、さらなる最適化も可能
- OTAアップデート負荷テストも問題なく完了(同時1,000台制限)
メモリ・BEAM・Linuxチューニング
- BEAM VMのアロケータ変更 でメモリ削減、パフォーマンスとトレードオフ
- Erlangリリースモード をembedded→defaultに変更、起動高速化・メモリ減
- Linuxカーネルのzram導入、swappiness・dirty比率・vfs_cache_pressure 調整
- 5100台超の安定稼働 を実現、VM内RAMは110MB設定・実使用160MB程度
実験の意義・今後
- SaaSに対する 大規模・現実的な負荷テスト が可能に
- 今回の成果を Nerves公式ツール化 し、物理デバイス不要な開発・テスト環境整備へ
- ARM64 Linux/KVM環境やApple Silicon Macなら高速動作、x86でも利用可能
- qemu-systemの活用範囲拡大、実用的な組込みデバイス開発・検証環境構築
この実験は、Nervesやqemu、KVMを活用した 組込みLinux仮想化 の最前線事例として大きな意義を持ちます。今後もAmpereやNervesコミュニティの動向に注目が集まる見込みです。