调度算法的定义与使用价值
互联网应用和现代数据中心
云计算已经火了很多年了,早已开始惠及我们每一个人。今天火热的大数据、机器学习、人工智能、以及你们看到的几乎所有的大规模的互联网应用(淘宝、天猫、优酷等),都是运行在云上的。而支撑云的,是大型云计算服务商部署在世界各地的多个数据中心,每个数据中心都有大量的物理服务器。为了有效地管理这些服务器,我们需要集群资源管理系统(Cluster Resource Management System),后面简称资源管理系统。资源管理系统的价值,用一句话说,是Datacenter as a Computer,即让人们管理和使用数据中心,像管理和使用一个台电脑一样简单。
调度算法的价值
调度算法在是整个资源管理系统中的一个重要组成部分,简单地说,调度算法的作用是决定一个计算任务需要放在集群中的哪台机器上面。
在容器化的今天,集群中调度器的调度对象很可能是一个容器实例,Docker或者是PouchContainer。为容器选择合适的宿主机显然是一个值得考虑的问题,这里我们说一说调度算法能够帮助我们实现的价值,这些价值可以从单个容器、到应用、再到数据中心,这三个不同的层面展示出来。
1、单个容器层面:
满足容器运行的资源需求:确保每个容器在运行的时候拥有足够的资源,CPU、Memory、Disk、网络带宽等等。除了用数量衡量的资源,很多容器在运行的时候还需要一些特殊的资源,例如特定的操作系统版本、特定的硬件等等。
让容器在更“舒适”的环境下运行:容器之间可能发生资源的抢占现象,例如两个对Memory消耗很大的容器部署在同一台机器上,很容易造成Memory资源的吃紧。虽然我们可以通过容器和内核提供的资源隔离技术降低这种影响,但是最好的办法还是在一开始不让这种“容易吵架的人做邻居”。
2、应用层面,每个应用在提供服务的时候往往是多个容器实例同时支持的,调度器需要考虑应用的需求
应用的高可用:分布式环境下宿主机失败或者单个容器的失败是正常现象,因此我们要保证每个应用同时有多个实例在运行,这样即使有一个实例挂了,整个应用不会受很大影响。
应用的容灾:容灾其实也经常和高可用放在一起,如果一个应用有多个应用实例,但是都部署在一个机房,如果机房断电,那么应用也就不能提供服务了,没有高可用了。解决这个问题需要的容灾部署,也就不同维度地打散。调度算法需要尽量让同一个应用的不同实例部署在不同的宿主机、不同的机架、不同的机房、不同的数据中心、不同的城市、真是不同的国家;这种容灾甚至可以体现在更高一层,几个重要应用之间的所有实例,也要尽量打散。
很多应用因为其提供服务的特性往往需要调度器做更多的事情,例如:按照一定的顺序调度实例、将计算任务调度到离数据最近的地方,等等,这里不一一列举了。
3、数据中心层面
降低数据中心的成本:合理的调度能够节省数据中心大量的成本,如果用装箱问题来表示,就是用更少的服务器装下了更多的应用。服务器数目的减少不仅仅是采购成本的下降,服务器的占地、用电、冷却等都是一笔很大的开销,合理的资源调度能够为数据中心节省大量成本。
除了以上这些内容,实际中调度算法要考虑的内容还有很多,例如公平性的问题、应用间的干扰问题、不同应用间资源共享(互相借用)的问题、单机资源的调配问题(超线程、内存带框等)等等。例如,实际管理阿里巴巴集团在线服的资源管理系统Sigma的调度规则,就十分复杂。