Koordinator 最佳实践系列:精细化 CPU 编排

news2024/11/15 13:23:17

作者:乔普、申信

介绍

在云原生环境中,集群提供者常常将不同类型的工作负载部署在同一个集群中,利用不同业务的不同峰值效果,实现资源分时复用,避免资源浪费。然而,不同类型负载之间混合部署常常会导致资源竞争和相互干扰。最为典型的场景便是在线和离线负载的混合部署。当离线较多的占用计算资源时,在线负载的响应时间就会受到影响;当在线长时间较多的占用计算资源时,离线负载的任务完成时间不能得到保证。这种现象属于 Noisy Neighbor 问题。

根据混合部署的程度、资源类型的不同,解决该问题有许多不同的思路。Quota 管理可从整个集群维度限制负载的资源使用量,Koordinator 在这方面提供了多层次弹性 Quota 管理功能 [ 1] 。单机维度上看,CPU、内存、磁盘 IO,网络资源都有可能被不同负载共享。Koordinator 在 CPU、内存上已经提供了一些资源隔离和保障的能力,磁盘 IO 和网络资源方面的相关能力正在建设中。

本文主要介绍当不同类型工作负载混合部署在同一个节点上时,Koordinator 如何帮助负载之间(在线和在线、在线和离线)协同地共享 CPU 资源。

问题描述

CPU 资源 Noisy Neighbor 的本质是不同的负载之间无协同地共享 CPU 资源。

  1. Kubernetes 默认的资源模型利用 cgroup(cfs quota) 从 CPU 时间使用量上来限制不同负载对于 CPU 资源的访问。这种情况下,一些负载就可能会被操作系统调度器切换所在的 CPU 核。由于不同 CPU 核对不同物理位置的内存访问时间不同,切换大概率会导致更长的内存访问时间,从而影响负载性能。
  2. 在 NUMA 架构中,SMT 线程(逻辑核)共享物理核的执行单元和 L2 缓存。当同一个物理核中有多种工作负载时,不同工作负载间就会产生资源争抢,导致负载性能下降。

Kubernetes 在单机侧提供了拓扑管理器和 CPU 管理器来尝试解决上述问题。然而,该功能只有在 Pod 已经调度到机器上之后才会尝试生效。这样就有可能导致 Pod 会被调度到 CPU 资源满足但是 CPU 拓扑不满足负载要求的情况。

解决方案

面向应用的 CPU 编排 QoS 语义

针对上述问题和不足,Koordinator 设计了面向应用的 QoS 语义和 CPU 编排协议,如下图所示。

在这里插入图片描述

LS(Latency Sensitive)应用于典型的微服务负载,Koordinator 将其与其它的延迟敏感型负载隔离保障其性能。LSR(Latency Sensitive Reserved)类似于 Kubernetes 的 Guaranteed,在 LS 的基础上增加了应用要求预留绑核的语义。LSE(Latency Sensitive Exclusive)则常见于中间件等对 CPU 特别敏感的应用,Koordinator 除了满足其类似于 LSR 要求绑核的语义外,还确保其所被分配的 CPU 不与任何其它负载共享。

另外,为提高资源利用率,BE 负载可与 LSR 和 LS 共享CPU。为了确保与 BE 共享的延迟敏感型应用不受其干扰,Koordinator 提供了如干扰检测、BE 压制等策略。本文重点不在此,读者可关注后续文章。

丰富的 CPU 编排策略

对于 LSE 类型的应用,当机器是超线程架构时,只能保证负载独占逻辑核。这样当同一个物理核中有其它负载时,应用性能仍会受干扰。为此,Koordinator 支持用户在 Pod Annotation 上配置丰富的 CPU 编排策略来提高性能。

CPU 编排策略分为 CPU 绑定策略和 CPU 独占策略。CPU 绑定策略决定应用所被分配逻辑核在物理核间的分布,可采用物理核间打散或者堆叠。堆叠(FullPCPU)的方式指为应用分配完整的物理内核,可以有效地缓解 Noisy Neighbor 问题。打散(SpreadByPCPU)则主要应用于一些具有多种不同峰谷特性的延迟敏感型应用,可以让应用程序在特定时间充分使用 CPU。CPU 独占策略决定应用所被分配逻辑核的独占级别,可尽量避开已经同独占策略申请的物理核或 NUMANode。

增强的 CPU 调度能力

Koordinator 支持配置 NUMA 的分配策略,决定在调度时如何选择满意的 NUMA 节点。MostAllocated 表示从可用资源最少的 NUMA 节点分配,可以尽可能减少碎片,为后续的负载留下更大的分配空间。但是,这种方式可能会导致依赖 Barrier 的并行代码性能收到影响。DistributeEvenly 表示在 NUMA 节点上平均分配 CPU,可以提高上述并行代码的性能。LeastAllocated 表示从可用资源最多的 NUMA 节点分配。

另外,Koordinator 对 CPU 的分配逻辑是在中心调度器完成的。这样就会有一个全局的视角,避免了 Kubernetes 单机方案可能导致的 CPU 资源量满足但是拓扑不满足的窘境。

最佳实践

由上文可知,Koordinator 精细化 CPU 编排能力能够显著提高多应用混合部署场景下 CPU 敏感型工作负载的性能。为了让读者能够更清楚地使用和直观感受 Koordinator 的精细化 CPU 编排能力,本文将在线应用采用不同方式部署到集群中,观察压测中服务的延迟,来判断 CPU 编排能力的效果。

本文会在同一个机器上部署多个在线应用,压测 10 分钟,以充分模拟生产实践中可能出现的 CPU 核切换场景。对于在线应用和离线应用混合部署的情况,Koordinator 提供了如干扰检测、BE 压制等策略。本文重点不在此,读者可关注后续文章中的实践。

在这里插入图片描述

本次实验采用以下指标,评估应用不同部署方式下 Nginx 应用的性能表现:

  • 响应时间 RT(Response Time)分位值RT 是在线应用通常关注的性能指标,RT 越低代表在线服务性能越好。RT 指标通过收集 wrk 压测结束后打印的信息获得,在实验中反映了 Nginx 应用响应 wrk 请求所花费的时间。例如 RT-p50 表示 Nginx 响应前 50% wrk 请求最大所花费的时间(中位数),RT-p90 表示 Nginx 响应前 90% wrk 请求最大所花费的时间。
  • 每秒请求数 RPS(Request Per Second)RPS 是在线应用每秒服务的请求数量,服务承受的 RPS 越多代表在线服务的性能越好。

实验结果如下:

在这里插入图片描述

  • 对比 B 和 A,可以发现采用 LSE QoS 绑核之后,服务响应时间 P99 明显减小,很好地减轻了长尾现象
  • 对比 C 和 B,可以发现采用 LSR QoS 绑核且允许逻辑核占用更多物理核资源之后,在服务响应时间更好的情况下可以承受更多的请求

综上,在线服务部署在同一机器的场景下,采用 koordinator 精细化 CPU 编排能够有效抑制 Noisy Neighbor 问题,减少 CPU 核切换带来的性能下降。

环境

首先,要先准备一个 Kubernetes 集群并安装 Koordinator [ 2] 。本文选择一个 Kubernetes 集群的两个节点来做实验,其中一个节点作为测试机,将运行 Nginx 在线服务器;另一节点作为压测机,将运行客户端的 wrk,向 Nginx 请求 Web 服务,制造压测请求。

在线应用

  1. 使用 ColocationProfile [ 3] 为应用注入精细化 CPU 编排协议

B 组精细化 CPU 编排协议:

apiVersion: config.koordinator.sh/v1alpha1
kind: ClusterColocationProfile
metadata:
  name: colocation-profile-example
spec:
  selector:
    matchLabels:
      app: nginx
  # 采用 LSE QoS
  qosClass: LSE
  annotations:
  # 采用物理核间堆叠
    scheduling.koordinator.sh/resource-spec: '{"preferredCPUBindPolicy":"FullPCPUs"}'
  priorityClassName: koord-prod

C 组 CPU 精细化编排协议:

apiVersion: config.koordinator.sh/v1alpha1
kind: ClusterColocationProfile
metadata:
  name: colocation-profile-example
spec:
  selector:
    matchLabels:
      app: nginx
  # 采用 LSR QoS
  qosClass: LSR
  annotations:
  # 采用物理核间打散且独占物理核
    scheduling.koordinator.sh/resource-spec: '{"preferredCPUBindPolicy":"SpreadByPCPUs", "preferredCPUExclusivePolicy":"PCPULevel"}'
  priorityClassName: koord-prod
  1. 在线服务本文选用 Nginx 在线服务器,Pod YAML 如下:
---
# nginx应用配置
apiVersion: v1
data:
  config: |-
    user  nginx;
    worker_processes  4; # Nginx的Worker个数,影响Nginx Server的并发。

    events {
        worker_connections  1024;  # 默认值为1024。
    }

    http {
        server {
            listen  8000;

            gzip off;
            gzip_min_length 32;
            gzip_http_version 1.0;
            gzip_comp_level 3;
            gzip_types *;
        }
    }

    #daemon off;
kind: ConfigMap
metadata:
  name: nginx-conf-0
---
# Nginx实例,作为在线类型服务应用。
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: nginx
  name: nginx-0
  namespace: default
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/hostname
            operator: In
            values:
            - "${node_name}"    
  schedulerName: koord-scheduler
  priorityClassName: koord-prod
  containers:
    - image: 'koordinatorsh/nginx:v1.18-koord-exmaple'
      imagePullPolicy: IfNotPresent
      name: nginx
      ports:
        - containerPort: 8000
          hostPort: 8000 # 压测请求访问的端口。
          protocol: TCP
      resources:
        limits:
          cpu: '4'
          memory: 8Gi
        requests:
          cpu: '4'
          memory: 8Gi
      volumeMounts:
        - mountPath: /apps/nginx/conf
          name: config
  hostNetwork: true
  restartPolicy: Never
  volumes:
    - configMap:
        items:
          - key: config
            path: nginx.conf
        name: nginx-conf-0
      name: config
  1. 执行以下命令,部署 Nginx 应用
kubectl apply -f nginx-0.yaml
  1. 执行以下命令,查看 Nginx 应用的 Pod 状态
kubectl get pod -l app=nginx -o wide

可以看到输出如下,表示 Nginx 应用已经在测试机上正常运行

NAME      READY   STATUS    RESTARTS   AGE     IP           NODE                    NOMINATED NODE   READINESS GATES
nginx-0   1/1     Running   0          2m46s   10.0.0.246   cn-beijing.10.0.0.246   <none>           <none>
  1. 在压测机上,执行以下命令,部署压测工具 wrk
wget -O wrk-4.2.0.tar.gz https://github.com/wg/wrk/archive/refs/tags/4.2.0.tar.gz && tar -xvf wrk-4.2.0.tar.gz
cd wrk-4.2.0 && make && chmod +x ./wrk

压测

  1. 使用压测工具 wrk,向 Nginx 应用发起压测请求。
# node_ip填写测试机的IP地址,用于wrk向测试机发起压测;8000是Nginx暴露到测试机的端口。
taskset -c 32-45 ./wrk -t120 -c400 -d600s --latency http://${node_ip}:8000/
  1. 等待 wrk 运行结束后,获取 wrk 的压测结果,wrk 输出格式如下所示。重复多次测试,以获得相对稳定的结果。
Running 10m test @ http://192.168.0.186:8000/
  120 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     3.29ms    2.49ms 352.52ms   91.07%
    Req/Sec     0.96k   321.04     3.28k    62.00%
  Latency Distribution
     50%    2.60ms
     75%    3.94ms
     90%    5.55ms
     99%   12.40ms
  68800242 requests in 10.00m, 54.46GB read
Requests/sec: 114648.19
Transfer/sec:     92.93MB

总结

在 Kubernetes 集群中,不同业务负载之间可能存在 CPU、内存等资源的争抢,影响业务的性能和稳定性。面对 Noisy Neighbor 现象,用户可以使用 Koordinator 为应用配置更精细的 CPU 编排策略,使得不同应用可以协同的共享 CPU 资源。我们通过实验说明,Koordinator 的精细化 CPU 编排能力能有效抑制 CPU 资源的争抢,改善应用性能。

非常欢迎你通过 Github/Slack/钉钉/微信 等方式加入我们来参与 Koordinator 开源社区。你是否已经有一些希望与我们社区交流的内容呢?可以通过以下渠道参与讨论:

  • 加入社区 Slack channel (English)
  • 加入社区钉钉群:搜索群号 33383887 (Chinese)

相关链接:

[1] 多层次弹性 Quota 管理功能

https://koordinator.sh/docs/user-manuals/multi-hierarchy-elastic-quota-management/

[2] 安装 Koordinator

https://koordinator.sh/docs/installation/

[3] ColocationProfile

https://koordinator.sh/docs/user-manuals/colocation-profile/

点击此处,立即了解 Koordinator 项目!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/642874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字符集和java的编码与解码

一、ASCII和GBK字符集 计算机存储一个英文字符需要一个字节。 ASCII字符集&#xff0c;包括128&#xff08;0000000B~1111111B&#xff09;个数据&#xff0c;存储英文字母和字符&#xff0c;对于欧美国家够用。 例如&#xff0c;存储字符’a’&#xff0c;查询ASCII得到为97&a…

Java阶段四Day03

Java阶段四Day03 文章目录 Java阶段四Day03数据处理基本流程代码编写顺序开发DAO层&#xff0c;添加的依赖项配置数据源任务拆解内容管理MySQL中的数据类型和Java属性的类型对照关于MyBatis PlusMyBatis Plus的基本使用关于MyBatis Plus的使用建议汇总如下自动更新时间 关于Pro…

一种不停服的数据迁移方案

一、前言 好的方案是一步步演进出来的。当前最优的系统方案&#xff0c;可能在下一个月、三个月或半年后&#xff0c;就会遇到瓶颈&#xff0c;需要调整自身以便适应新的业务场景。系统的演进就是一个快进版的人类进化史。 我之前负责的一个系统&#xff0c;一开始基本没啥数…

46 最佳实践-性能最佳实践-内存大页

文章目录 46 最佳实践-性能最佳实践-内存大页46.1 概述46.2 操作指导 46 最佳实践-性能最佳实践-内存大页 46.1 概述 相比传统的4K内存分页&#xff0c;openEuler也支持2MB/1GB的大内存分页。内存大页可以有效减少TLB miss&#xff0c;显著提升内存访问密集型业务的性能。ope…

证券行业异构系统众多,微服务和网格如何全都要

在携手网易数帆取得中间件云原生化的创新成果之后&#xff0c;安信证券已在谋划大规模微服务化的布局&#xff0c;以确保信息系统架构走在现代金融科技的前列&#xff0c;支撑业务在未来数智金融竞争中把握主动权。 架构未动&#xff0c;思想先行。安信证券近日在内部组织了一…

安全左移DevSecOps开源工具链建设

开发安全相关技术和产品受到越来越多的关注。行业共识认为&#xff0c;应用系统上线之后进行软件漏洞修复&#xff0c;其修复成本是需求设计阶段修复成本的几十倍。因此&#xff0c;在开发环节&#xff0c;引入相应的安全工具&#xff0c;能够有效的降低漏洞的修复成本&#xf…

vue+el-select下拉实现:全选、反选、清空功能

问题描述&#xff1a; el-select下拉框要求实现全选功能。具体功能包括&#xff1a; 当选择【全选】时&#xff0c;所有选项全部被勾选&#xff1b;当选择【反选】时&#xff0c;已选择选项变为未选择选项&#xff0c;未选项变为已选项当选择【清空】时&#xff0c;所有选项变…

SpringBoot进阶学习?看这篇就够了

相信从事Java开发的朋友都听说过SSM框架&#xff0c;老点的甚至经历过SSH&#xff0c;说起来有点恐怖&#xff0c;比如我就是经历过SSH那个时代未流。当然无论是SSM还是SSH都不是今天的重点&#xff0c;今天要说的是Spring Boot&#xff0c;一个令人眼前一亮的框架&#xff0c;…

作用域详解

作用域详解 1、概念2、分类2.1 全局作用域2.2 局部作用域2.2.1 函数作用域2.2.2 块级作用域2.2.3 块级作用域与函数声明 1、概念 JavaScript中的作用域是指变量、函数和对象在代码中可访问的范围。作用域规定了代码中的标识符&#xff08;变量名、函数名等&#xff09;在何处和…

ansible自动部署zabbix监控平台

目录 ansible端部署 使用ansible配置zabbix-mysql端 使用ansible配置zabbix-server端 使用ansible配置zabbix-agent端 一键部署zabbix Ansible是一款开源的自动化运维工具&#xff0c;可以通过SSH协议远程自动化地执行一些复杂的IT工作&#xff0c;例如程序部署、配置管理、…

Python自动化测试——postman,jmeter接口测试

关于众所postman&#xff0c;jmeter&#xff0c;做自动化测试的我想对这两个词并不陌生。大家都知道postman用来做接口测试很方便,下面我们就用一些例子来演示一下它该如何进行接口测试&#xff1a; 首先我们来介绍一下接口测试的概念&#xff1a; 1、什么是接口测试&#xf…

【裸机开发】内核时钟 PLL1 配置实验(一)—— 寄存器分析篇

本章主要会回答以下问题 &#xff1f; imx6u 的时钟源来自于哪 &#xff1f;为什么一个起始时钟源&#xff0c;最终分成了多路&#xff1f;不同的时钟源是如何与外设对应起来的&#xff1f;&#xff08;时钟树&#xff09;要配置内核时钟频率 有哪些步骤 &#xff1f;涉及到哪…

NLP学习笔记十一-word2vec模型

NLP学习笔记十一-word2vec模型 再介绍word2vec模型之前&#xff0c;我们需要先介绍一些背景知识。 我们只知道&#xff0c;NLP这一领域在ward2vec出现之前肯定也是有很大程度发展的&#xff0c;那么想要用将自然语言用计算机进行处理&#xff0c;进行计算&#xff0c;我们必须…

JQuery全部详细笔记-下

JQuery全部详细笔记-下 jQuery 的 DOM 操作 查找节点, 修改属性 查找属性节点: 查找到所需要的元素之后, 可以调用 jQuery 对象的 attr() 方法来获取它的各种属性值 应用实例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UT…

RK3288 Android8.1添加lvds以及gt9触摸屏(二)

现在先说gt9触摸屏如何配置 首先拿到硬件厂商提供的cfg以及gt9xx文件夹 驱动源码路径&#xff1a;kernel/drivers/input/touchscreen/gtxx 注&#xff1a;可以自己定义最后把gt9xx.h以及gt9xx.c文件放在哪&#xff0c;放在哪就在makefile里指定对应位置 1.touchscreen文件夹…

耗时108天,阿里P8总结了 1000 道 Java 工程师面试题

半年前还在迷茫该学什么&#xff0c;怎样才能走出现在的困境&#xff0c;半年后已经成功上岸阿里&#xff0c;感谢在这期间帮助我的每一个人。 面试中总结了 1000 道经典的 Java 面试题&#xff0c;里面包含面试要回答的知识重点&#xff0c;并且我根据知识类型进行了分类&…

写一个自定义View你都需要注意什么

本文主要是记录一下继承子View&#xff0c;所需要实现的方法&#xff0c;以及对自己的知识做一下梳理和记录&#xff0c;其中不少内容觉得自己应该是会的&#xff0c;但是实际写起来&#xff0c;还是遇到不少阻碍 构造方法 首先构造先了解一下构造方法&#xff0c;一般来说&a…

和悦未来社区:助力共同富裕,三思打造智慧社区新样板

“共同富裕是社会主义的本质要求&#xff0c;是中国式现代化的重要特征&#xff0c;是人民群众的共同期盼。” 2021年5月20日&#xff0c;《中共中央 国务院关于支持浙江高质量发展建设共同富裕示范区的意见》正式发布。 浙江省作为共同富裕先行示范省份&#xff0c;行而不辍…

SpringCloud microservice-student-consumer-80服务消费者项目建立(四)

新建一个服务器提供者module子模块&#xff0c;类似前面建的common公共模块&#xff0c;名称是 microservice-student-consumer-1001 pom.xml修改&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSc…

01 UML概述

UML概述 (1) 规约系统的制品–UML适用于对所有重要的分析、设 计和实现决策进行详细描述 (2) 构造系统的制品–UML描述的模型可与各种编程语言直接相关联 UML应用范围 (1)可用于对象方法和构件方法&#xff1b; (2)可用于 ●所有应用领域(例如&#xff0c;航空航天、财政、通…