Ubuntu 18.04 LTS-ループバックZFSを使用したLXD Ubuntuの起動(約400MB)
# lxc launch ubuntu:16.04 test -s ianzfspool
(同じianzfspoolを使用するアイドル状態のマルチGBコンテナーがもう1つあります。)プールに多くのスペースがあります。
# zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
ianzfspool 99.5G 13.7G 85.8G - 2% 13% 1.00x ONLINE -
lxc
を使用してループし、アイドルテストコンテナ(400MB)のスナップショットを作成すると、最初のスナップショットが数秒で作成されます。 lxc
スナップショットの数が増えると(現在は1,200を超えています)、作成に数分かかります。現在の日付を数秒ごとに/ tmpのファイルに入れるテストコンテナーで実行しているスクリプトがあるため、スナップショットごとにコンテナーで変更されるファイルが1つあります。それ以外の場合、コンテナはほとんどアイドル状態です。最初のlxc
スナップショットは約25Kを使用しました。現在のスナップショット(1,200スナップショット後)は66Kを使用しています。 (2,470個のスナップショットの後、それぞれ115Kを使用し、7,500個のスナップショットの後、それぞれ293Kを使用します。)
#!/bin/sh -u
# Create snapshots of the Ubuntu test container.
count=0
while : ; do
count=$(( count + 1 ))
cp=$( printf "%05d" $count )
lxc snapshot test snap$cp
echo "$0: done $cp" >/tmp/icount.txt
done
編集1:私は現在約2,470個のlxc
スナップショットを作成しており、各新しいスナップショットは作成に約4分かかり、約115Kを使用しています。 zfs snapshot
を使用する代わりに、lxc snapshot
を呼び出してコンテナのスナップショットを直接取得すると、2,470個の既存のスナップショットであっても、スナップショットの所要時間は1秒未満です。直接zfs
スナップショットは、(115Kではなく)20Kのみを使用します。 zfs list
の実行には1〜2秒しかかかりません。 lxc list
の代わりにzfs list
を実行すると、現在、2,470の既存のスナップショットで4分以上かかります。そのため、スナップショットの作成とリストのスローダウンはZFSではなく、LXDで行われます。実際、lxd
プロセス自体は4,253 CPU秒を使用し、このスナップショット作成実験でこれまでのところ3.9GのVSIZEを持っています。
lxc
スナップショット作成スクリプトを一時停止し、直接zfs
スナップショットを作成するループ用のスクリプトを作成し、3日間でlxc
よりも多くのスナップショットを作成しました。約3,000の直接ZFSスナップショットの後にそれを一時停止しました。
lxc list
を再実行しましたが、もちろん2,471 lxc
スナップショットしか表示されませんが、4分ではなく40秒で実行されました。別のlxc snapshot
を作成したところ、4分ではなく49秒しかかかりませんでした。何が変わった?直接zfs
スナップショットの束を作成すると、何らかの形でlxc
スナップショットの作成と一覧表示が高速化されましたか? lxc
スナップショットは、直接zfs
スナップショットよりも作成に時間がかかりますが、lxc
スナップショットの作成により改善されました(4分から49秒)。
ZFSスナップショットの作成を、10,000個の直接ZFSスナップショットが作成されるまで進めました。 (つまり、このテストコンテナの2,472 lxc
スナップショットと10,000のダイレクトzfs
スナップショットがあります。)lxc list
は40秒ではなく90秒かかり、lxc snapshot
は100秒かかります秒(49ではなく)。 ZFSを直接使用することは、LXDを使用するよりも2桁高速です。
編集2:再起動後、LXDスナップショットの作成が高速化されました。 lxc snapshot
ループを使用して7,470個のスナップショットを作成していますが、各スナップショットの作成には約30秒かかり、サイズは293Kです。 lxc list
は45秒かかります。 zfs list
は105秒かかり、17,507行の出力(10,000の直接ZFSスナップショットを含む)を生成します。 zfs snapshot ianzfspool/containers/test@iansnap10001
を直接(LXD経由ではなく)実行するのにかかる時間は0.5秒未満です。LXD経由よりもはるかに高速です。
LXDスナップショットの作成が遅くなる理由と、速度を上げる方法に関するドキュメントはどこにありますか? (ZFSスナップショットを備えたLXDが信じられないほど安かった場合、5分ごとにスナップショットを実行し、約1週間(2,016スナップショット)保持することを望んでいました。LVMスナップショットはパフォーマンスが低下することを読みました。 、しかし、私が読んだことはZFSでのLXDについて同じことを言っていません。LXDをバイパスしてZFSスナップショットを使用することができると思いますが、なぜそうする必要があるのですか?
ホスト上のlxd
プロセスは多くのCPUを使用しており、大きくなっています(1,200スナップショット後):
PID VSTACK VSIZE RSIZE PSIZE VGROW RGROW SWAPSZ MEM CMD 1/8
10663 132K 3.7G 1.1G 0K 0K 0K 2580K 14% lxd
私はlxd snapshot
の経験がないので、できることはその実装について推測し、ZFSスナップショットの詳細を伝えることです。
ZFSスナップショットは、進行中の読み取りおよび書き込みにオーバーヘッドが追加されないように設計されています。 (既に述べたように、LVMスナップショットは書き込み増幅の形でパフォーマンスのペナルティを追加します。)これを実現するために、ZFSにはtxg_sync
と呼ばれる内部操作があり、これは最近のすべての非同期IOのバッチ書き込みのようなものです。 10秒ごとに自動的に発生し、ファイルシステム構造が変更されたとき(スナップショットを撮るときなど)に発生します。これにより大量のIOが発生するため、理論的には輻輳による同時同期書き込みの速度低下を引き起こす可能性があります(ただし、同期書き込みが優先されるはずです)。ただし、ファイルシステムにはほとんど何も書き込まれていないようです(おそらく、プールの残りの部分にはそれ以上の書き込みは行われていません)。
私の推測では、実際にはメタデータの読み取りが遅くなっているようです。理論的には、lxd snapshot
はZFSスナップショットを取得して続行できますが、これには一定の(一定のIOロード)時間が必要です。ただし、その操作中にすべてのスナップショットをリストしようとすると(zfs list
と同等)、それはすべてのスナップショットのメタデータの全体の読み取りを含むことを推測しています。スナップショットの数に比例して増加します。それが当てはまるかどうかを確認するには、ファイルシステムでzfs snapshot
を直接計時し、ファイルシステムとそのスナップショットでzfs list -t all
を実行して、どれがもう一方よりも長くかかるかを確認します( 2番目のものでなければなりません)。
ZFSコミュニティではこれは既知の問題ですが、多くのディスク上のメタデータ構造を変更して改善する必要があり、この多くのスナップショットを保持することは非常に珍しいため、修正が困難です。 lxd
がスナップショット操作を実行するためにすべてのスナップショットをリストすることを避けるために一生懸命努力した場合、問題を解決できると思います。
または、5分ごとにスナップショットを作成することもできますが、比較的迅速に削除し、5m、10m、15m、30m、1h、2h、3h、6h、12h、24hなどのスナップショットのみを保持します。これにより、ウィンドウが必要になる可能性が高いときに、ウィンドウの解像度が高くなり、lxd snapshot
の速度が低下することもありません。