Proxmox VEで組む!Intel/AMD混在環境でのHAクラスタ動作検証

おうちサーバでお安くHAクラスタが組める!!というわけで、わが家ではProxmox VEを導入しています。

このHAクラスタIntel/AMDを混在させたらどうなるのよ?という情報が少なかったので検証してみました。

結論としては、Intel/AMD混在でも問題なく移行できました。

実際の挙動は組み合わせ次第と思いますが、一例として公開しておきます。

目次

  1. Intel/AMD混在HA構成の構築
  2. IntelAMD コールドマイグレーション
  3. AMDAMD ライブマイグレーション
  4. AMDIntel ライブマイグレーション

環境

  • Proxmoxバージョン: 7.2-3
  • ストレージ: CephFS 16.2.7 (Pacific)

  • ノード情報

    • PVE#1: 8vCPUs/32GB RAM on ESXi7 (Ryzen 2700 8C16T)
    • PVE#2: 6vCPUs/32GB RAM on ESXi7 (Ryzen 5600G 6C12T)
    • PVE#3: 4CPU/16GB RAM (Intel Celeron J4105)

    以前Twitterで上げたけどこんな感じ

  • 検証するOS
    ① LXC: CentOS8 Stream
    1vCPU/2GB RAM/SSD 8GB

    Resources:

    Options:

    VM: Windows10 x64 21H2
    3vCPUs/6GB RAM/SSD 64GB

    Resources:

    Options:

  • 検証内容:

    1. ゲストOS側で1秒ごとにechoするスクリプトを実行
    2. 外部PCから1秒ごとにping実行

検証結果

1. Intel/AMD混在HA構成の構築

→単一CPUと同じ手順で構築できます。

※ うまくログインできないときはcli経由でAuth更新すれば治りました。(よく分かってない)

pvecm updatecerts

2. IntelAMD コールドマイグレーション

シャットダウン後に移行してから再度起動するケース

2-① LXC(CentOS)のケース

→ 問題なく起動

移行前:

移行後:

2-② VM(Windows10)のケース

→ 問題なく起動 (CPUクロックが変わらない?)

移行前:

移行後:

3. AMDAMDライブマイグレーション

同一メーカ間で起動したままマイグレーションをかけてみます。

3-① LXC(CentOS)のケース

→ シャットダウン後、再度起動する

ダウンタイムは10秒程度

3-② VM(Windows10)のケース

→ 起動したままホストが切り替わる

1秒間隔のpingでは影響なく切り替わりました。

4. AMDIntelライブマイグレーション

異種メーカー間で起動したままマイグレーションを行います。

4-① LXC(CentOS)のケース

→ シャットダウン後、再度起動する

③同様、10秒程度で移行しています。

4-② VM(Windows10)のケース

→ 起動したままホストが切り替わる

こちらも多少ラグはありますが、システムとしては停止せずに移行できました。

まとめ

  • LXCの場合は一度シャットダウンされるが、比較的すぐ復活する

  • VMの場合は稼働したまま移行できる
    ※ MachineやBIOS等の設定に依存する可能性あり

「数時間後に落ちる」なんて噂も見かけたので断言はできませんが、ほぼ意識せずにライブマイグレーションできそうです。スゴイ。

[おまけ] HA設定

検証結果から、おうちHAはこの方針で暫定運用しています。運用次第で更新するかも

  • 1ノードのメンテナンス時にも継続稼働させるため、Intel/AMD混在環境でHAを有効にする
  • ダウンタイムを軽減するため、できるだけAMD間でのライブマイグレーションを行う
  • 高性能ノード(#1,#2)を優先稼働し、省電力ノード(#3)はできるだけ選定しない

HA Group設定:

  • PVE#1(AMD): Priority=20

  • PVE#2(AMD): Priority=20

  • PVE#3(Intel): Priority=1

※ Priorityが高いと優先してマイグレーション先に選定される…はず

P.S.

このような実験はテスト環境でやりましょう。
運用環境のCephストレージを吹っ飛ばして1カ月分のデータをロストしました。

UnityでセットアップしたアバターをNeosVRに持ち込む

※ 2022/12/3 補足

情報が少ない時期に試行錯誤で試していた頃の手順です。
他のインポート手順の方が確実なので、まずは他の方のセットアップ手順を試すのをオススメします。


Unityで着せ替えしたアバターをNeosVRに入れたい!でもうまく動かない!

…となるケースが何回かあったので、私の環境で安定してインポートできている手順を公開しておきます。(Wiki通りだけど)

NeosVR内でのハマりポイントが激減するので、個人的にはこれがオススメです。

必要なもの

手順の概要

  1. Unityでアバターを読み込む

  2. アバターをUnityからVRM形式で出力する
    (※そのままFBX出力すると壊れやすいので、VRMを経由する)

  3. 出力したVRMBlenderで読み込む

  4. Blenderで読み込んだVRMをglTF形式で出力する

  5. アバターをNeosVRにインポートする

作業手順

1. Unityでアバターを読み込む

詳しくないので…軽く説明

1-1. Unityで3Dプロジェクトを新規作成

1-2. アバターのunitypackageをD&Dで追加する

1-3. Sceneにprefab(アバターデータ)をD&Dして配置する

※ マテリアルエラーになっている場合は何かシェーダを当てておきましょう。
NeosVRはマテリアルの制限があるので、StandardでOK

衣装切り替えはNeosVR内で設定できるので、すべてONにしてインポートしておくと着せ替えが楽です。

2. UnityからVRM形式で出力する

2-1. unitypackageを公式サイトからDLする
一番上のでOK

2-2. ダウンロードしたUniVRMのunitypackageをD&Dで追加する

2-3. アバターVRMでエクスポート
出力するアバターを選択した状態で「VRM0」→「Export to VRM 0.x」

今回はTitle/Version/Authorを適当に入力してExport

3. 出力したVRMBlenderで読み込む

3-1. VRM importerをインストール (初回のみ)
リンクの手順通りにインポートしましょう
設定できればチェックONになるはず

3-2. VRMをインポート

デフォルトの箱は削除しておきます。
ファイル→インポート→「VRM (.vrm)」 からインポートする

4. Blenderで読み込んだVRMをglTF形式で出力する

ファイル→エクスポート→ 「glTF 2.0 (.glb/.gltf)」からエクスポートする
ボーンが変な方向向いてるとか色が出ていないのは一旦無視してOKです。

アバターのglbファイルが出力できれば完成!!

5. (おまけ) NeosVRにインポートする

デスクトップモードならエクスプローラーでglbファイルをCtrl+C → NeosVRウインドウ内でCtrl+V!かんたん!!
VRモードで入る場合は、glbファイルを分かりやすいフォルダに置いておきましょう。

数分待てば、マテリアルも反映されるはずです。

残りはWikiの通りに設定できるはず。
分からなければ、チュートリアルワールドで聞いてみましょう。

NeosVRのノウハウは内部のコミュニティ内に留まってるケースが多い…

参考

アバター作成 - NeosVR日本語Wiki

Raspberry Pi PicoでL3GD20Hを使う(MicroPython/I2C)

秋月で買ったジャイロセンサを使ってみました。
Raspberry Pi Picoで使った事例が見つからなかったのでメモ。

[買ったもの]

[配線]
Raspberry Pi Pico - L3GD20H
1番 - 3番(SDA)
2番 - 2番(SCL)
36番 - 1番(+V)
38番 - 8番(GND)

L3GD20H - L3GD20H
1番(+V) - 5番(CS)
 → I2Cモードに切り替えるため
8番(GND) - 4番(SA0)
 → I2Cのアドレスを0x6Aに指定するため

[構成]
※ 一応SDA/SCLを10kΩでプルアップしています。なくても問題はなさそう?

[コード]

from machine import I2C, Pin
import utime

i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=100000)

i2c.writeto_mem(0x6A, 0x20, bytearray([0x0F]))

while True:
    x = (i2c.readfrom_mem(0x6A, 0x29, 1)[0] << 8) | i2c.readfrom_mem(0x6A, 0x28, 1)[0]
    y = (i2c.readfrom_mem(0x6A, 0x2B, 1)[0] << 8) | i2c.readfrom_mem(0x6A, 0x2A, 1)[0]
    z = (i2c.readfrom_mem(0x6A, 0x2D, 1)[0] << 8) | i2c.readfrom_mem(0x6A, 0x2C, 1)[0]

    if x >= 32768:
        x -= 65536
    if y >= 32768:
        y -= 65536
    if z >= 32768:
        z -= 65536

    print('%(x)5d, %(y)5d, %(z)5d' %{'x': x,'y': y,'z': z})
    utime.sleep(0.1)

int → unsigned shortに変換する方法が見つからず苦肉の策でif文処理…