我们一直在尝试使用虚拟机来构建服务器。我们的构建服务器都运行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社区。
任何帮助将不胜感激。
最佳答案
磁盘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)磁盘在负载下将达到的限制。
现代磁盘可大致维持以下功能:
请注意,这些是典型驱动器的近似值,代表了在最大负载下具有不利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密集型任务提供更具成本效益的解决方案。