世界を動かす技術を、日本語で。

Ampere One 192コアでの5000エルランのブート

概要

  • 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コミュニティの動向に注目が集まる見込みです。

Hackerたちの意見

「Underjordはアーティザナルなコンサルタントです…」もし彼らが手でErlangスレッドを織らないなら、ちょっと残念だな。

美しい書道で書かれたすべてのプロセスメッセージ。

シングルオリジンのファーム・トゥ・バイトコードプロセス、私たちの特徴的な素朴なガーベジコレクションと伝統的なフォールトトレランス付き…

これって5000ドルくらいのマシンだね(https://www.jeffgeerling.com/blog/2024/ampereone-cores-are-n...)。クラウドプロバイダーかテレコムエッジマシンとして設計されてるみたい(だからErlangコンサルタントなんだね)。でも、もし1ドルのキャペックスでホスティングされたErlang VMを探してるなら、彼らは何か面白いことをやってるかも。コアは本当に壊れたムーアの法則から抜け出す唯一の方法だし、これは重要な方向への本物のステップに見える。LLMよりも小さなコアがもっと必要だね。

マルチコアのアプローチは好きだけど、まだ実現してるのを見たことがないな — 少なくとも一般的なマシンでは。各コアのサブセットをNUMAノードとして露出させて、全コアでメモリをフラットにしようとしないマシンが、もっと実用的なアプローチになると思う。そうじゃないと、インターコネクトがすぐにスケーリングの限界になっちゃうからね(すべてのコアがすべてのメモリに高速でアクセスできるように)。Erlang、少なくともプログラミングモデルは、各プロセスがローカルヒープを持つので、これにうまく適してる。もしそれがCPUの一部に常駐できれば、リーズナブルな価格のマルチコアアーキテクチャに向いてるかも。

Azulは10年代にJavaのためにこんなことをやってたね。でも、これはすべての卵を一つのバスケットに入れちゃったときに必要な、最高のバスケットを買うための製品みたい。初期のバッテリー付きストレージみたいなものだね。ミッションクリティカルなデータベースでのWAL書き込みにしか使えなかったけど、一台のコストが車より高かったからね。

このサーバーそのものではないけど、Hetznerから80コアのAmpereが月約200ドルで手に入るよ。(ホスティング、エグレス、電力なども含まれてる)。https://www.hetzner.com/dedicated-rootserver/rx170/

この記事は5000のErlangノード(BEAM VM)についてで、プロセスのことじゃないよ。一つのBEAMインスタンスは、数百万の軽量プロセスを効率的に処理できるから、密度の観点から見てもさらにすごいよね。

つまり、「マルチプロセッシング」みたいな感じ?

「5000 Erlangs」 - ああ、彼らはErlangインタープリターの5000インスタンスのことを言ってたんだね。測定単位としてのErlangではないよ。[1] 1時間の音声通話が1 Erlangだよ。[1] https://en.wikipedia.org/wiki/Erlang_(unit)

ありがと、面白い話だね!

5000のアニマットって何を測るの?1アニマットはメトリックな細かいことに換算されるの?リストに追加されたら成功ってことだよね。

へぇ、面白い!Erlangって名前は「エリクソンの言語」って意味だと思ってた。エリクソンのために作られたプログラミング言語だからね。それ以上の意味があるなんて知らなかった!

すごいな、マジで。

5000のインスタンスが重負荷の時にどうなるか見てみたいな。ただその数を持ってるだけじゃ、彼らが何をできるか分からないとあんまりワクワクしないよね。