英语法语西班牙语

Ad


OnWorks 网站图标

guestfs-performance - 云端在线

通过 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器在 OnWorks 免费托管服务提供商中运行 guestfs-performance

这是命令 guestfs-performance 可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


guestfs-performance - 工程 libguestfs 以获得最佳性能

商品描述


此页面记录了如何从 libguestfs 中获得最大性能,尤其是在
您希望使用 libguestfs 来操作数以千计的虚拟机或磁盘映像。

涵盖三个主要领域。 Libguestfs 运行一个设备(一个小型​​ Linux 发行版)
在 qemu/KVM 中。 前两个方面是:最大限度地减少启动此操作所花费的时间
设备,以及设备必须启动的次数。 第三个区域是
缩短检查虚拟机所需的时间。

基准线 尺寸


在更改您使用 libguestfs 的方式之前,请先进行基线测量。

基线: 开始 器具
在未加载的机器上,计算启动设备所需的时间:

time guestfish -a /dev/null 运行

连续多次运行此命令并丢弃前几次运行,以便您
测量典型的“热缓存”案例。

说明

此命令在空磁盘上启动 libguestfs 组件,然后立即关闭
它下来。 第一次运行命令时,它会创建一个设备并缓存它
(通常在 /var/tmp/.guestfs-*)。 后续运行应重用缓存的设备。

期望 结果

您应该期望获得不到 6 秒的时间。 如果你看到的时间
卸载的机器高于此,然后参见“故障排除性能不佳”部分
联络一位教师

基线: 表演 检查 of a 客人
对于此测试,您将需要一台未加载的机器和至少一个真实的来宾或磁盘映像。
如果您计划仅对 X 个来宾(例如 X = Windows)使用 libguestfs,则使用
这里有一个 X 客人是最合适的。 如果您打算对 libguestfs 运行
来宾组合,然后在此处使用来宾组合进行测试。

Time 执行检查和挂载来宾磁盘所需的时间。 使用
如果您将使用磁盘映像,则使用第一个命令,如果您将使用第二个命令
使用 libvirt。

时间 guestfish --ro -a disk.img -i exit

时间 guestfish --ro -d GuestName -i exit

连续多次运行命令并丢弃前几次运行,以便您
测量典型的“热缓存”案例。

说明

此命令在指定的磁盘映像或 libvirt 来宾上启动 libguestfs 组件,
对其执行 libguestfs 检查(参见“检查” 来宾(3)), 挂载客人的
磁盘,然后丢弃所有这些结果并关闭。

第一次运行命令时,它会创建一个设备并缓存它(通常是
/var/tmp/.guestfs-*)。 后续运行应重用缓存的设备。

期望 结果

您应该期望时间比第一个基线中测量的时间长 ≤ 5 秒
以上测试。 (例如,如果第一个基线测试在 5 秒内运行,则此测试
应在 ≤ 10 秒内运行)。

理解 器具 AND WHEN IT IS 构建/缓存


第一次使用 libguestfs 时,它会构建和缓存一个设备。 这通常是
in /var/tmp/.guestfs-*, 除非您设置了 $TMPDIR 或 $LIBGUESTFS_CACHEDIR 在这种情况下
它将在该临时目录下。

有关设备构造的更多信息,请参阅“超级设备”
超小(1)。

每次运行 libguestfs 时,它都会检查设备使用的主机文件是否具有
改变了。 如果有,则重建设备。 这通常发生在包裹
在主机上安装或更新(例如,使用“yum”或“apt-get”等程序)。 这
重建设备的原因是安全性:新程序已经
安装的可能包含安全修复程序,因此我们希望将修复的程序包含在
设备自动。

这些是性能影响:

· 构建(或重建)缓存设备的过程很慢,您可以
通过使用固定设备来避免这种情况发生(见下文)。

· 如果不使用固定设备,请注意更新主机上的软件会导致
一次性重建设备。

· / 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-制作固定设备(1))。

性能 of 固定 器具
在我们的测试中,我们没有发现使用固定设备会产生任何可测量的
性能优势,即使设备位于内存中(即 /开发/shm).
但是有两点需要考虑:

1. 使用固定设备会阻止 libguestfs 重新构建设备,这意味着
libguestfs 将有更多可预测的启动时间。

2. 设备按需加载。 一个简单的测试,例如:

time guestfish -a /dev/null 运行

不会加载太多设备。 一个真正的 libguestfs 程序,使用复杂
API 调用会要求加载更多的设备。 能够存储
指定位置的设备使性能更可预测。

减少 NUMBER OF TIMES 器具 IS 推出


到目前为止,获得良好性能的最有效但并不总是最简单的方法是
以确保设备启动的次数最少。 这大概会
涉及更改您的 libguestfs 应用程序。

尝试为每个目标虚拟机或磁盘映像最多调用一次“guestfs_launch”。

而不是使用单独的实例 客鱼(1) 进行一系列的修改
同一个来宾,使用单个 guestfish 实例和/或使用 guestfish - 听 选项。

考虑将您的程序编写为守护进程,在制作系列时保持访客打开
的变化。 或者在打开来宾之前编组要执行的所有操作。

您还可以尝试将来自多个来宾的磁盘添加到单个设备。 在尝试之前
对此,请注意以下几点:

1. 将多个访客添加到一个设备是一个安全问题,因为它可能允许一个
来宾干扰另一个来宾的磁盘。 只有当你相信所有的东西时才这样做
客人,或者您是否可以通过信任对客人进行分组。

2. 可以添加到单个设备的磁盘数量有硬性限制。 称呼
“guestfs_max_disks”中 来宾(3) 得到这个限制。 欲了解更多信息,请参阅
“限制”在 来宾(3)。

3. 以这种方式使用 libguestfs 很复杂。 磁盘可能会发生意外交互:对于
例如,如果两个来宾对文件系统使用相同的 UUID(因为它们被克隆),
或具有相同名称的卷组(但请参阅“guestfs_lvm_set_filter”)。

虚拟机(1) 默认添加多个磁盘,所以这个程序的源代码是一个
开始的好地方。

缩短 时间 塔肯 用于 检查 OF 虚拟机


主要建议很明显:除非您需要,否则不要进行检查(这是昂贵的)
结果。

如果您之前对来宾进行了检查,那么缓存和
重用上次的结果。

有些磁盘根本不需要检查:例如,如果您正在创建磁盘
映像,或者磁盘映像不是 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++++
| * |
| |
| |
9++++
电子 | |
| * |
c | |
8 ++ * ++
○ | * |
| |
7 ++ ++
| * |
d | * |
| |
6 ++ ++
| * * |
| * |
| |
5++++
| |
| * |
| * * |
4++++
| |
| |
+ * * * + + + + + + + + +
3 ++-*-+----+----+----+-----+----+----+----+----+-- -++
0 2 4 6 8 10 12 14 16 18 20
并联电器数量

可以并行运行 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/环境 perl的

用严格;
使用线程;
使用警告;
使用 Sys::Guestfs;
使用 Time::HiRes qw(time);

子测试{
我的 $g = Sys::Guestfs->new;
$g->add_drive_ro ("/dev/null");
$g->启动();

# 你可以在这里为 libguestfs 添加一些工作。

$g->close();
}

# 将所有内容放入缓存。
测试 (); 测试 (); 测试 ();

对于我的 $nr_threads (1..20) {
我的 $start_t = 时间 ();
我的@threads;
foreach (1..$nr_threads) {
推@threads,线程->创建(\&test)
}
foreach(@threads){
$_->加入();
如果(我的 $err = $_->error ()) {
死“启动失败,$nr_threads 线程:$err”
}
}
我的 $end_t = 时间 ();
printf ("%d %.2f\n", $nr_threads, $end_t - $start_t);
}

使用 用户模式 LINUX


从 libguestfs 1.24 开始,可以使用用户模式 ​​Linux (uml) 后端
而不是 KVM(请参阅“用户模式 ​​LINUX 后端” 来宾(3))。 本节使一些
关于这个后端的一般性评论,但它是 高度 明智的 测量你自己的
UML 下的工作负载,而不是相信评论或直觉。

· UML 在裸机上的性能通常与 KVM 相同或略慢。

· 然而,UML 在虚拟化下的表现通常与在裸机上的表现相同,
而 KVM 在虚拟化下的运行速度会慢得多(因为硬件 virt 加速
不可用)。

· 在 UML 上上传和下载比 KVM 慢 10 倍。 Libguestfs 发送
这些数据通过 UML 模拟串行端口传输,远低于 KVM 的效率
虚拟串行。

· 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,并且 libguestfs 在内部运行会很慢
无论您做什么,都可以使用另一个虚拟机。 嵌套虚拟化在我们的
经验,当然不能替代在裸机上运行 libguestfs。

确保 KVM is 可使用
确保 KVM 已启用并且可供将运行 libguestfs 的用户使用。 这应该
安全地设置 0666 权限 /开发/kvm 大多数发行版现在都这样做。

加工厂 避免
避免使用没有硬件虚拟化的处理器,以及一些具有硬件虚拟化功能的处理器
只是非常慢(AMD Geode 就是一个很好的例子)。

Xen的 dom0
在 Xen 中,dom0 是一个虚拟机,因此硬件虚拟化不可用。

产品详情 时间安排 使用 TS


使用 ts(1) 命令(来自moreutils)显示详细时间:

$ guestfish -a /dev/null run -v |& ts -i '%.s'
0.000022 libguestfs:启动:程序=guestfish
0.000134 libguestfs:启动:版本=1.29.31fedora=23,发布=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 程序中获取详细的时间安排。

将以下脚本另存为 时间点:

全球最后;

函数显示时间(){
现在 = gettimeofday_us();
增量 = 0;
如果(最后 > 0)
delta = 现在 - 最后;
最后=现在;

printf ("%d (+%d):", 现在, delta);
}

探测开始{
最后= 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);
}

在一个窗口中以 root 身份运行它:

# 步骤时间.stap
准备

当 SystemTap 加载程序时,它会打印“就绪”。 运行你的 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/内核。 如果你知道你在做什么,
这可能是诊断引导回归的有用方法。

首先,您必须更改 qemu,以便它使用“-S”和“-s”选项运行。 这些选项
导致 qemu 在启动时暂停并允许您附加调试器。 读 (1) 进一步
信息。 Libguestfs 多次调用 qemu(扫描帮助输出等)
并且您只希望 qemu 的最终调用使用这些选项,因此请使用 qemu 包装器
像这样的脚本:

#!/ bin / bash -

# 将此设置为指向真正的 qemu 二进制文件。
qemu=/usr/bin/qemu-kvm

if [ "$1" != "-global" ]; 然后
# 扫描帮助输出等
执行 $qemu "$@"
其他
# 真正运行 qemu。
exec $qemu -S -s "$@"
fi

现在使用 qemu 包装器运行 guestfish 或其他 libguestfs 工具(请参阅“QEMU WRAPPERS”
来宾(3) 了解这是在做什么):

LIBGUESTFS_HV=/path/to/qemu-wrapper guestfish -a /dev/null -v run

这应该在 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