# 基于Pod实例画像的资源超卖
Volcano新增基于Pod实例画像的超卖量算法。该算法持续采集并累积节点上Pod的CPU和内存利用率，统计Pod资源用量的概率分布特征，进而计算出节点资源用量的概率分布特征，从而在一定的置信度下给出节点资源用量的评估值。基于Pod实例画像的超卖量算法会同时考虑节点资源使用的整体水位和起伏变化，计算出相对稳定的超卖量，减少资源竞争几率，避免业务波动导致Pod频繁驱逐。
相比于直接利用节点实时CPU内存利用率的算法，基于Pod实例画像的算法能够避免超卖量波动大，对突发资源尖峰覆盖不足的问题，在保障业务性能相对稳定的前提下超卖资源。
#### 工作原理
基于Pod实例画像的资源超卖由Volcano agent和Volcano scheduler配合完成。开启该能力后，Volcano agent会周期性采集节点上Pod的CPU和内存利用率，计算每个Pod的CPU和内存用量均值、峰值和标准差，并基于Pod的这些统计特征值，进一步计算节点的CPU和内存用量评估值。
超卖量的计算算法：**节点资源超卖量 = (节点资源分配量 - 节点资源用量评估值) \* 超卖比例**
超卖量会周期性更新到节点的annotation中，以便Volcano scheduler基于各个节点的超卖量进行Pod调度。
#### 前提条件
已启用动态资源超卖。具体操作请参见[动态资源超卖](https://support.huaweicloud.com/usermanual-cce/cce_10_0384.html)。
#### 使用方法
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"节点管理"，在需要开启动态资源超卖的节点池中，单击"更多 \> 混部配置"。 
   确认"节点池混部开关"及"资源超卖"开关已打开，详情请参见[云原生混部配置](https://support.huaweicloud.com/usermanual-cce/cce_10_0708.html#cce_10_0708__section19689248184019)。
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002044187234.png "点击放大")
   
   
3. 在左侧导航栏中选择"配置中心"，在上方的标签中选择"调度配置"，在"设置集群默认调度器"配置中选择"Volcano 调度器"，并单击"专家模式"右侧的"开始使用"，进入专家模式配置页面。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002080146593.png "点击放大")
   
   
4. 进入CCE专家模式配置页面，配置以下两个选项： 
   
   | 配置项                     | 说明                                                                                                                                                         |
   |:---|:---|
   | overSubscriptionMethod | 超卖量计算方法，目前支持nodeResource和podProfile。nodeResource为默认的基于节点资源用量的算法，podProfile为基于Pod实例画像的算法。                                                                   |
   | profilePeriod          | Pod实例画像的周期，单位为秒，支持范围是60-2592000，即1分钟到1个月。对于指标采集累积时长未达到周期的Pod，将使用Pod资源请求量来计算节点的资源用量。 因此，初始启用基于Pod实例画像的算法，未达到画像周期之前，节点的超卖量会为0。 |
      
   
   
 
#### 使用示例
**使用基于Pod实例画像的资源超卖前**
1. 确认专家模式中，oversubscription_method配置项的值为"nodeResource"，这表明当前集群采用的为默认的基于节点资源用量的算法。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002080182277.png "点击放大")
   
   
2. 通过CCE控制台，创建一个redis工作负载作为示例，并绑定一个"节点访问"类型的服务。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002080100881.png "点击放大")
   
   
3. 通过以下命令，对刚发放的Redis服务施加负载，模拟业务负载变化的场景。
   
   ```
   ./redis-benchmark -h <node_ip> -p 32293 -t set,get -n 3000000 -q
   sleep 30
   ./redis-benchmark -h <node_ip> -p 32293 -t set,get -n 2000000 -q
   sleep 20
   ./redis-benchmark -h <node_ip> -p 32293 -t set,get -n 2500000 -q
   ```
   请将上述脚本中的*\<node_ip\>*替换成集群中节点的实际IP，另外32293端口则为上一步服务详情中查询到的节点端口。
   
   
4. 通过以下命令，可以查询节点当前的超卖资源量并持续观察其变化。 
   ```
   kubectl describe node 192.168.98.230
   ```
   回显如下：
   ```
   Name:               192.168.98.230
   Roles:              <none>
   Labels:             ...
                       volcano.sh/colocation=true
                       volcano.sh/oversubscription=true
   Annotations:        ...
                       volcano.sh/oversubscription-cpu: 1103
                       volcano.sh/oversubscription-memory: 1076471825
                       ...
   CreationTimestamp:  Fri, 20 Sep 2024 16:12:33 +0800
   ...
   ```
   
   
5. 以下是根据Redis负载施加前后一段时间查询的CPU超卖量绘制的图表，可以看到在Redis负载暂停的阶段，CPU超卖量会有一个增长，但在负载重新启动后，CPU超卖量会立即减少。如果在增长的时刻节点调度了其他Pod进来，当负载重新启动后，节点就可能发生CPU争抢，导致Pod驱逐。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002044026586.png "点击放大")
   
   
**使用基于Pod实例画像的资源超卖后**
1. 重新进入专家模式配置页面，将oversubscription_method配置项设置为"podProfile"，将oversubscription_profile_period配置项设置为"60"。出于快速演示的考虑，这里将画像周期设置为60秒，实际使用时请根据业务的特点选择合适的画像周期，以覆盖业务完整的资源使用规律周期。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002080145805.png "点击放大")
   
   
2. 等待大约2分钟让Volcano agent完成配置切换和画像数据的积累，然后重新运行[3]中的施加负载命令，通过查询的超卖资源量，可以再次绘制CPU超卖量图表。
   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002044028874.png "点击放大")
   可以看到，在整个脚本运行过程中，基于Pod实例画像的算法会将Pod资源用量的波动也考虑进去，计算出一个平稳的超卖量，避免Pod资源用量波动导致的资源竞争和Pod驱逐。
   
   
 
