什么样的服务器让云发挥效率(1)

笔者最近在做的是虚拟化相关的一个demo,牵涉到虚拟化环境下的服务器负载均衡。我们用到一个简单的case,就是在负载出现“不平衡”的时候,进行
live
migration。由于只是demo需要,我们的负载暂时只考虑到cpu的利用率。而实际准备中,由于没有客户端的压力,很难做到CPU利用率的精确控制。这里写了个简单的脚本程序,通过自适应的调节,来达到将服务器CPU利用率控制在一定的范围内,从而为确保在某台服务器CPU过高的时候,会自动将虚拟机live
migration到其他CPU利用率低的机器上的测试做了准备。

虚拟化管理员常常面对的问题是:有多少?为了稳固地预测你的数据中心和你的预算,你总会想知道一台物理机可以合并多少台虚拟机。答案永远是不变的:视情况而定。

python实现的脚本如下,这个脚本需要5个数字参数的输入,分别为:

在物理机箱时代提出这个数当然要容易得多。当面对一个应用时,你会建议每应用一个配置,这通常比增长必要占用的能量要多。现在该空间由其它虚拟机一起共享,合适的数量依赖于机器的类型、它们的工作负载和针对RAM、存储和CPU的要求。管理复杂、多线程工作负载的日常开支也会影响到最终的数量。有了虚拟化,所有的内容都与高效利用资源有关。

从基础架构层面来看,一个有效率的云计算环境,必然也要一个有效率的服务器。而服务器的效率目前主要体现在两方面,一方面是服务器自身的工作效率,也就是利用率和执行效率。另一方面是服务器的能效,也就是能耗情况。这是大家衡量服务器效率的两个重要指标,而围绕这两个方面我们可以做很多有意思的讨论。

最低CPU利用率,最高CPU利用率,初始线程数量,每次调节的线程数量,每个线程睡眠的时间毫秒)

考虑虚拟机时,从你的处理器需要开始依然是一个不错的主意。尽管很多甚至是现今在售的最基础的机型也有多个处理器核心,这并不意味着你的服务器就需要它们。你可以根据操作系统向一台虚拟机分配四个虚拟处理器,但是同步多个物理处理器核心来服务于一个多CPU虚拟机配置的工作确实能减少日常开支。整合下降,日常开支就增长。跨处理器的交流在Windows
Server 2008 R2的虚拟机中比在Windows 2000
Server中产生的问题要少。你可以裁剪虚拟化处理器的数量来只提供给虚拟机它需要的资源。

服务器利用率是关键

当然,很大程度上,由于硬件环境的不同,这些参数带有很强的经验性。

单台服务器上可以运行的虚拟处理器数量受到实际限制。微软的Hyper-V Server
R2将在每台物理主机上支持多达512个虚拟CPU。这是个大数目,但是这并不意味着你可以不顾后果地达到该数目。不同的软件厂商对于他们的CPU要求会有不同的说法,但是最终你应该思考每个逻辑CPU上运行多少虚拟CPU,占多大比率。不像某些虚拟化平台,这不是指核心,而是核心和线程。相关的例子是大部分英特尔服务器芯片中用到的超线程HT)技术。超线程是Windows在蛤有呈全CPU核心的情况时报告8个CPU的原因。在这种情况下,你可以计算在一个时钟周期内执行两个线程的能力,因为超线程让你可以这么做。在这种情况下,你通常会加倍服务器中拥有的实际物理核心。

提升服务器的利用率,一般来说是工作效率的主要体现。原因很简单:如果一台服务器,性能再好,其利用率低下,那么这台服务器的工作效率也就很低。从成本上看,我们也希望服务器工作在满负荷状态,而不是总在空闲状态。

#!/usr/bin/python  import threading  import time  import os  import string  import sys  class ControlThread(threading.Thread):  def __init__(self):  threading.Thread.__init__(self)  self.runflag = True #线程运行标示,用于将来减少线程时能够正常结束  def run(self):  while self.runflag:  os.popen('usleep ' sys.argv[5])  #time.sleep(string.atof(sys.argv[5]))  #这里使用的是linux下shell里面的usleep,而不是python自带的sleep函数。  #相比之下,usleep还是相当强大的,而python的sleep单位为秒,虽然可以输入浮点数,
但还是相对弱了些  def stop(self):  self.runflag = False #让其正常终止循环  threadList=[]  print 'Start Thread Number:' sys.argv[3] '\tSleep Time(ms):' sys.argv[5]  #初始化一定数量的线程,否则从零开始,可能需要很长的时间才能达到指定范围  for i in range(0,string.atoi(sys.argv[3])):  thread = ControlThread()  threadList.append(thread)  thread.start()  #这里使用sar来抓取cpu利用率,这里指的是总的cpu利用率。然后通过比较,进行自适应调整  while True:  output = 100 - string.atof(os.popen('sar 1 1 | grep ^Average | awk \'
{print $8}\'').read())  print 'CPU Usage:' str(output) '\tCurrent Thread Number:' str(len(threadList))  if output < string.atoi(sys.argv[1]):#增加线程  for i in range(0,string.atoi(sys.argv[4])):  thread = ControlThread()  thread.start()  threadList.append(thread)  print " " if output > string.atoi(sys.argv[2]):#减少线程  for i in range(0,string.atoi(sys.argv[4])):   thread = threadList.pop()  thread.stop()  print "-----"  

那么你要如何评估你的CPU需求呢?一般的建议是给单台逻辑处理器分配八台用于服务器的虚拟处理器,给每台逻辑处理器分配12台用于虚拟桌面的虚拟处理器,如Windows
7虚拟机。在运行两台六核HT处理器的Hyper-V主机和运行单台虚拟处理器的服务器级虚拟机上,你可能会限制虚拟的数量在192以内。

那么如何提升服务器的利用率呢?我们需要先分析一下服务器利用率低的形成原因。首先是没有那么多的工作负载——这就牵扯到了有效投资和对服务器的了解。接着,要是工作负载过高呢,也会造成计算上的I/O拥堵,形成低利用率。以上两个问题其实是个任务调度和负载均衡的问题。而另一方面,利用率还和服务器的配置瓶颈有关。