2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ProxmoxでKVMとLXCの比較をしてみた

Last updated at Posted at 2025-10-23

こんにちは
ALJの江口と申します。

皆さん、Proxmoxは使ってるでしょうか。
Proxmoxを使って、仮想環境を作るにはKVMLXCの二つの方式がありますが、どちらで作るかいつも迷います。どちらもOSを入れ、アプリを動かすという使い方では同じですが、仮想マシンとしての特徴が若干違います。今回の記事の前半では、KVMとLXCの特徴の違いについて記載してみました。後半では、ベンチマークを取り、性能に違いがあるか見てみました。

KVMとLXC

KVMはハイパーバイザー型仮想化、LXCはコンテナ型仮想化であることから、以下のような違いがあります。

項目 KVM LXC(コンテナ)
オーバーヘッド ゲストOSのエミュレーションがあり、大きい ホストOSのカーネルを共有するため、非常に小さい
起動時間 ゲストOSのブートが必要なため、遅い(数秒~数十秒) プロセスとして起動するため、速い(一瞬)
メモリ消費 ゲストOS分のメモリが必要で、大きい ホストOSのカーネルを共有し、必要な分だけ利用するため、小さい

上記だけを見るとLXCが優れているように見えますが、ProxmoxでLXCを使う上で、以下の注意点があります。

  1. OSの柔軟性の欠如
    LXCはホストOSと同じLinuxカーネルを共有するため、ゲストOSとしてLinuxディストリビューションしか選択できないため、実行できるOSはLinuxのみです。
    KVMはWindows、BSD、など多くのOSを実行できます。

  2. セキュリティと分離レベルの低さ
    ホストOSとのカーネル共有によるセキュリティリスクがあります。
    KVMはゲストOSがホストから独立しており、ゲストOSからホストOSへの干渉は非常に困難で、セキュリティの分離レベルが非常に高いです。
    LXCはホストOSのLinuxカーネルをコンテナ間で共有しています。もしコンテナ内で深刻な脆弱性が悪用された場合、ホストOSや他のコンテナに影響が及ぶリスクはKVMよりも高くなります。

  3. ライブマイグレーションの制限
    LXCはライブマイグレーションが標準でサポートされておらず、マイグレーションの際は一時的にコンテナを停止する必要があります(コールドマイグレーション)。
    KVM(VM)は実行中の仮想マシンを停止せずに、別のProxmoxホストへ移動(ライブマイグレーション)できます。高可用性(HA)の維持が必要な場合は重要な機能になります。

  4. スナップショット機能の依存性
    Proxmoxではスナップショット機能が、使用するストレージ(ファイルシステム)に強く依存します。
    LXCではZFSやLVM-Thinなどのボリューム管理機能(CoW: Copy-on-Write)を持つファイルシステムを使用しないと、スナップショットを取れない場合があります。
    KVM はqemuで作成すれば、qemuの仮想ディスクイメージ(例:$\texttt{.qcow2}$)でスナップショットを取ることができます。

  5. LXCではインストール・動作が難しいアプリケーションがある
    コンテナ・仮想化技術(Docker、KVMなど)
    Snapパッケージマネージャー(apt、Flatpakは可)
    非特権コンテナで許可されない機能(NAT機能、iptables、FUSEなど)
    GPUパススルーやUSBデバイスの高度なパススルー
    ホストのカーネルバージョンと異なる特定のカーネル機能を要求する場合

LXCは柔軟性においてKVMより劣る面がありますが、オーバーヘッドの少なさに魅力があり、使い分けをすることが大切だと思います。

KVMとLXCをUbuntu25.04で比較してみた

KVMとLXCの特徴の違いについては理解できても、実際はどうなのかというのは気になるところだと思います。Ubuntu25.04をKVMとLXCに入れてみて比較してみました。

ベースとして使ったProxmoxは以下のスペックのハードウェアです。

  • cpu: Core i5-1340P(12C16T)
  • メモリ:64G
  • Disk:NVMe SSD

KVMとLXCで同じOS(Ubuntu25.04)で起動することは可能です。しかし、パッケージまで同じにするのは難しく、逆に無理に合わせるより、普通にインストールした状態の方が実際の利用に近いと思うので、どちらも通常の方法でインストールし、 apt update 直後の状態でテストしました。作成した仮想マシンのスペックは以下の通りです。

項目 KVM LXC
/etc/os-release Ubuntu 25.04 Ubuntu 25.04
uname -a Linux kvm 6.14.0-33-generic Linux lxc 6.14.11-4-pve
core 4 4
memory 12GB 12GB
disk 64GB 64GB

インストール直後の状態の比較

メモリ使用量

メモリ使用量は顕著に差を感じられる部分だと思います。OSのみであればLXCはほとんど消費せず、KVMは1GB弱必用になります。
image.png

ディスク使用量

ファイルシステムもLXCは非常に少なく 0.5GBほどで、KVMは6.6GB消費します。
image.png

起動速度

起動速度もLXCが有利な点の一つです。カーネルのロードが必要ないため、必要なプロセスが起動すれば使用可能な状態になります。

起動速度は、それぞれ以下の条件を起動状態として時間を計測しました。

  • LXC
 #  Proxmoxからコンテナ内のコマンド実行が可能になれば起動状態
pct exec $CTID -- uptime 2>/dev/null; 
  • KVM
# ゲストエージェントのping応答があれば起動状態
qm agent $VMID ping 2>/dev/null; 
起動 Time
LXC 1.72秒
KVM 7.32秒

アプリケーションのベンチマーク

アプリケーションを動かして性能に差があるか確認してみます。

まず、LLM推論の推論を実行して結果を比較してみます。
llama.cppには、llama-bench という推論性能の測定のツールがあるので、こちらを実行してみます。

llama-benchの実行

llama-benchは以下のコマンドを実行して計測しました。
使用したモデルは、Mistral 7B Instruct v0.2 の量子化モデル (Q4_K_M)で、約4Gのサイズです。

# 計測に使用したコマンド
 ./llama.cpp/build/bin/llama-bench -m ./llama.cpp/models/local/mistral-7b-instruct-v0.2.Q4_K_M.gguf --threads 4
  • LXCの結果
model size params backend threads test t/s
llama 7B Q4_K - Medium 4.07 GiB 7.24 B CPU 4 pp512 17.73 ± 0.05
llama 7B Q4_K - Medium 4.07 GiB 7.24 B CPU 4 tg128 6.33 ± 0.00

build: 03792ad9 (6816)

  • KVMの結果
model size params backend threads test t/s
llama 7B Q4_K - Medium 4.07 GiB 7.24 B CPU 4 pp512 23.75 ± 0.91
llama 7B Q4_K - Medium 4.07 GiB 7.24 B CPU 4 tg128 8.50 ± 0.02

build: 03792ad9 (6816)

llama-benchの結果

特性 LXC KVM 考察
リソース効率 良い メモリ消費大 LXCは4GB程度で実行できたが、KVMは8GBほど実行に必要だった。
トークン生成速度 (tg128)
純粋な計算性能
6.33 t/s 8.50 t/s KVMが優位。
KVMのハードウェアの仮想化支援機能(Intel VT-x / AMD-V)が良い方向で影響してそう。
プロンプト処理速度 (pp512)
I/O + 初期処理
17.73 t/s 23.75 t/s KVMが優位。
virtioドライバによるI/OとCPUの連携がLXCの共有ファイルシステムアクセスを上回ったと思われる。

llama-benchの結果では、KVMの方がLXCより30%ほど性能がよいという結果になりました。

MySQLのベンチマーク

MySQLを稼働させてにI/O性能やデータベースの処理能力の比較をしてみます。ベンチマークはsysbenchを使用します。

  • テスト環境作成
# テーブル数、テーブルサイズなどを指定してデータを生成
sysbench oltp_read_write --mysql-user=sbtest --mysql-password=password \
--mysql-db=sbtest --tables=10 --table-size=1000000 \
prepare
  • ベンチマーク実行
# 60秒間ベンチマークを実行
sysbench oltp_read_write --mysql-user=sbtest --mysql-password=password \
--mysql-db=sbtest --tables=10 --table-size=1000000 \
--threads=4 --time=60 \
run

MySQLベンチマーク実行結果

  • LXC
SQL statistics:
    queries performed:
        read:                            176904
        write:                           50544
        other:                           25272
        total:                           252720
    transactions:                        12636  (210.58 per sec.)
    queries:                             252720 (4211.64 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          60.0041s
    total number of events:              12636

Latency (ms):
         min:                                    2.01
         avg:                                   18.99
         max:                                  815.26
         95th percentile:                       87.56
         sum:                               239982.84

Threads fairness:
    events (avg/stddev):           3159.0000/17.65
    execution time (avg/stddev):   59.9957/0.00
  • KVM
SQL statistics:
    queries performed:
        read:                            149002
        write:                           42572
        other:                           21286
        total:                           212860
    transactions:                        10643  (176.20 per sec.)
    queries:                             212860 (3523.90 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          60.4036s
    total number of events:              10643

Latency (ms):
         min:                                    3.25
         avg:                                   22.67
         max:                                 1318.22
         95th percentile:                       81.48
         sum:                               241251.52

Threads fairness:
    events (avg/stddev):           2660.7500/6.42
    execution time (avg/stddev):   60.3129/0.14

実行結果を表にして比較してみます。

指標 LXC (コンテナ) KVM (VM) LXC vs KVM 考察
トランザクション/秒 (TPS) 210.58 per sec. 176.20 per sec. LXCが約19.5%高速 総合性能。LXCのI/O優位性を示す。
95th パーセンタイル (Latency) 87.56 ms 81.48 ms KVMがわずかに低い 高負荷時の安定性はKVMが優位。
平均レイテンシ (Avg Latency) 18.99 ms 22.67 ms LXCが約16.3%低遅延 トランザクション処理の効率を示す。
総クエリ数 (Total Queries) 252,720 212,860 LXCが約18.7%多い 単位時間あたりの処理量。

MySQLのベンチマークテストでは、LXCの方が18%早い結果になりました。

KVMとLXCの比較の考察

アプリケーションの実行テストにおいては、以下のような結果になりました。
 llama-bench ではKVMが30%早い
 MySQLのベンチ ではLXCが18%早い

速度については、多少得意不得意があるかもしれませんが、それよりも、LXCとKVMでの利用上の違いを理解し、適材適所で利用するのが良いと思います。

LXCはリソース消費が少ないということが魅力的で、KVMは安定的に利用する場合に向いていると思います。

何かの参考になれば幸いです。

以上です。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?