英語フランス語スペイン語

Ad


OnWorksファビコン

guestfs-performance - クラウドでオンライン

Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターを介して、OnWorks の無料ホスティング プロバイダーで guestfs-performance を実行します。

これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、MAC OS オンライン エミュレーターなど、複数の無料オンライン ワークステーションのいずれかを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド guestfs-performance です。

プログラム:

NAME


guestfs-performance - 最高のパフォーマンスを得るために libguestfs をエンジニアリングする

DESCRIPTION


このページでは、libguestfs のパフォーマンスを最大限に引き出す方法について説明します。
何千もの仮想マシンまたはディスク イメージを操作するために libguestfs を使用することを期待しています。

XNUMX つの主な領域がカバーされます。 Libguestfs はアプライアンスを実行します (小さな Linux ディストリビューション)
qemu/KVM 内。 最初の XNUMX つの分野は次のとおりです。
アプライアンス、およびアプライアンスを起動する必要がある回数。 XNUMXつ目のエリアは
VM の検査にかかる時間を短縮します。

ベースライン MEASUREMENTS


libguestfs の使用方法を変更する前に、ベースライン測定を行います。

ベースライン: 起動   アプライアンス
アンロードされたマシンで、アプライアンスの起動にかかる時間を計測します。

time guestfish -a /dev/null 実行

このコマンドを数回続けて実行し、最初の数回の実行を破棄して、
典型的な「ホット キャッシュ」のケースを測定します。

説明

このコマンドは、null ディスクで libguestfs アプライアンスを起動し、すぐにシャットダウンします。
それを下げます。 コマンドを初めて実行すると、アプライアンスが作成されてキャッシュされます
(通常は /var/tmp/.guestfs-*)。 以降の実行では、キャッシュされたアプライアンスを再利用する必要があります。

期待 結果

6 秒未満の時間が得られることを期待する必要があります。 もしあなたが
アンロードされたマシンがこれより上にある場合は、「パフォーマンスの低下のトラブルシューティング」セクションを参照してください。
を参照してください。

ベースライン: パフォーミング 検査 of a ゲスト
このテストでは、アンロードされたマシンと、少なくとも XNUMX つの実際のゲストまたはディスク イメージが必要です。
X ゲストのみに対して libguestfs を使用する予定の場合 (例: X = Windows)、
ここでは X ゲストが最適です。 libguestfs を実行する予定がある場合
ここでテストするためにゲストの混合を使用します。

検査の実行とゲストのディスクのマウントにかかる時間。 使用
ディスク イメージを使用する場合は最初のコマンド、使用する場合は XNUMX 番目のコマンド
libvirt を使用します。

時間 guestfish --ro -a disc.img -i exit

time guestfish --ro -d GuestName -i exit

コマンドを連続して数回実行し、最初の数回の実行を破棄します。
典型的な「ホット キャッシュ」のケースを測定します。

説明

このコマンドは、指定されたディスク イメージまたは libvirt ゲストで libguestfs アプライアンスを起動します。
その上でlibguestfs検査を実行します(「検査」を参照) ゲスト(3))、ゲストの
これらの結果をすべて破棄してシャットダウンします。

コマンドを初めて実行すると、アプライアンスが作成され、キャッシュされます (通常は
/var/tmp/.guestfs-*)。 以降の実行では、キャッシュされたアプライアンスを再利用する必要があります。

期待 結果

最初のベースラインで測定された時間よりも 5 秒以下長い時間を期待する必要があります。
上記のテスト。 (たとえば、最初のベースライン テストが 5 秒で実行された場合、このテストは
≤ 10 秒で実行する必要があります)。

理解 アプライアンス そして WHEN IT IS ビルド/キャッシュ


初めて libguestfs を使用すると、アプライアンスが構築されてキャッシュされます。 これは通常
in /var/tmp/.guestfs-*ただし、$TMPDIR または $LIBGUESTFS_CACHEDIR を設定していない場合は除きます。
その一時ディレクトリの下になります。

アプライアンスの構成方法の詳細については、「SUPERMIN アプライアンス」を参照してください。
スーパーミンとします。

libguestfs が実行されるたびに、アプライアンスによって使用されるホスト ファイルに
かわった。 ある場合は、アプライアンスが再構築されます。 これは通常、パッケージが
ホストにインストールまたは更新されます (たとえば、「yum」や「apt-get」などのプログラムを使用)。 の
アプライアンスを再構築する理由はセキュリティです。
インストールされたプログラムにはセキュリティ修正が含まれている可能性があるため、修正されたプログラムを
アプライアンスを自動的に。

パフォーマンスへの影響は次のとおりです。

· キャッシュされたアプライアンスを構築 (または再構築) するプロセスは遅く、
固定アプライアンスを使用して、これを回避してください(以下を参照)。

· 固定アプライアンスを使用していない場合は、ホスト上のソフトウェアを更新すると、
アプライアンスの XNUMX 回限りの再構築。

· / var / tmp (または $TMPDIR、$LIBGUESTFS_CACHEDIR) は高速ディスク上にあり、十分な容量がある必要があります
アプライアンスのスペース。

使用する A FIXED アプライアンス


アプライアンスの構築時期を完全に制御するために、固定アプライアンスを構築できます。 この
アプライアンスは、高速なローカル ディスクに保存する必要があります。

アプライアンスを構築するには、次のコマンドを実行します。

libguestfs-make-fixed-appliance

"を置き換える" アプライアンスが保存されるディレクトリの名前
(通常、サブディレクトリに名前を付けます。たとえば、次のようになります。 /usr/local/lib/guestfs/アプライアンス or
/dev/shm/アプライアンス).

次に、$LIBGUESTFS_PATH を設定します (この環境変数が libguestfs に設定されていることを確認します)。
プログラム)、または「guestfs_set_path」を呼び出すようにプログラムを変更します。 例えば:

エクスポート LIBGUESTFS_PATH=/usr/local/lib/guestfs/appliance

libguestfs プログラム、virt ツール、guestfish などを通常どおり実行できるようになりました。 プログラム
固定アプライアンスを使用し、独自のアプライアンスを構築、再構築、またはキャッシュすることはありません
アプライアンス。

(このテーマの詳細については、以下を参照してください。 libguestfs-make-fixed-appliance(1))。

性能 of   固定の アプライアンス
私たちのテストでは、固定アプライアンスを使用しても測定可能な結果が得られなかったことがわかりました
アプライアンスがメモリ内にある場合でも (つまり、 / dev / shm).
ただし、考慮すべき点が XNUMX つあります。

1. 固定アプライアンスを使用すると、libguestfs によるアプライアンスの再構築が停止します。
libguestfs の起動時間がより予測しやすくなります。

2. アプライアンスはオンデマンドでロードされます。 次のような簡単なテスト:

time guestfish -a /dev/null 実行

アプライアンスにあまり負荷をかけません。 複雑なを使用する実際の libguestfs プログラム
API 呼び出しは、より多くのアプライアンスをデマンド ロードします。 収納できることで
指定された場所にアプライアンスを配置すると、パフォーマンスがより予測しやすくなります。

削減 OF タイムズ アプライアンス IS ローンチ


優れたパフォーマンスを得るための最も簡単な方法は必ずしもそうではありませんが、断然最も効果的です。
アプライアンスが最小回数起動されるようにします。 これはおそらく
libguestfs アプリケーションを変更する必要があります。

ターゲット仮想マシンまたはディスク イメージごとに最大 XNUMX 回、「guestfs_launch」を呼び出すようにしてください。

の別のインスタンスを使用する代わりに ゲストフィッシュ(1) に一連の変更を加える
同じゲスト、guestfish の単一のインスタンスを使用する、および/または guestfish を使用する - 聞く オプションを選択します。

シリーズの作成中にゲストを開いたままにするデーモンとしてプログラムを作成することを検討してください
変更の。 または、ゲストを開く前に、実行するすべての操作をマーシャリングします。

複数のゲストから単一のアプライアンスにディスクを追加することもできます。 試す前に
次の点に注意してください。

1. XNUMX つのアプライアンスに複数のゲストを追加することは、XNUMX つのアプライアンスを許可する可能性があるため、セキュリティ上の問題です。
ゲストが別のゲストのディスクに干渉しないようにします。 すべてを信頼できる場合にのみ実行してください。
ゲスト、または信頼によってゲストをグループ化できる場合。

2. XNUMX つのアプライアンスに追加できるディスクの数には厳しい制限があります。 電話
「guestfs_max_disks」 ゲスト(3) この制限を取得します。 詳細については、
「LIMITS」 ゲストとします。

3. libguestfs をこのように使用するのは複雑です。 ディスクには予期しない相互作用が発生する可能性があります。
たとえば、XNUMX つのゲストがファイルシステムに同じ UUID を使用している場合 (それらがクローンされているため)、
または、同じ名前のボリューム グループがあります (ただし、「guestfs_lvm_set_filter」を参照してください)。

virt-df(1) デフォルトで複数のディスクを追加するため、このプログラムのソース コードは
開始するには良い場所です。

ショートニング タイム テイケン FOR 検査 OF VM


主なアドバイスは明らかです。
結果。

以前にゲストで検査を実行したことがある場合は、キャッシュして安全に使用できる可能性があります。
前回の結果を再利用します。

一部のディスクはまったく検査する必要はありません: たとえば、ディスクを作成している場合
イメージ、またはディスク イメージが VM ではない場合、またはディスク イメージに既知のレイアウトがある場合。

基本的な検査(「guestfs_inspect_os」)が必要な場合でも、補助的な検査
操作を避けることができます:

· ディスクのマウントは、ファイルシステム情報をさらに取得するためにのみ必要です。

· アプリケーションの一覧表示 ("guestfs_inspect_list_applications") はコストのかかる操作です
Linux では、Windows ではほぼ無料です。

· ゲスト アイコン ("guestfs_inspect_get_icon") の生成は、Linux では安価ですが、高価です
Windowsでは。

平行 アプライアンス


Libguestfs アプライアンスはほとんどが I/O バウンドであり、複数のアプライアンスを
平行。 十分な空きメモリがあれば、ほとんど違いはありません。
1 つのアプライアンスと N 個のアプライアンスを並行して起動します。

2 GB の RAM を搭載した 4 コア (16 スレッド) ラップトップで、(特に現実的ではない) テストを使用
以下の Perl スクリプト。次のプロットは、1 つの
および 20 個のアプライアンスを並列に:

12 ++---+----+----+----+-----+----+----+----+----+-- -++
+ + + + + + + + + + *
| |
| | * | |
11++++
| |
| |
| | * * |
10++++
| | * | |
| |
s | | |
9++++
e | | |
| | * | |
c | | |
8 ++ * ++
を | * | |
| |
n 7 ++ ++
| | * | |
d | * | |
| |
6 ++ ++
| | * * |
| | * | |
| |
5++++
| |
| | * | |
| | * * |
4++++
| |
| |
+ * * * + + + + + + + +
3 ++-*-+----+----+----+-----+----+----+----+----+-- -++
0 2 4 6 8 10 12 14 16 18
並列アプライアンスの数

20 を超えるアプライアンスを並行して実行することは可能ですが、
libvirt バックエンドの場合、そのままの状態で libvirt がバックエンドの数を制限していることに注意してください。
20 までのクライアント接続。

以下の単純な Perl スクリプトは、上記のプロットのデータを収集するために使用されましたが、
より高度なテスト スクリプトやグラフを含む、このテーマに関するより多くの情報
次のブログ投稿で入手できます。

http://rwmj.wordpress.com/2013/02/25/multiple-libguestfs-appliances-in-parallel-part-1/
http://rwmj.wordpress.com/2013/02/25/multiple-libguestfs-appliances-in-parallel-part-2/
http://rwmj.wordpress.com/2013/02/25/multiple-libguestfs-appliances-in-parallel-part-3/
http://rwmj.wordpress.com/2013/02/25/multiple-libguestfs-appliances-in-parallel-part-4/

#!/ usr / bin / env パール

厳格な使用;
スレッドを使用します。
警告を使用します。
Sys::Guestfs を使用します。
Time::HiRes qw(time); を使用します。

サブテスト {
私の $g = Sys::Guestfs->new;
$g->add_drive_ro ("/dev/null");
$g->launch ();

# libguestfs がここで行う作業を追加できます。

$g->close ();
}

# すべてをキャッシュに入れる。
テスト (); テスト (); テスト ();

私の $nr_threads (1..20) {
私の $start_t = 時間 ();
私の@スレッド;
foreach (1..$nr_threads) {
push @threads, threads->create (\&test)
}
foreach (@スレッド) {
$_->join ();
if (my $err = $_->error ()) {
die "$nr_threads スレッドで起動に失敗しました: $err"
}
}
私の $end_t = 時間 ();
printf ("%d %.2f\n", $nr_threads, $end_t - $start_t);
}

使用する ユーザーモード リナックス


libguestfs 1.24 以降、User-Mode Linux (uml) バックエンドを使用できるようになりました。
KVM の代わりに (「USER-MODE LINUX BACKEND」を参照) ゲスト(3))。 このセクションでは、
このバックエンドに関する一般的な意見ですが、 非常に 賢い 自分で測る
コメントや直感を信頼するのではなく、UML の下でワークロードを実行します。

· UML は通常、ベアメタル上で KVM と同じか、わずかに遅くなります。

· ただし、UML は多くの場合、仮想化下でもベアメタル上と同じように動作しますが、
一方、KVM は仮想化下では実行速度が大幅に低下する可能性があります (ハードウェア仮想化アクセラレーションにより、
利用できません)。

· アップロードとダウンロードは、UML では KVM よりも 10 倍遅くなります。 libguestfs が送信する
このデータは、UML エミュレートされたシリアル ポート経由で行われますが、これは KVM のものよりもはるかに効率的ではありません。
virtio シリアル。

· UML にはいくつかの機能 (qcow2 のサポートなど) が欠けているため、まったく適用できない場合があります。

実際の数値については、次を参照してください。
http://rwmj.wordpress.com/2013/08/14/performance-of-user-mode-linux-as-a-libguestfs-backend/#コンテンツ

トラブルシューティング 貧しい パフォーマンスとは


確保 ハードウェア 仮想化 is 利用できます
  / proc / cpuinfo そしてこのページ:

http://virt-tools.org/learning/check-hardware-virt/

ハードウェア仮想化が利用可能であることを確認します。 有効にする必要がある場合があることに注意してください
BIOS で。

ハードウェア virt は通常、VM 内では利用できず、libguestfs は内部でゆっくりと実行されます。
何をするにしても別の仮想マシン。 入れ子になった仮想化は、私たちの環境ではうまく機能しません
ベアメタルで libguestfs を実行する代わりにはなりません。

確保 KVM is 利用できます
KVM が有効になっており、libguestfs を実行するユーザーが利用できることを確認してください。 そうすべき
安全に 0666 パーミッションを設定してください /dev/kvm 現在、ほとんどのディストリビューションでこれが行われています。

プロセッサ 〜へ 避ける
ハードウェア仮想化を備えていないプロセッサと、仮想化されている一部のプロセッサは避けてください。
単純に非常に遅い (AMD Geode が良い例です)。

Xenの dom0
Xen では、dom0 は仮想マシンであるため、ハードウェアの仮想化は利用できません。

詳細 タイミング 使用する TS


ts(1) 詳細なタイミングを表示するコマンド (moreutils から):

$ guestfish -a /dev/null run -v |& ts -i '%.s'
0.000022 libguestfs: 起動: program=guestfish
0.000134 libguestfs: 起動: version=1.29.31fedora=23,release=2.fc23,libvirt
0.000044 libguestfs: 起動: バックエンド登録済み: unix
0.000035 libguestfs: 起動: バックエンドが登録されました: UML
0.000035 libguestfs: 起動: バックエンド登録: libvirt
0.000032 libguestfs: 起動: バックエンド登録: 直接
0.000030 libguestfs: 起動: バックエンド = libvirt
0.000031 libguestfs: 起動: tmpdir=/tmp/libguestfsw18rBQ
0.000029 libguestfs: 起動: umask=0002
0.000031 libguestfs: 起動: euid=1000
0.000030 libguestfs: libvirt バージョン = 1002012 (1.2.12)
[等]

タイムスタンプは秒単位です (前の行から増分)。

詳細 タイミング 使用する システムタップ


SystemTap (ステープル(1)) libguestfs プログラムから詳細なタイミングを取得します。

次のスクリプトを次のように保存します タイムスタプ:

グローバルラスト;

関数 display_time () {
今 = gettimeofday_us ();
デルタ = 0;
もし (最後 > 0)
デルタ = 今 - 最後;
最後 = 今;

printf ("%d (+%d):"、今、デルタ);
}

プローブ開始 {
最後 = 0;
printf ("準備完了\n");
}

/* 静的マーカーへのすべての呼び出しを表示します。 */
プローブ プロセス("/ usr / lib*/libguestfs.so.0")
.provider("guestfs").mark("*") ? {
表示時間();
printf ("\t%s %s\n", $$name, $$parms);
}

/* guestfs_* 関数へのすべての呼び出しを表示します。 */
プローブ プロセス("/ usr / lib*/libguestfs.so.0")
.function("guestfs_[az]*") ? {
表示時間();
printf ("\t%s %s\n", probefunc(), $$parms);
}

XNUMX つのウィンドウで root として実行します。

# 停止時間.stap
準備

SystemTap がプログラムをロードすると、「ready」と表示されます。 libguestfs プログラムを実行します。
別のウィンドウで guestfish または virt ツール。 例えば:

$ guestfish -a /dev/null 実行

stap ウィンドウに大量の出力が表示され、それぞれにかかった時間が表示されます。
示されているステップ (括弧内はマイクロ秒)。 例えば:

xxxx (+0): guestfs_create
xxxx (+29): guestfs_set_pgroup g=0x17a9de0 pgroup=0x1
xxxx (+9): guestfs_add_drive_opts_argv g=0x17a9de0 [...]
xxxx (+8): guestfs_int_safe_strdup g=0x17a9de0 str=0x7f8a153bed5d
xxxx (+19): guestfs_int_safe_malloc g=0x17a9de0 nbytes=0x38
xxxx (+5): guestfs_int_safe_strdup g=0x17a9de0 str=0x17a9f60
xxxx (+10): guestfs_launch g=0x17a9de0
xxxx (+4): launch_start
[等]

完全に理解するには、libguestfs のソースを調べたり、変更したりする必要があります。
出力。

詳細 デバッグ 使用する GDB


gdb を使用して、アプライアンスの BIOS/カーネルに接続できます。 あなたが何をしているか知っていれば、
これは、ブートの後退を診断するのに役立つ方法です。

まず、「-S」および「-s」オプションで実行されるように qemu を変更する必要があります。 これらのオプション
ブート時に qemu を一時停止し、デバッガーをアタッチできるようにします。 読む qemu(1) さらに詳しく
情報。 libguestfs は qemu を数回呼び出します (ヘルプ出力などをスキャンするため)
これらのオプションを使用するために qemu の最後の呼び出しのみが必要な場合は、qemu ラッパーを使用します。
このようなスクリプト:

#!/bin/bash -

# 実際の qemu バイナリを指すように設定します。
qemu=/usr/bin/qemu-kvm

if [ "$1" != "-global" ]; それから
# スキャンヘルプ出力など
exec $qemu "$@"
ほかに
# 実際に qemu を実行しています。
exec $qemu -S -s "$@"
fi

ここで、qemu ラッパーを使用して guestfish または別の libguestfs ツールを実行します (「QEMU WRAPPERS」を参照)。
ゲスト(3)これが何をしているのかを理解するため):

LIBGUESTFS_HV=/path/to/qemu-wrapper ゲストフィッシュ -a /dev/null -v 実行

これは、qemu の起動直後に一時停止するはずです。 別のウィンドウで、gdb を使用して qemu にアタッチします。

$gdb
(gdb) アーキテクチャ i8086 を設定
ターゲット アーキテクチャは i8086 と想定されます
(gdb) ターゲット リモート:1234
:1234 を使用したリモート デバッグ
??で0x0000fff0 ()
(gdb) 続き

この時点で、標準の gdb 手法を使用できます。 「^C」を押して起動を中断する
および「bt」は、スタック トレースの取得、ブレークポイントの設定などを行います。
BIOS と Linux カーネルに、アーキテクチャを 32 または 64 に戻す必要があります。
ビット。

onworks.net サービスを使用して、オンラインで guestfs-performance を使用する


無料のサーバーとワークステーション

Windows と Linux のアプリをダウンロード

Linuxコマンド

Ad