离在线混部
一、基础概念
在线服务(Online Service)
在线服务通常指需要实时响应用户请求的应用程序,例如Web应用、API服务、微服务等。
- 要求:高可用性、低延迟和高吞吐量。
- 资源使用特点:资源使用通常是动态变化的,需要根据负载进行弹性扩缩。
离线任务(Offline Task)
离线任务通常指不需要实时响应的任务,例如数据分析、批量处理、机器学习模型训练、日志处理等。
- 资源使用特点:资源使用通常是周期性的,且对延迟和响应时间的要求较低。运行时间可能较长,但对资源的占用通常是可预测的。
资源调度与分配(Resource Scheduling and Allocation)
在离在线混部场景中,资源调度需要考虑以下几点:
- 在线服务的稳定性:确保在线服务始终有足够的资源。
- 离线任务的资源利用率:充分利用空闲资源运行离线任务。
- 动态调整:根据负载变化动态调整资源分配。
弹性扩缩(Elastic Scaling)
在线服务通常需要根据负载动态扩缩资源,而离线任务的资源需求通常是可预测的。弹性扩缩的关键在于如何平衡在线服务的扩缩需求和离线任务的资源占用。
在线服务与离线任务混部
- 在线服务:需要实时响应用户请求,对延迟和可用性要求较高(例如Web应用、API服务)。
- 离线任务:不需要实时响应,通常以批处理或长时间运行任务为主(例如数据分析、机器学习训练、日志处理)。
- 特点:在线服务需要优先级和资源隔离,离线任务则需要充分利用空闲资源。
绑核
将进程或线程固定到特定的CPU核心上,这样可以减少上下文切换,提高缓存利用率,从而提升性能。在离在线混部中,绑核是将最重要的在线业务(例如redis)固定绑定某几个CPU内核上。
二、混部的技术和原理
2.1 离线、在线应用分级
整体分级
- 在线:延迟敏感型的服务,分3类:exclusive、reserved、shared三种类型
- 离线:资源消耗型的任务,只1类:none一种类型
以上分级详细介绍
类型 | 排它(特指离线) | 支持共享(特指离线) | 是否绑核(特指CPU) | 是否独占(特指CPU) | 备注说明 |
---|---|---|---|---|---|
exclusive | 离线不可用 | 不支持 | 绑核 | 独占 | 排它独占,仅自己能用 |
reserved | 离线可用 | 支持 | 允许绑核 | 独占 | 不排它独占,自己和离线可用、其它在线不可用 |
shared | 离线可用 | 支持 | 不绑核 | 不独占 | 不排它共享,自己和其它在线shared、离线均可用 |
none | 离线可用 | 支持 | 不绑核 | 不独占 | 不排它共享,离线使用,与reserved、shared共用 |
2.2 离在线混部的策略
除去最高等级重要的业务(exclusive)所在的CPU核,其余CPU核使用未达到水位线(例如70%),均可以使用该CPU核直到达到水位线。
2.3 压制离线任务
- 当在线业务使用CPU增长,离线业务和在线业务整体使用CPU会超过压制水位(例如70%),离线业务会被压制,但是会保证离线业务的一定CPU使用,防止直接挂掉。
- 当在线业务使用CPU持续增长,离线业务和在线业务整体使用CPU会超过驱逐水位(例如90%),离线业务会被驱逐到其他节点。
- 当整体资源都不足时,优先保证在线业务,此时是集群管理者的失职,理论上不应该让集群出现这种情况。
2.4 进一步限制
- 内存方面:正常情况下在内存紧张时,会优先选择消耗内存较多的pod进行内存回收,甚至回收失败的情况下直接OOM。这对于核心业务来说,会造成很大的影响。为此希望核心业务内存不被回收。因此在进行OOM操作时,会首先判定POD优先级,优先选择离线POD进程进行OOM操作。
- 网络方面:在线业务对网络性能要求高,而离线业务对网络带宽占用大且性能要求不高,如果两种业务在一起运行而不做控制,突发的离线流量很可能影响在线业务,所以对离线业务Pod网络带宽进行限制,例如对pod划分网络等级并进行限速。
- 其他资源:例如对GPU、内存、硬盘资源等做进一步限制。