我们一直在尝试使用虚拟机来构建服务器。我们的构建服务器都运行WinXP32,并且将它们托管在运行于Ubuntu 9.10的VMWare Server 2.0上。我们混合使用C,C++,python软件包和其他各种部署任务(安装程序,7z文件,文件等)。使用VMWare托管构建服务器的管理非常出色。我们可以移动它们,在一个大的8核盒子上共享系统资源,通过Web界面远程访问系统,并且基本上可以更好地进行管理。

但是问题在于,与使用物理计算机相比,性能取决于坏的日子,从坏到坏。事实证明,这非常令人沮丧。有时,主机的系统负载会超过20,有时会低于1。这似乎并不是基于系统上实际完成的工作量。我怀疑系统中存在瓶颈,但是我似乎无法弄清楚它是什么。 (最近的嫌疑人是I/O,但我们有一个专用的1TB 7200RPM SATA 2驱动器,具有32MB的缓存,除了虚拟机外什么也做不了。似乎足以容纳1-2台机器。所有其他规范似乎也足够。8GB RAM ,每个VM 2GB,8个内核,每个VM 1个)。

因此,在用尽所有我能想到的东西之后,我想转向Stack Overflow社区。

  • 是否让任何人运行或看到其他人在虚拟机中运行软件构建性能的基准测试。
  • 与物理系统相比,我们应该期待什么?
  • 我们要放弃多少性能?
  • 人们使用什么硬件/vm服务器配置?

  • 任何帮助将不胜感激。

    最佳答案

    磁盘IO绝对是一个问题,在使用单个主轴备份磁盘IO时,您根本无法进行大量的磁盘IO Activity 。单个SATA驱动器上的32MB缓存将仅由您的主机和几个Guest OS的滴答声饱和。如果您查看Ubuntu Host OS中的磁盘队列长度计数器,您会发现它很长(此系统上具有2个驱动器的任何长度的任何值大于1表示任何时间都在等待该磁盘)。

    在为虚拟机的基础架构调整大小时,通常平均每个虚拟机30-50 IOPS,这是针对磁盘子系统使用不多的系统的。对于不需要大量IO Activity 的系统,您可以放一些点,但是构建系统的IO模式将严重偏向大量非常随机且很小的读取。为了解决这个问题,您需要同时构建大量的这些VM,这将通过屋顶插入磁盘争用。总体磁盘带宽可能不是一个大问题(当IO模式完全顺序时SATA驱动器可能会以70-100Meg/sec的速度运行),但是当文件较小且分散时,您的IO会受到主轴限制的约束。在7.2k SATA上每秒约70-100 IO。如果运行主机类型为2的虚拟机管理程序(例如VMware Server)且具有单个 guest ,则该主机操作系统可能会在轻负载下达到目标。

    我的建议是使用更小且速度更快的驱动器来构建RAID 10阵列。 10k SAS驱动器每个将为您提供100-150个IOP,因此一包4个可以在装满之前处理600个读IOPS和300个写IOP。如果要将VM文件放在RAID阵列上,还请确保align all of the data partitions托管VMDK的驱动器以及 guest OS的驱动器。对于此类工作负载,将使您的磁盘性能提高20-30%。避免使用RAID 5之类的东西,因为空间便宜,并且RAID 5的写入代价意味着RAID 5包中需要4个驱动器才能达到单个驱动器的写入性能。

    我要补充的另一点是,就性能而言,VMware Server并不是出色的虚拟机监控程序,如果可能的话,迁移到Type 1虚拟机监控程序(例如ESXi v4,它也是免费的)。设置并非易事,而且您完全失去了主机操作系统,因此这可能是一个问题,但是您会发现整体上的IO性能要好得多,尤其是在磁盘和网络流量方面。

    编辑以回复您的评论。
    1)查看您现有的Ubuntu主机上是否确实存在问题。
    我看到您已经尝试过dstat,但我认为它无法提供足够的详细信息来了解正在发生的事情,但是我对使用它不熟悉,因此我可能是错的。 Iostat将为您提供一幅完整的画面-有关使用iostat的文章将帮助您更好地了解击中磁盘http://bhavin.directi.com/iostat-and-disk-utilization-monitoring-nirvana/的实际IO模式。 avgrq-sz和avgwq-sz是排队的请求数量的原始指标。高数量通常是不好的,但实际上不好的东西会随磁盘类型和RAID几何形状而变化。您最终感兴趣的是查看磁盘IO是否在队列中花费的时间比在实际服务中花费的时间更多/在增加。计算(await-svctim)/await*100确实告诉您磁盘是否在努力维持(超过50%),并且您的IO​​花费的时间与磁盘所服务的队列一样长,如果接近100%,磁盘将被完全撞击。如果您确实发现主机并没有真正受到压力,而VMware Server实际上却很糟糕(这很可能是这样,我从未在Linux平台上使用过它),那么您可能需要先尝试使用VirtualBox之类的替代方法之一跳到ESXi上。

    2)弄清楚您需要什么。
    为性能良好/可接受的系统上的典型构建的IO需求设定基线-在Windows上查看IOPS计数器-“磁盘读取/秒”和“磁盘写入/秒”计数器,并确保平均队列长度小于1。您需要知道系统加载时的两个峰值,如果一切都来自磁盘缓存,那么瞬时峰值可能会很高,因此请注意一分钟左右的持续峰值。有了这些数字后,您就可以确定磁盘子系统的范围,该子系统将满足您的需求。您需要查看IO编号的原因是它们反射(reflect)了驱动器磁头完成读和写(IO每秒,IOPS)所必须经过的实际切换,除非您正在执行大文件流传输或整个磁盘备份,它们将最准确地反射(reflect)磁盘在负载下将达到的限制。
    现代磁盘可大致维持以下功能:

  • 7.2k SATA驱动器-70-100 IOPS
  • 10k SAS驱动器-120-150 IOPS
  • 15k SAS驱动器-150-200 IOPS

  • 请注意,这些是典型驱动器的近似值,代表了在最大负载下具有不利IO模式的驱动器的饱和能力。这是为最坏的情况而设计的,除非您真正知道自己在做什么,否则您应该这样做。

    RAID包使您可以并行处理IO工作负载,并且使用适当的RAID Controller ,N驱动器RAID包将为您提供N *(1个磁盘的基本IOPS)用于读取IO。对于写入IO,RAID策略会带来损失-RAID 0没有损失,写入与读取一样快。 RAID 5每个IO要求2次读取和2次写入(读取奇偶校验,读取现有块,写入新奇偶校验,写入新块),因此其代价为4。RAID10的代价为2(每个IO 2次写入)。 RAID 6的损失为5。要确定RAID阵列中需要多少IOPS,请获取操作系统所需的基本读取IOPS编号,然后加上操作系统所需的写入IOPS编号的乘积和相关的损失因子。

    3)现在计算出可以满足您的性能需求的RAID阵列的结构
    如果您对物理基准系统的分析表明您只需要4\5 IOPS,那么您的单个驱动器可能就可以了。如果这样做,我会感到惊讶,但是却不愿兑现-获取您的数据并做出明智的决定。

    无论如何,假设您在基准练习期间测量了30个读取IOPS和20个写入IOPS,并且希望能够将这些构建系统的8个实例作为VM来支持。为此,您的磁盘子系统将需要能够为操作系统支持240个读IOPS和160个写IOPS。调整您自己的计算以适合您真正需要的系统数量。

    如果您选择RAID 10(强烈建议您这样做,则RAID 10会牺牲性能的容量,但是当您设计足够的性能时,您可以调整磁盘大小以获取所需的容量,除非您的IO模式涉及到,否则结果通常会比RAID5便宜)您的磁盘总共需要能够交付560 IOPS(读为240,写为320,以便将RAID 10的写损失因子设为2)。
    这将需要:
    -4个15k SAS驱动器
    -6个10k SAS驱动器(四舍五入,RAID 10甚至不需要驱动器)
    -8个7.2k SATA驱动器

    如果要选择RAID 5,则必须针对增加的写入损失进行调整,因此需要880 IOPS才能提供所需的性能。
    这将需要:
    -6个15k SAS驱动器
    -8个10k SAS驱动器
    -14个7.2k SATA驱动器

    这样,您将拥有更多空间,但成本将几乎增加一倍,因为您需要更多的驱动器,并且需要一个相当大的盒子来容纳这些驱动器。这就是为什么我强烈建议RAID 10(如果完全不考虑性能的原因)的原因。

    另一个选择是找到一个足够的存储来满足您的需求的优质SSD(例如Intel X-25E,而不是X-25M或任何更便宜的东西)。买两个并设置它们用于RAID 1,SSD相当不错,但是它们的故障率(即使对于X-25E这样的驱动器)目前也比旋转磁盘差,因此,除非您准备处理失效的系统,否则您希望RAID 1位于最低限度。结合良好的高端 Controller ,诸如X-25E之类的产品在现实世界中将轻松维持6k IOPS,相当于30个15k SAS驱动器。每GB容量的SSD相当昂贵,但如果使用得当,它们可以为IO密集型任务提供更具成本效益的解决方案。

    10-06 06:04