CCE云原生混部场景下在线任务抢占、压制离线任务CPU资源、保障在线任务服务质量效果测试

举报
可以交个朋友 发表于 2024/05/06 15:22:30 2024/05/06
【摘要】 CCE云原生混部场景下在线任务抢占、压制离线任务CPU资源、保障在线任务服务质量效果测试

背景

企业的 IT 环境通常运行两大类进程,一类是在线服务,一类是离线作业。
在线任务:运行时间长,服务流量及资源利用率有潮汐特征,时延敏感,对服务SLA 要求高,如电商交易服务等。
离线任务:运行时间分区间,运行期间资源利用率较高,时延不敏感,容错率高,中断一般允许重运行,如大数据处理等。

混部主要的形式是通过将在线和离线任务部署在相同节点的方式来提高资源利用率,比如某节点之前部署3个高服务SLA的在线任务,现在混合部署3个在线任务和3个离线任务,离线服务把在线服务各个时段的空闲资源利用起来而不影响在线服务的服务质量。

在容器混部层面主要涉及: 1)调度层面实现节点调度资源超分,在、离线任务混合调度到相同节点; 2)CPU层面实现在线任务抢占、压制离线任务;3)内存层面本文不做介绍。通过混部技术CPU部分能力,可以实现在运行过程中,系统会根据在、离线任务资源使用情况,自动完成在线“抢占”、“压制”离线任务资源以保障在线资源的资源诉求。以一台4核机器为例:

  • 当在线任务需要3核CPU资源,那么需要系统“压制”离线任务最多只能使用1核CPU资源;
  • 在线任务当时处于业务低峰,仅使用1核CPU资源,离线任务可以短期使用剩余CPU资源;当在线任务业务上涨时,系统保障在线业务可以“抢占”离线业务CPU资源;

环境准备

环境要求

集群版本

  • v1.19集群:v1.19.16-r4及以上版本
  • v1.21集群:v1.21.7-r0及以上版本
  • v1.23集群:v1.23.5-r0及以上版本
  • v1.25及以上版本

集群类型:CCE Standard集群或CCE Turbo集群。
节点OS:EulerOS 2.9 (内核kernel-4.18.0-147.5.1.6.h729.6.eulerosv2r9.x86_64)或者Huawei Cloud EulerOS 2.0
节点类型:弹性虚拟机。
Volcano插件版本:1.7.0及以上版本。

环境信息

CCE集群部署kube-prometheus-stack、grafana和volcano插件
image.png
image.png
image.png

CPU压制、抢占演示

压测基线

  1. 创建演示需要的工作负载,且保证两个工作负载调度至同一节点(由于dashboard中普罗表达式与pod名称关联,建议不要工作负载名称,否则影响dashboard正常显示)
    kind: Deployment 
    apiVersion: apps/v1 
    metadata: 
      name: redis        
    spec: 
      replicas: 1 
      selector: 
        matchLabels: 
          app: redis 
      template: 
        metadata: 
          creationTimestamp: null 
          labels: 
            app: redis 
          annotations: 
            prometheus.io/path: /metrics 
            prometheus.io/port: '9121' 
            prometheus.io/scrape: 'true' 
        spec: 
          containers: 
            - name: container-1 
              image: swr.cn-north-4.myhuaweicloud.com/testapp/redis:v6 
              resources: 
                limits: 
                  cpu: '1' 
                requests: 
                  cpu: 250m 
            - name: container-2 
              image: bitnami/redis-exporter:latest 
              resources: 
                limits: 
                  cpu: 250m 
                  memory: 512Mi 
                requests: 
                  cpu: 250m 
                  memory: 512Mi 
          imagePullSecrets: 
            - name: default-secret 
          schedulerName: volcano 
    --- 
    kind: Deployment 
    apiVersion: apps/v1 
    metadata: 
      name: stress 
    spec: 
      replicas: 1 
      selector: 
        matchLabels: 
          app: stress 
      template: 
        metadata: 
          labels: 
            app: stress 
        spec: 
          containers: 
            - name: container-1 
              image: swr.cn-north-4.myhuaweicloud.com/testapp/centos-stress:v1 
              command: 
                - /bin/bash 
              args: 
                - '-c' 
                - while true; do echo hello; sleep 10; done 
              resources: 
                limits: 
                  cpu: '4' 
                  memory: 4Gi 
                requests: 
                  cpu: 2500m 
                  memory: 1Gi 
          imagePullSecrets: 
            - name: default-secret 
          schedulerName: volcano
          affinity: 
            podAffinity: 
              requiredDuringSchedulingIgnoredDuringExecution: 
                - labelSelector: 
                    matchExpressions: 
                      - key: app 
                        operator: In 
                        values: 
                          - redis 
                  namespaces: 
                    - default 
                  topologyKey: kubernetes.io/hostname
    
  2. 使用redis-benchmark命令压测redis;192.168.1.159为redis的Pod ip
    ./redis-benchmark -h 192.168.1.159 -p 6379 -n 3000000 -c 100 –q -t SET,INCR,LPUSH,LPOP,RPOP,SADD,HSET,SPOP,ZADD,ZPOPMIN
    
  3. 在grafana页面观察redis指标和cpu使用率,可以作为在无干扰情况下的基线参考数据
    image.png

非混部场景

  1. 创建节点池用作混合部署,同时重新部署以上工作负载,使其调度至新节点
  2. 再次使用redis-benchmark命令压测redis;192.168.1.172为redis的Pod ip
    ./redis-benchmark -h 192.168.1.172 -p 6379 -n 3000000 -c 100 –q -t SET,INCR,LPUSH,LPOP,RPOP,SADD,HSET,SPOP,ZADD,ZPOPMIN
    
  3. 进入stress容器内,待redis指标达到基线且平稳后,执行命令提升CPU使用率
    stress-ng -c 4 -t 3600
    
  4. 在grafana页面观察redis指标和cpu使用率,发现stress容器压测过程中,redis的性能数据急速退化
    image.png

混部场景

  1. 更新节点池,在高级配置中为节点配置混部标签:volcano.sh/colocation="true"
    image.png
  2. 点击节点池的配置管理-kubelet组件配置-开启节点混部特性
    image.png
  3. 修改节点的驱逐阈值,将阈值修改为100,避免在压测stress时cpu使用率超过阈值被直接驱逐
    kubectl annotate node 192.168.0.209 volcano.sh/evicting-cpu-high-watermark=100
    
  4. 修改stress工作负载的注解,将stress标记为离线业务,redis工作负载不用修改
    kind: Deployment 
    apiVersion: apps/v1 
    metadata: 
      name: stress 
    spec: 
      replicas: 1 
      selector: 
        matchLabels: 
          app: stress 
      template: 
        metadata: 
          labels: 
            app: stress 
          annotations:          
            volcano.sh/qos-level: "-1"       # 离线作业注解 
        spec: 
          containers: 
            - name: container-1 
              image: swr.cn-north-4.myhuaweicloud.com/testapp/centos-stress:v1 
              command: 
                - /bin/bash 
              args: 
                - '-c' 
                - while true; do echo hello; sleep 10; done 
              resources: 
                limits: 
                  cpu: '4' 
                  memory: 4Gi 
                requests: 
                  cpu: 2500m 
                  memory: 1Gi 
          imagePullSecrets: 
            - name: default-secret 
          schedulerName: volcano
          affinity: 
            podAffinity: 
              requiredDuringSchedulingIgnoredDuringExecution: 
                - labelSelector: 
                    matchExpressions: 
                      - key: app 
                        operator: In 
                        values: 
                          - redis 
                  namespaces: 
                    - default 
                  topologyKey: kubernetes.io/hostname
    
  5. 登录到stress容器所在节点,查看离线配置是否生效,-1即为生效。其中5f68**ff91为pod的uid
    [root@test-colocation-nodepool-36046-7d6l9 ~]# cat /sys/fs/cgroup/cpu/kubepods/burstable/pod5f68455d-3ed2-47fc-b2bc-25faccedff91/cpu.qos_level 
    -1
    
  6. 使用redis-benchmark命令压测redis;192.168.1.172为redis的Pod ip
    ./redis-benchmark -h 192.168.1.172 -p 6379 -n 3000000 -c 100 –q -t SET,INCR,LPUSH,LPOP,RPOP,SADD,HSET,SPOP,ZADD,ZPOPMIN
    
  7. 进入stress容器内,待redis指标达到基线且平稳后,执行命令提升CPU使用率
    stress-ng -c 4 -t 3600
    
  8. 在grafana页面观察redis指标和cpu使用率,在混合场景下,即使离线任务在尝试打爆节点CPU,操作系统依然维持在线任务CPU诉求,保障了在线任务的服务质量
    image.png
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。