目前在做一个提高资源利用效率的项目,有一些想法想跟大家分享一下。提高资源利用效率的方法有很多。例如,在以下几个方面可以做很多工作:改进工作流程,提高员工工作效率,提高服务器资源利用率,提高软件性能。在这里,我们只关注如何提高服务器资源利用率。除非业务处于快速发展期,新增流量带来的收益远大于新服务器的成本,否则公司的财务和部门负责人都会开始关注服务器的资源使用情况。新机采购单提交给财务部后,需要论证,为什么现有服务器的利用率这么低,还需要订购服务器来支持X%的流量增长?为什么服务器的资源利用率这么低?为了清楚地解释这个问题,我们先来定义一个概念:最大可用资源利用率:最大的可用于满足业务需求的计算资源占整体计算资源的比例。此最大可用资源使用量适用于单个服务器以及整个集群。最重要的一点是这个值远小于100%,一般服务器/集群的资源使用率远低于最大可用资源使用率。可用资源的利用率主要受以下两个因素限制:冗余策略这是第一个硬指标,假设你的冗余策略是N+X,那么你业务可用的最大可用资源利用率:N/(N+X)。以N+1为例,这样可以让你的业务有一个最好的集群挂掉而不影响服务。理想情况下,您的每个集群大小相同,并且任何一个挂起的损失都是相同的。如果N=3,那么你的最大可用资源利用率就是3/(3+1)=75%。请注意,此值假设您的每个集群大小相同,但实际情况通常并非如此,因此您的最大可用资源使用率将低于75%!随着N的增加,最大可用资源利用率也会增加,如果N=7,那么你的最大可用资源利用率就是7/(7+1)=87.5%。但是当N变得非常大时,最大可用资源利用所带来的收益会因为运维成本的增加而大大降低。响应时间是第二个硬指标。响应时间会影响冗余策略的制定,这里先不讨论,以后有机会再详细介绍。响应时间的大小将极大地限制可用资源的利用。为什么?在相同流量的情况下,根据排队论,不同的响应时间和服务队列(对应CPU,或者机器)对应不同的最大资源使用量。Utilizationcurve假设你的业务是由一个程序提供的,这个程序的每个副本需要16个CPU。根据排队论,为了在规定时间内完成业务请求,最大资源使用率约为81%。除了冗余策略,仍然以之前的N+1,N=3为例,本次业务的最大可用资源利用率为75%*81%=61%。最大可用资源利用率只是理论上的上限。事实上,业务所能达到的资源利用率还受到很多其他因素的影响,导致其最终的利用率远低于这个理论值。软件性能问题软件代码编写质量差、参数设置不合理都会影响资源利用率,以至于业务必须保持较低的资源利用率才能在预定的响应时间内返回结果。组件之间的资源使用差异在上面已经提到了。根据排队论对性能的影响,不同的组件副本使用不同的CPU数量,导致不同组件的最大可用资源使用率不同,从而进一步降低了整体资源使用率。.备用机资源为了应对临时的机器维护和突发的业务需求,业务会额外增加备用机。这些备份机一般都放在业务线自己的池子里,这样会进一步降低整体的资源占用。资源利用率计算方法不同的资源利用率计算方法将向外界呈现不同的资源利用率。历史平均利用率和百分位数利用率是两个完全不同的结果。如何提高服务器的资源利用率?前面提到,对于一个N+1,N=3的业务,理论上最大可用资源利用率只能达到61%,而在实践中远小于61%。达到40%已经很不错了,那么如何从技术上提高资源利用率,使其更接近理论上限呢?实现简单易行:多线程更好地利用多核机器根据排队论,增加单个程序副本的CPU数量可以有效提高资源利用率。4CPUvs.16CPU,但是当线程过多时会带来争用等问题,NUMA架构带来的远程内存访问会影响资源使用的提升。这里需要取舍,不能盲目增加CPU数和线程数。在同一台服务器上运行多个应用由于一个程序无法最大化利用一台服务器的资源,我们可以在其上放置多个不同的程序,通过共享来提高资源利用率。这种方法非常有效,但也有其自身的问题,我们将在后面讨论。增加响应时间随着资源使用量的增加,应用程序的响应时间会变长。如果在满足现有业务需求的同时响应时间不是太快,可以考虑增加响应时间以获得更快的响应时间。高资源使用率。当然这种方法在实际操作中很少用到,因为增加响应时间很容易,但是要减少就非常非常难了!实现复杂难:资源分层实际上是通过共享资源来提高利用率,不同而不是直接在某台服务器上运行多个程序,资源分层后,可以针对不同的层级提供不同的服务质量保障,比如保证资源的使用率高优先级的程序,低优先级的程序在资源不足时可以等待。资源超卖即使通过资源分层提高利用率,同一台服务器上同时运行的不同高优先级程序也不会同时处理峰值流量。使用此功能,可以超卖计算资源以进一步提高资源利用率。举个简单的例子:服务器S有48个CPU,3个程序在这台服务器上运行,分别请求24、16和8个CPU,但是由于高峰流量不是同时处理,所以服务器的CPU占用率在任何时候时间如果没有超过32个CPU,那么如果资源超卖,剩下的16个CPU会被转售。哪些问题和挑战会提高资源利用率?提高资源利用率有很多好处,但任何事情都有两个方面,随之而来的问题和挑战也很多。装箱问题(binpacking)当有许多不同大小的应用程序运行在一组服务器上时,装箱问题会减少资源的使用。例如,100个应用程序总共需要1,000个CPU。理论上只需要209台48核服务器,但实际由于打包问题需要250台服务器。因此,解决打包问题是一个与资源共享相关的技术问题。隔离问题(badneighbors)不同的应用有不同的特点,有的是IO密集型的,有的是CPU密集型的,有的需要高延迟,有的只关心吞吐量。这些不同的应用程序运行在同一台服务器上。避免相互影响,尤其是在机器的资源使用率很高的情况下。如何减少彼此的影响也是一个难题。因为如果不能很好的隔离影响,应用会选择要么单独运行,要么申请更多的资源,导致资源占用率低。计费问题(resourceaccounting)计费问题只存在于超卖的资源上,因为超卖的资源只能提供较低的服务质量保证,所以价格肯定会更便宜,但还是需要准确计量。如何衡量提高资源利用率的成功与否?第一,必须保证业务的稳定性和可靠性不能降低;第二,带来的收益必须大于成本;它必须是一个长期的过程,而不是一个短期的过程。权衡收益和成本,也许增加X%的资源使用会增加YY毫秒的请求延迟,由此带来的收益损失可能远大于增加X%带来的收益。还有就是利用率的提升可能会伴随着运维成本的激增,这需要衡量,然后权衡。结语提高服务器资源利用率是一个跨越部门和技术边界的问题:首先要保证的是将对业务的影响降到最低,通过准确衡量系统对应用程序的资源使用情况,利用底层基础设施来降低对业务的影响。实现资源共享和最小化隔离问题,最大限度地利用现有的计算资源。
