# 装箱调度（Binpack）
装箱调度（Binpack）是一种优化算法，以最小化资源使用量为目标，将资源合理地分配给每个任务，使所有资源都可以实现最大化的利用价值。在集群工作负载的调度过程中使用Binpack调度策略，调度器会优先将Pod调度到资源消耗较多的节点，减少各节点空闲资源碎片，提高集群资源利用率。
#### 前提条件
- 已创建v1.19及以上版本的集群，详情请参见[购买Standard/Turbo集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0028.html)。
- 已安装Volcano插件，详情请参见[Volcano调度器](https://support.huaweicloud.com/usermanual-cce/cce_10_0193.html)。
 
#### Binpack功能介绍
Binpack调度算法的目标是最大限度地填满现有节点，尽量避免将Pod调度至空闲节点。具体实现中，调度器会对所有满足条件的节点进行打分，资源利用率越高，得分越高，调度优先级也越高。Binpack算法能够尽可能填满节点，将应用负载靠拢在部分节点，这非常有利于集群节点的自动扩缩容功能。
Binpack为Volcano调度器的多个调度插件之一，与其他调度插件协同工作，共同影响节点的最终得分。用户可自定义Binpack插件的全局权重，并分别为CPU、内存基础资源以及 GPU、NPU等扩展资源配置打分权重，从而控制Binpack在调度决策中的影响程度。在计算Binpack得分时，调度器会综合考虑Pod所请求的各类资源，并基于各资源的打分权重进行加权平均，以确定节点的最终得分。
#### Binpack算法原理
在对节点打分时，Binpack会结合插件的全局权重和各资源维度（如CPU、内存、GPU等）的权重值，计算出节点Binpack得分。节点Binpack得分的计算流程如下：
首先，对Pod请求资源中的每类资源依次打分，以CPU为例，CPU资源在待调度节点的得分信息如下：
**CPU.weight \* (request + used) / allocatable**
即CPU权重值越高，得分越高，节点资源使用量越满，得分越高。Memory、GPU等资源原理类似。其中：
- CPU.weight为用户设置的CPU权重
- request为当前Pod请求的CPU资源量
- used为当前节点已经分配使用的CPU量
- allocatable为当前节点CPU可用总量
通过Binpack策略的节点总得分如下：
**binpack.weight \* (CPU.score + Memory.score + GPU.score) / (CPU.weight+ Memory.weight+ GPU.weight) \* 100**
即binpack插件的权重值越大，得分越高，某类资源的权重越大，该资源在打分时的占比越大。其中：
- binpack.weight为用户设置的装箱调度策略权重
- CPU.score为CPU资源得分，CPU.weight为CPU权重
- Memory.score为Memory资源得分，Memory.weight为Memory权重
- GPU.score为GPU资源得分，GPU.weight为GPU权重
图1Binpack策略示例   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001720417309.png "点击放大")
如[图1]所示，假设集群中存在两个节点，分别为Node 1和Node 2，当前有一个Pod请求了CPU、内存和GPU资源。在调度Pod时，Binpack策略将对两个节点进行打分。
假设集群中CPU.weight配置为1，Memory.weight配置为1，GPU.weight配置为2，binpack.weight配置为5。
1. Binpack对Node 1的打分信息如下： 各资源按照公式计算得分，具体信息如下：
   - CPU Score：CPU.weight \* (request + used) / allocatable = 1 \* （2 + 4）/ 8 = 0.75
   
   - Memory Score：Memory.weight \* (request + used) / allocatable = 1 \* (4 + 8) / 16 = 0.75
   
   - GPU Score： GPU.weight \* (request + used) / allocatable = 2 \* （4 + 4）/ 8 = 2
   
   
   节点总得分按照**binpack.weight \* (CPU.score + Memory.score + GPU.score) / (CPU.weight+ Memory.weight+ GPU.weight) \* 100**公式进行计算，具体如下：
   假设binpack.weight配置为5，Node 1在Binpack策略下的得分：5 \* （0.75 + 0.75 + 2）/（1 + 1 + 2）\* 100 = 437.5
   
2. Binpack对Node 2的打分信息如下：
   - CPU Score：CPU.weight \* (request + used) / allocatable = 1 \* （2 + 6）/ 8 = 1
   
   - Memory Score：Memory.weight \* (request + used) / allocatable = 1 \* (4 + 8) / 16 = 0.75
   
   - GPU Score：GPU.weight \* (request + used) / allocatable = 2 \* （4 + 4）/ 8 = 2
   
   
   Node 2在Binpack策略下的得分：5 \* （1 + 0.75 + 2）/（1 + 1 + 2）\* 100 = 468.75
   
综上，Node 2得分大于Node 1，按照Binpack策略，Pod将会优先调度至Node 2。
#### 配置装箱调度策略
安装Volcano后，Binpack策略默认生效。如果默认配置无法达到您降低资源碎片的目标，可以通过"配置中心 \> 调度配置"页面自定义Binpack策略权重和各资源维度权重值，增加或降低Binpack策略在整体调度中的影响力。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧选择"配置中心"，在右侧选择"调度配置"页签。
3. 在"资源利用率优化调度"配置中，启用装箱策略 (binpack)。 
   表1装箱策略权重配置 
   | 名称    | 说明                                                        | 默认值 |
   |:---|:---|:---|
   | 装箱调度策略权重 | 增大该权重值，可提高装箱策略在整体调度中的影响力。                                | 10  |
   | CPU权重    | 增大该权重值，优先提高集群CPU利用率。                                    | 1   |
   | 内存权重    | 增大该权重值，优先提高集群Memory利用率。                                  | 1    |
   | 自定义资源类型 | 指定Pod请求的其他自定义资源类型，例如nvidia.com/gpu。增大该权重值，优先提高指定资源的利用率。 | -     |
      
   图2资源利用率优化调度   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001720393281.png "点击放大")
   
   
4. 修改完成后，单击"确认配置"。
 
