分类 Paas 下的文章

CPU 计算平台体系架构

SMP 架构

SMP(Sysmmetric Multi-Processor System,对称多处理器系统),顾名思义,SMP 架构由多个具有对称关系的处理器组成。所谓对称,即处理器之间是水平的镜像关系,无有主从之分。SMP 架构使得一台计算机不再由单个 CPU 组成;

SMP 的结构特征就是「多处理器共享一个集中式存储器」,每个处理器访问存储器的时间片一致,使工作负载能够均匀的分配到所有可用处理器上,极大地提高了整个系统的数据处理能力。

这里写图片描述

虽然系统具有多个处理器,但由于共享一个集中式存储器,所以只会运行一个操作系统和数据库的副本(实例),能够保持单机特性。同时也要求系统需要保证共享存储器的数据一致性。如果多个处理器同时请求访问这些共享资源,就会引发资源竞态,需要软硬件实现加锁机制来解决这个问题。所以,SMP 又称为 UMA(Uniform Memory Access,一致性存储器访问),所谓一致性指的就是在任意时刻,多个处理器只能为内存的每个数据保存或共享一个唯一的数值

很显然,这样的架构设计注定没法拥有良好的处理器数量扩展性,因为共享内存的资源竞态总是存在的,处理器利用率最好的情况只能停留在 2 到 4 颗。

动图封面

这里写图片描述

综合来说,SMP 架构广泛的适用于 PC 和移动设备领域,能显著提升并行计算性能。但 SMP 却不适合超大规模的服务器端场景,例如:云计算。

NUMA 结构

现代的计算机系统中,处理器的处理速度要远快于主存的速度,所以限制计算机计算性能的瓶颈在存储器带宽上。SMP 架构因为限制了处理器访问存储器的频次,所以处理器可能会时刻对数据访问感到饥饿。

NUMA(Non-Uniform Memory Access,非一致性存储器访问)架构优化了 SMP 架构扩展性差以及存储器带宽窄的问题。

实际上 NUMA 和 SMP 架构是类似的,同样只会保存一份操作系统和数据库的副本,表示 NUMA 架构中的处理器依旧能够访问到整个存储器。两种主要的区别在于 NUMA 架构采用了分布式存储器,将处理器和存储器划分为不同的节点(NUMA Node),每个节点都包含了若干的处理器与内存资源。

这里写图片描述

NUMA 的结构特征就是「多节点」,每个节点都可以拥有多个处理器和内存资源,多节点的设计有效提高了存储器的带宽和处理器的扩展性。假设系统含有 4 个 NUMA 节点,那么在理想情况下系统的存储器带宽将会是 SMP 架构的 4 倍。而且在内存资源充裕的情况下,再多扩展几个节点当然也只是水到渠成的事情。

但就如上文所提到,NUMA 节点内的处理器实际上会可以访问整体存储器的。按照节点内外,内存被分为节点内部的本地内存以及节点外部的远程内存。当处理器访问本地内存时,走的是内部总线,当处理器访问远程内存时,走的是主板上的 QPI 互联模块。显然,访问前者的速度要远快于后者,NUMA(非一致性存储器访问)因此而得名。

这里写图片描述

**由于这个特性,基于 NUMA 架构开发的应用程序应该尽可能避免跨节点的远程内存访问。**因为,跨节点内存访问不仅仅是通信速度慢,还需要处理不同节点间内存、缓存的数据一致性。可见,线程在不同的节点间切换,是需要花费大成本的。

NUMA 和 UMA(SMP) 的异同:

  • NUMA 与 SMP 中的处理器都可以访问整个系统的物理存储器

  • NUMA 采用了分布式存储器,提供了分离的存储器给各个节点,避免了 SMP 中多个处理器无法同时访问单一存储器的问题

  • NUMA 节点的处理器访问内部存储器所需要的时间,比访问其他节点的远程存储器要快得多

  • NUMA 既保持了 SMP 单一操作系统副本、简便应用程序编程以及易于管理的特点,又继承了大规模并行处理 MPP 的可扩展性,是一个折中的方案

这里写图片描述

虽然 NUMA 的多节点设计具有较好的处理器数量扩展性,最多可以支持几百个 CPU。但因为 NUMA 没有实现彻底的主存隔离,所以 NUMA 依旧没有实现处理器数量的无限扩展,这是为了追求更高的并发性能所作出的妥协(一个节点也未必就能完全满足多线程并发,还是会存在多节点间线程切换的问题)。

NUMA 结构的基本概念

  • Node:包含有若干个物理 CPU 的组.

  • Socket:表示一颗物理 CPU 的封装(物理 CPU 插槽),简称插槽。为了避免将逻辑处理器和物理处理器混淆,Intel 将物理处理器称为插槽。

  • Core:物理 CPU 封装内的物理 Core。

  • Thread:使用超线程技术虚拟出来的逻辑 Core(一般的,物理 Core 和逻辑 Core 的比例是 1:2),需要 CPU 支持。为了便于区分,逻辑 Core 一般被写作 Processor。在具有 Intel 超线程技术的处理器上,每个内核可以具有两个逻辑处理器,这两个逻辑处理器共享大多数内核资源(如内存缓存和功能单元)。此类逻辑处理器通常称为 Thread。

NOTE:一个 NUMA Node 包含若干个 Socket(Socket 是一颗物理 CPU 的封装),一个 Socket 包含有若干个 Core(物理/虚拟)。

这里写图片描述

上图的 NUMA Topology 表示:

  • 两个 Node

  • 一个 Node 具有一个 Socket,即一个 pCPU

  • 一个 pCPU 具有 6 个 Core

  • 一个 Core 具有 2 个 Processor

所以总共的逻辑 CPUs Processor = 2*1*6*2 = 24

MMP 结构

MPP(Massive Parallel Processing,大规模并行处理)架构,既然 NUMA 扩展性的限制是没有完全实现资源的独立性,那么 MPP 的解决思路就是为处理器提供彻底的独立资源。MPP 拥有多个独立的 SMP 单元,每个 SMP 单元独占并只会访问自己本地的内存、I/O 等资源,SMP 单元间通过节点互联网络进行连接(Data Redistribution,数据重分配),是一个完全无共享(Share Nothing)的 CPU 计算平台结构。

这里写图片描述

MPP 结构的特征就是「多 SMP 单元组成,单元之间完全无共享」。除此之外,MPP 结构还具有以下特征:

  • 每个 SMP 单元内都可以包含一个操作系统副本,所以每个 SMP 单元都可以运行自己的操作系统

  • MPP 需要一种复杂的机制来调度和平衡各个节点的负载和并行处理过程,目前一些基于 MPP 技术的服务器往往通过系统级软件(e.g. 数据库)来屏蔽这种复杂性

  • MPP 架构的局部区域内存的访存延迟低于远地内存访存延迟,因此 Linux 会自定采用局部节点分配策略,当一个任务请求分配内存时,首先在处理器自身节点内寻找空闲页,如果没有则到相邻的节点寻找空闲页,如果还没有再到远地节点中寻找空闲页,在操作系统层面就实现了访存性能优化

因为完全的资源隔离特性,所以 MPP 的扩展性是最好的,理论上其扩展无限制,目前的技术可实现 512 个节点互联,数千个 CPU 。

Nova 的高性能虚拟机

在 Icehouse 版本之前,Nova 定义的 libvirt.xml,不会考虑 Host NUMA 的情况。导致 Libvirt 在默认情况下,有可能发生跨 NUMA node 获取 CPU/Memory 资源的情况,导致 Guest 性能下降。Openstack 在 Juno 版本中新增 NUMA 特性,用户可以通过将 Guest 的 vCPU/Memory 绑定到 Host NUMA Node上,以此来提升 Guest 的性能。

这里写图片描述

PS:Guest 是 ComputeNode 上的一个 Linux 进程,vCPU 是 Guest 进程内的一个特殊的线程,被 Host OS 调度。

Nova 虚拟机 CPU/RAM 设计的背景

基础概念

  • vCPU:虚拟 CPU,分配给虚拟机的逻辑 CPU。根据虚拟机拓扑的不同,一个虚拟机 CPU 可以是一个 CPU 封装元件(socket)、一个 CPU 核(core)、或者一个 CPU 线程(thread)。

  • pCPU:物理 CPU, 虚拟机主机所展示的逻辑 CPU,根据主机拓扑的不同,一个物理可以是一个 CPU 封装元件(socket)、一个 CPU 核(core)、或者一个 CPU 线程(thread)。

  • NUMA:非一致内存访问架构,内存访问时间取决于内存页面和处理器核心之间的位置。

  • Node:一个包含 CPU 或者内存(或二者兼具)的 NUMA 系统单元

  • Cell:Node 的通名词,供 Libvirt API 使用

  • Socket:包含在 NUMA 系统单元内的单个独立 CPU 封装元件

  • Core:一个 CPU 封装元件中的一个处理单元

  • Thread:超线程,一个 CPU 核中的一个超流水线

  • KSM:Linux 内核内存共享技术(Kernel Shared Memory)

  • THP:透明巨型页,为进程提前分配巨型页的一种 Linux 技术

pCPU:物理 CPU ,主机插槽上的 CPU,可以通过 /proc/cpuinfo 中的不同的 physical id 个数来统计 pCPU 的个数。 physical id 对应 socket_id Socket:表示一颗物理 CPU 的封装,对应主板上的一个 CPU 插槽 pCPU Cores:一块物理 CPU 上所具有的芯片组(CPU 寄存器+中断逻辑 etc.)数量,一个芯片组就是一个 CPU 的 Core,现在我们普遍认为一个物理 CPU 具有多个 Cores。 Hyper-Threading:超线程,可以将一个物理 CPU 的 Core,虚拟成若干个(通常为 2 个)伪 Core,达到一个物理 Core 可以处理多个线程的效果。 Logical Processor,简称 Processor:逻辑 CPU,可以通过 /proc/cpuingo 中的 processor 字段来统计 Processor 的个数,也可以使用下述公式计算:

  • 逻辑 CPU 数量 = 物理 CPU 数量 x 物理 CPU Cores(一个物理 CPU 具有若干个 Core)[x 2(如果开启了超线程,这个值通常为 2)]

e.g.

  • 酷睿 i5 760:原生四核心四线程处理器,没有采用超线程技术。一个物理 CPU,具有 4 个 Core,没有超线程,所以逻辑 CPU Processor = 1*4

NOTE:一般来说,物理 CPU 个数 × 每颗核数就应该等于逻辑 CPU 的个数,如果不相等的话,则表示服务器的 CPU 支持超线程技术 NOTE:同一个 Socket 中,具有相同 Core ID 的 Processor 是同一个物理 CPU Core 的超线程 NOTE:具有相同 Physical ID 的 Processor 是同一个物理 CPU 封装的 Thread(伪 Core)或 Core

操作系统许可(Licensing)

操作系统供应商许可规则,可能会严格约束操作系统所支持的 CPU 封装元件(sockets) 的数目。此时,为虚拟机分配的虚拟 CPU,应该偏向处理单元(core),而不是封装单元(socket)。

操作系统许可的影响,意味着用户在上传镜像到 glance 时,需要指明一个运行镜像的最佳的 CPU 拓扑,包含处理单元(core)与封装元件(socket)的分配。云平台管理员也可以修改程序的默认值,以避免用户超出常见的许可限制。也就是说,对于一个 4 虚拟 CPU 核的虚拟机,如果使用默认值限制最大的封装元件(socket)数目为 2,则可以设置其处理单元为 2(在 Socket 数量没有超出限制的前提下,虚拟机也能达到具有 4 Core 的效果),此时 windows 镜像也能够正常处理。

NOTE:OpenStack 管理员应该遵从操作系统许可需求,限制虚拟机使用的拓扑(例如:max_sockets==2)。设置默认的拓扑参数,以保证虚拟机操作系统镜像能够满足常规操作系统许可,而不必每一个用户都去设置镜像属性。

性能(Performance)

各种 CPU 拓扑的性能并不一致。例如,两个主机线程运行在同一个处理单元(core)上时,其性能就会低于运行在不同的处理单元(core)上。而当一个处理单元(core)有多个超线程(thread)时,操作系统调度器将决定线程的具体运行位置。超线程性能的影响,意味着除非指定将虚拟机超线程与主机的超线程一一绑定,否则无法为虚拟机指定超线程。如果不绑定虚拟机 CPU(vCPU) 与物理 CPU(pCPU) 的关系,则虚拟机应当始终不使用超线程(threads==1),而只是用 CPU 封装元件(sockets)与 CPU 处理单元(core),而没有必要向用户暴露超线程的配置能力。如果用户的虚拟机对负载比较敏感,那么用户最多会希望他们的镜像不运行在兄弟超线程(同一个处理单元上的超线程)上。

NOTE:如果不绑定 vCPU 和 pCPU,那么虚拟机不应该使用超线程(vCPU 会在不同 Core 的 thread 上浮动),而是虚拟机应该使用 Socket/Core。如果用户对虚拟机的性能要求比较高,那么不应该让虚拟机的 vCPU 运行在 Thread 上,而应该将 vCPU 运行在 Socket/Core 上。所以应该将 siblings Thread 过滤掉。

从 Intel 和 VMware 对外宣称的资料看,开启超线程后,物理核总计算能力是否提升以及提升的幅度和业务模型相关,平均提升在 20%-30% 左右。超线程对物理核执行资源的争抢,业务的执行时延会相应增加。当超线程相互竞争时,超线程的计算能力相比不开超线程时的物理核会下降30%左右。所以,超线程应该关闭还是开启,主要还是取决于应用模型:

  • 对于时延敏感性任务,比如用户需要及时等待任务运行结果的,在节点负载过高,引发超线程竞争时,任务的执行时长会显著增加,影响用户体验。

  • 对于后台计算型任务,比如超算中心上运行的后台计算型任务(一般要运行数小时或数天),建议开启超线程提高整个节点的吞吐量。

NUMA Topology

现在虚拟化主机都支持 NUMA 拓扑,会将内存与物理 CPU 分布在 2 个或者更多的 NUMA 节点上。

主要驱动 NUMA 应用的因素是高存储带宽,有效的缓存效率以及灵活 PCIe I/O 设备的布局。也就是说,每一个 NUMA 单元内部都由自己专有的内存总线,用于访问专用内存,而所有 NUMA 单元使用共享总线访问远端的内存。假如有一个具有 4 个 NUMA 单元的系统,每一个单元内部有 1GB/s 的存储带宽,同时共享总线也具有 1GB/s 的带宽。如果所有的处理器总是使用 NUMA 单元内部内存,那么系统就拥有了 4GB/s 的存储带宽潜力。如果所有处理器都是用远端存储,那么系统就只有了 1GB/s 的存储带宽潜力。使用共享的总线可能触发 NUMA 单元之间的缓存异常同步,对于内存密集型工作负载的性能会产生显著影响。当 I/O 性能至关重要时,加上共享总线上的无效 Cache 资源浪费,连接到远程 PCIe 总线上的设备(也就是说连接不同NUMA单元)作业性能将会急剧下降。

因此,虚拟机在 NUMA 单元上的错误布局,或者不正确的 PCI 设备分配选择,将会导虚拟化主机资源的严重浪费。这点影响将会抹掉任何内存与 CPU 决策所带来的好处,包括 guest CPU topology,vCPU 与 pCPU 绑定,以及使用大页内存。因此标准的策略将是一个虚拟机完全局限在单个 NUMA 节点。

NOTE:NUMA topology 具有高存储带宽,高缓存效率,高扩展性以及 PCIe I/O 设备布局灵活性好的优点。 NOTE:跨 NUMA node 具有 node 间缓存异常同步,总线延时高,存储带宽低,浪费缓存资源等导致性能急剧下降的缺点,尤其在内存密集型工作负载场景中。 NOTE:标准的 NUMA topology 策略是将一个虚拟机完全局限在单个 NUMA 节点中。

Guest NUMA Topology

如果虚拟机的虚拟 CPU 或者内存分配大过了 NUMA 节点,或者 NUMA 节点可用的 PCIe 设备不足时,必须针对虚拟机做出合适的策略,或者禁止创建过大 NUMA 节点的虚拟机,或者允许虚拟机跨越多 NUMA 运行。在虚拟机迁移时,可以更改这些策略,也就是说,在对主机进行维护而疏散主机时,会选择接受临时降低性能而选择次优的 NUMA 布局。布局的问题还要考虑到虚拟机的具体使用场景,例如,NFV 的部署就要求严格的 NUMA 布局。

如果一个虚拟机具有多个 guest NUMA 节点,为了操作系统能够最大化利用其分配到的资源,主机的 NUMA 拓扑必须暴露给虚拟机。虚拟机的 guest NUMA单元应该与虚拟化主机的 host NUMA单元进行映射。这样可以映射大块的虚拟机内存到虚拟化主机内存节点,设置虚拟 CPU 与物理 CPU 的映射。

也就是说,如果虚拟机有 4 个虚拟 CPU 需要跨越两个虚拟化主机 NUMA 单元,虚拟 CPU 0/1 绑定到第一个主机 NUMA 节点,而虚拟 CPU 2/3 将会绑定到第二个主机 NUMA 节点上,但是并不强制绑定每一个 vCPU 与 host NUMA 单元内特定 pCPU 的关系,这将由操作系统调度器指定。此时,如果虚拟主机具有超线程特性,则暴露超线程特性给虚拟机,同时在 NUMA 单元内绑定 vCPU 与 pCPU 的关系。

NOTE:如果 guest 的 vCPU/RAM 分配大于单个 host NUAM node,那么应该划分为多个 guest NUMA topology,并分别映射到不同的 host NUMA node 上。 NOTE:如果 host 开启了超线程,那么应该在单个 host NUMA node 上进行 vCPU 和 pCPU 的绑定,否则 vCPU 会被分配给 siblings thread,性能不如物理 Core 好。

大页内存

绝大多数现代 CPU 支持多种内存页尺寸,从 4KB 到 2M/4M,最大可以达到 1GB;所有处理器都默认使用最小的 4KB 页。如果大量的内存可以使用大页进行分配,将会明显减少 CPU 页表项,因此会增加页表缓存的命中率,降低内存访问延迟。

如果操作系统使用默认的小页内存,随着运行时间,系统会出现越来越多的碎片,以至于很难申请到大页的内存。在大页内存大小越大时,该问题越严重。因此,如果有使用大页内存的需求,最好的办法是在系统启动时就预留好内存空间。

当前的 Linux 内核不允许针对特定的 NUMA 节点进行这样的设定,不过,在不久的将来这个限制将被取消。更进一步的限制是,由于 MMIO 空洞的存在,内存开始的 1GB 不能使用 1GB 的大页。**Linux 内核已经支持透明巨型页(THP,transparent huge pages)特性。该特性会尝试为应用程序预分配大页内存。**依赖该特性的一个问题是,虚拟机的拥有者,并不能保证给虚拟机使用的是大页内存还是小页内存。

内存块是直接指定给特定的 NUMA 节点的,这就意味着大页内存也是直接存在于 NUMA 节点上的。**因此在 NUMA 节点上分配虚拟机时,计算服务需要考虑在 NUMA 节点或者主机上可能会用到的大页内存(NUMA node 或 host 存在哪一些大页内存类型和数量状况)。**为虚拟机内存启用大页内存时,可以不用考虑虚拟机操作系统是否会使用。

NOTE:有使用大页内存的需求,需要在系统启动时就预留好内存空间,Linux 内核使用 THP 来实现,但也存在着问题。 NOTE:如果希望让虚拟机使用大页内存,那么应该收集 NUMA 节点所拥有的内存页类型和数量信息。

专用资源绑定

计算节点可以配置 CPU 与内存的超配比例,例如,16 个物理 CPU 可以执行 256 个虚拟 CPU,16GB 内存可以允许使用 24GB 虚拟机内存。

超配的概念可以扩展到基本的 NUMA 布局,但是一旦提到大页内存,内存便不能再进行超配。当使用大页内存时,虚拟机内存页必须与主机内存页一一映射,并且主机操作系统能通过交换分区分配大页内存,这也排除了内存超配的可能。但是大页内存的使用,意味着需要支持内存作为专用资源的虚拟机类型。尽管设置专用资源时,不会超配内存与 CPU,但是 CPU 与内存的资源仍然需要主机操作系统提前预留。如果使用大页内存。必须在主机操作系统中明确预留。

对于 CPU 则有一些灵活性。因为尽管使用专用资源绑定 CPU,主机操作系统依然会使用这些 CPU 的一些时间。不管怎么样,需要预留一定的物理 CPU 专门为主机操作系统服务,以避免操作系统过多占用虚拟机 CPU,而造成对虚拟机性能的影响。Nova 可以保留一部分 CPU 专门为操作系统服务,这部分功能将会在后续的设计中加强。

允许内存超配时,超出主机内存的部分将会使用到 Swap。Swap 将会影响主机整体 I/O 性能,所以尽量不要把需要专用内存的虚拟机与允许内存超配的虚拟机放在同一台物理主机上。

如果专用 CPU 的虚拟机与允许超配的虚拟机竞争 CPU,由于 Cache 的影响,将会严重影响专用 CPU 的虚拟机的性能,特别在同一个 NUMA 单元上时。因此,最好将使用专用 CPU 的虚拟机与允许超配的虚拟机放在不同的主机上,其次是不同的 NUMA 单元上。

NOTE:确定 VMware 虚拟机支不支持使用大页内存 NOTE:大页内存需要明确的在物理主机中预留 NOTE:为了虚拟机能够更加好的“独占”物理 CPU,一般的,也会预留一些物理 CPU 资源给物理主机使用 NOTE:尽量不要将占用专用内存的虚拟机与使用内存超配的虚拟机放到同一个物理主机中运行 NOTE:尽量不要将占用专用 CPU 的虚拟机与使用 CPU 超配的虚拟机放到同一个物理主机中运行,其次是不要放到同一个 NUMA node 中运行

内存共享

Linux 内核有一项特性,叫做内核共享存储(KSM),该特性可以使得不同的处理器共享相同内容的内存页。内核会主动扫描内存,合并内容相同的内存页。如果有处理器改变这个共享的内存页时,会采用 CoW 的方式写入新的内存页。

当一台主机上的多台虚拟机使用相同操作系统或者虚拟机使用很多相同内容内存页时,KSM 可以显著提高内存的利用率。因为内存扫描的消耗,使用 KSM 的代价是增加了 CPU 的负载,并且如果虚拟机突然做写操作时,会引发大量共享的页面,此时会存在潜在的内存压力峰值。虚拟化管理层必须因此积极地监控内存压力情况并做好现有虚拟机迁移到其他主机的准备,如果内存压力超过一定的水平限制,将会引发大量不可预知的 Swap 操作,甚至引发 OOM。ZSwap 特性允许压缩内存页被写入 Swap 设备,这样可以大量减少 Swap 设备的 I/O 执行,减少了交换主机内存页面中固有的性能下降。

NOTE:虚拟化管理层应该积极的监控内存压力,适时的将虚拟机迁移到其他物理主机。

PCI 设备

PCI 设备与 NUMA 单元关系密切,PCI 设备的 DMA 操作使用的内存最好在本地 NUMA 节点上。因此,在哪个 NUMA 单元上分配虚拟机,将会影响到 PCI 设备的分配。

NOTE:将 PCI 设备和虚拟机分配到同一个 NUMA node 上。

从上述背景知识我们能够清晰的认识到,为了最大化利用主机资源,好好利用 NUMA 与大页内存等工具显得尤为重要。即使使用默认配置,Nova 也能够做到 NUMA 布局的优化以及考虑到大页内存的使用。显式的配置(通过配置虚拟机套餐类型 Flavor)只是为了满足性能优化或者虚拟机个性化需求,亦或者云平台提供商希望为不同的价格方案设置认为的设置。显示配置还能够限制用户可使用的拓扑,以防止用户使用非最优 NUMA 拓扑方案。

NOTE:只有当虚拟机的虚拟 CPU 与主机的物理 CPU 一一绑定时,配置超线程参数(threads != 1)才有意义。这不是一个最终用户需要考虑的东西,但是云平台管理员希望能够通过设置虚拟机类型明确避免使用主机超线程(如果 vCPU 和 pCPU 没有绑定,那么应该过滤物理主机的超线程 ID)。这可以通过使用主机聚合调度的方式实现。

超线程对性能的影响

超线程技术仅仅是在一个物理核心上使用了两个物理任务描述符,物理计算能力并没有增加。现在很多程序如 WEB Application,都采用多 Worker 设计,在超线程的帮助下,两个被调度到同一核心不同超线程的 Worker,通过共享 Cache,TLB,大幅降低了任务切换的开销。另外,在某个 Worker 不忙的时候,超线程允许其它的 Worker 也能使用物理计算资源,有助于提升物理核整体的吞吐量。但由于超线程对物理核执行资源的争抢,业务的执行时延也会相应增加。

动图封面

这里写图片描述

  • 对于 CPU 密集型任务的测试:仅运行一个负载和同时在一个核的两个超线程上运行负载的时间对比,可以看出在存在超线程竞争时,超线程计算能力大概是物理核的 60% 左右。


  • 不同数量负载同时运行时的平均编译时间,此时没有两个负载运行在同一个核的两个超线程上。可以看出,不存在超线程竞争时,负载平均运行时间基本不变。


  • 在同一个核两个超线程上的负载,其运行时间大幅增加。


  • 在 vSphere 的 ESXi 主机上运行两个 1CPU 的虚拟机,分别绑定到一个核的两个超线程上,在虚拟机内部运行计算任务,确保虚拟机内部 CPU 占用率在 50% 左右,可以看到,ESXi 主机上两个超线程使用率在 45% 左右,物理核负载已经达到 80%。


NOTE:将对于计算型虚拟机的 vCPU 绑定到主机的一个 thread 上,虚拟机的性能是不好的。对于时延敏感性任务,比如用户需要及时等待任务运行结果的,在节点负载过高(NFV),引发超线程竞争时,任务的执行时长会显著增加,影响用户体验;对于后台计算型任务,比如超算中心上运行的后台计算型任务(一般要运行数小时或数天),建议开启超线程提高整个节点的吞吐量。

CPU 绑定

**CPU 绑定:**将虚拟机的 vCPUs 绑定到 pCPUs,vCPU 只会在指定的 pCPU 上运行,避免 pCPU 间线程切换(上下文切换,内存数据转移)带来的性能开销。

openstack flavor set FLAVOR-NAME \
    --property hw:cpu_policy=CPU-POLICY \
    --property hw:cpu_thread_policy=CPU-THREAD-POLICY

使用此属性参数,将虚拟机的 vCPUs 连接到物理主机的 pCPUs 上。该配置能够提高虚拟机的性能。

  • CPU-POLICY 具有下列两种参数类型

    • shared:(默认的)允许 vCPUs 跨 pCPUs 浮动,尽管 vCPUs 收到了 NUMA node 的限制也是如此。

    • dedicated:guest 的 vCPUs 将会严格的 pinned 到 pCPUs 的集合中。在没有明确 vCPU 拓扑的情况下,Drivers 会将所有 vCPU 作为 sockets 的一个 core 或一个 thread(如果启动超线程)。如果已经明确的将 vCPUs Topology Pinned 到 CPUs Topology 中时,会严格执行 CPU pinning,将 guest CPU 的拓扑匹配到已经 pinned 的 CPUs 的拓扑中。此时的 overcommit ratio 为 1.0。例如:虚拟机的两个 vCPU 被 pinned 到了一个物理主机的 core 的两个 thread 上,那么虚拟机将会获得一个 core(对应的两个 thread)的拓扑。

NOTE:这里常结合 NUMA topology 来一起使用。如果设定为 shared,那么即便为虚拟机分配了一个 NUMA node,但 vCPUs 仍会在 NUMA node 所拥有的 pCPUs 间浮动;如果设定为 dedicated,那么虚拟机就会严格按照 guest NUMA topology 和 host NUMA topology 的映射关系将 vCPUs pinned to pCPUs,实现 CPU 的绑定。而且这种映射,往往是一个 vCPU 被绑定到一个 pCPU 的 Core 或 Thread 上(如果开启超线程)。

  • CPU-THREAD-POLICY

    • prefer:(默认的)主机也许是 SMT 架构,如果是 SMT 架构,那么将会优先将一个 vCPU 绑定到一个物理主机的 thread siblings 上,否则按照一般的方式将 vCPU 绑定到 core 上。

    • isolate:主机不应该是 SMT 架构,或者能够识别 thread siblings 并从逻辑上屏蔽它。每一个 vCPU 都将会被 pinned 到一个物理 CPU 的 Core 上(如果是多核 CPU)。如果物理机是 SMT 架构支持超线程,那么物理 Cores 就具有 Thread siblings,这样的话,如果一个 guest 不同的 vCPU 被 pinned 到不同的物理 Core 上,那么这个物理 Core 将不会再继续接受其他 guest 的 vCPU。所以,需要保证物理 Core 上没有 Thread siblings。

NOTE:unpin_cpus_with_siblingspin_cpus_with_siblings 将属于同一个 thread siblings 的 CPUs 一次性 Pinned 掉,等同于消耗掉了一颗物理 Core。这两个方法是为了在超线程场景中,能够消除超线程带入的重叠 Thread,保持了物理 Core 的唯一性。

    • require:物理主机必须是 SMT 架构,每一个 vCPU 都分配给 thread siblings。但如果没有足够的 thread siblings,则会调度失败。如果主机不是 SMT 架构,则配置无效。

NOTE:只有设定 hw:cpu_policy=dedicated 时,hw:cpu_thread_policy 才会生效。可见,后者设定的是 vCPU pinning to pCPU 的策略。

NOTE:在启动了超线程的 SMT-Base(simultaneous multithreading-based,基于同步多线程) 架构中,Core 通常被成为 hardware thread,而使用超线程技术虚拟出来的 Cores 被称为 thread siblings。

NOTE:SMT 架构,也就是以前的 Hyper-Threading 超线程技术,支持将一个物理 Core 虚拟为多个 Thread(伪核)。

NOTE:应该使用 HostAggregate 来区分开 pinned 和 unpinned 的虚拟机,因为 unpinned 的虚拟机不会考虑到 pinned 的虚拟机的资源需求,避免发生资源占用。

NOTE:一个虚拟机在物理主机上就是一个进程,一个 vCPU 在物理主机上就是一个特殊的线程。

NOTE:专有 CPU 约束,如果为虚拟机设置物理 CPU 绑定,那么其他虚拟机要避免使用该虚拟机的专有物理 CPU。

  • 在主机配置时,为所有虚拟机创建两个资源组,为两个组分配不同的物理。CPU。使用专有资源的虚拟机与共享资源的虚拟机分别使用两个不同的资源组。

  • 准备一些不超配的主机只用于专用资源。

  • 当出现一个需要专有资源的虚拟机时,动态更新所有现有虚拟机的物理 CPU 绑定。

  • 为所有的虚拟机预先设置物理 CPU 亲和性,以预留一部分物理 CPU 为后面的专有资源虚拟机使用。

  • 为虚拟机设置固定的调度时间片,允许他们在物理 CPU 之间自由调度。

_get_host_numa_topology

  • cells:对应 NUMA nodes

  • online_cpus:表示所有的 Logical Processors 逻辑核,对应 CPU ID,例如:set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])

  • cpuset:表示同一个 Socket 中的 Logical Processors 逻辑核,例如:Socket 0 的 cpuset=set([0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17])

  • siblings:同一个物理 CPU Core 虚拟出来的 Logical Processors 的集合(通常为 2 个)。cpuset 中的 CPU 所拥有的 Logical Processors 的集合。例如 cpu 0 和 cpu 12 所拥有的 siblings 都是 set([0, 12]) 表示 0 和 12 是「超线程虚拟出来的兄妹 CPU」,两者均在同样的 Socket 和同样的 Core 中。

  • 基本上 siblings[X] & cpuset == siblings[X],因为 siblings[X] 集合的元素就是 cpuset 中的 cpu id 的组合。

NUMA 亲和

NUMA 亲和:将虚拟机绑定 NUMA Node,guest vCPUs/RAM 都分配在同一个 NUMA node 上,充分使用 NUMA node local memory,避免访问 remote memory 的性能开销。

openstack flavor set FLAVOR-NAME \
    --property hw:numa_nodes=FLAVOR-NODES \
    --property hw:numa_cpus.N=FLAVOR-CORES \
    --property hw:numa_mem.N=FLAVOR-MEMORY

使用此属性参数,将虚拟机的 vCPUs 线程限制到指定的 NUMA node 中,保证每一个 vCPU 都使用同一个 NUMA node 的 pCPU/RAM。若虚拟机所需要的 pCPU/RAM 资源需求大于一个 host NUAM node 资源时,可以通过下列属性参数定义划分为若干个在 host NUMA node 资源范围内的 guest NUMA topologys,再将 guest NUMA topologys 分别映射到不同的 host NUMA node 上。

  • FLAVOR-NODES:整数,设定 Guest NUMA nodes 的个数。如果不指定,则 Guest vCPUs 可以运行在任意可用的 Host NUMA nodes 上。

  • N:整数,Guest NUMA nodes ID,取值范围在 [0, FLAVOR-NODES-1]。

  • FLAVOR-CORES:逗号分隔的整数,设定分配到 Guest NUMA node N 上运行的 vCPUs 列表。如果不指定,vCPUs 在 Guest NUMA nodes 之间平均分配。

  • FLAVOR-MEMORY:整数,单位 MB,设定分配到 Guest NUMA node N 上 Memory Size。如果不指定,Memory 在 Guest NUMA nodes 之间平均分配。

NOTE:只有在设定了 hw:numa_nodes 后 hw:numa_cpus.N 和 hw:numa_mem.N 才会生效。另外,只有当 Guest NUMA node 存在非对称访问 CPUs/RAM 时(一个 Host NUMA node 无法满足虚拟机的 vCPUs/RAM 资源需求时),才需要去设定这些参数。

NOTE:N 仅仅是 Guest NUMA node 的索引,并非实际上的 Host NUMA node 的 ID。例如,Guest NUMA node 0,可能会被映射到 Host NUMA node 1。类似的,FLAVOR-CORES 的值也仅仅是 vCPU 的索引。因此,Nova 的 NUMA 特性并不能用来约束 Guest vCPUs/RAM 绑定到某一个 Host NUMA node 上。要完成 vCPU 绑定到指定的 pCPU,需要借助 CPU Pinning policy 和 Nova 底层隐式实现的 CPU binding(映射)机制。

WARNING:如果 hw:numa_cpus.N 和 hw:numa_mem.N 设定的值大于虚拟机本身可用的 CPUs/Memory 的话,则触发异常。

EXAMPLE:Flavor 定义 Guest 有 4 个 vCPU,4096MB 内存,设定 Guest 的 NUMA topology 为 2 个 NUMA node,vCPU 0、1 运行在 NUMA node 0 上,vCPU 2、3 运行在 NUMA node 1上。并且占用 NUMA node 0 的 Memory 2048MB,占用 NUMA node1 的 Memory 2048MB。

openstack flavor set aze-FLAVOR \ 
  --property hw:numa_nodes=2 \ 
  --property hw:numa_cpus.0=0,1 \ 
  --property hw:numa_cpus.1=2,3 \ 
  --property hw:numa_mem.0=2048 \ 
  --property hw:numa_mem.1=2048 \

使用该 flavor 创建的虚拟机,将会具有上述 Guest NUMA topology,并由 Libvirt Driver 隐射到 Host NUMA node 上。

Nova 分配 NUMA 的两种方式:

  • 自动分配 NUMA 的约束和限制:仅指定 Guest NUMA nodes 的个数,然后由 Nova 根据 Flavor 的规格平均将 vCPU/Memory 分布到不同的 Host NUMA nodes 上(默认从 Host NUMA node 0 开始分配,依次递增)。这将最大程度的降低配置参数的复杂性。如果没有 NUMA 节点的定义,管理程序可以在虚拟机上自由使用 NUMA 拓扑。

    • 不能设置 numa_cpus 和 numa_mem

    • 自动从 0 节点开始平均分配


  • 手动指定 NUMA 的约束和限制:不仅指定 Guest NUMA nodes 的个数,还指定了每个 Guest NUMA nodes 上分配的 vCPU ID 和 Memory Size,设定了 Guest NUMA topology。由 Nova 来完成 Guest NUMA nodes 和 Host NUMA nodes 的映射关系。

    • 设定的 vCPU 总数需要和虚拟机 flavor 中的 CPU 总数一致

    • 设定的 Memory 大小需要和虚拟机 flavor 中的 memory 大小一致

    • 必须设置 numa_cpus 和 numa_mem

    • 需要从 Guest NUMA node 0 开始指定各个 numa 节点的资源占用参数

NOTE 1:nova-compute 的 ResourceTracker 会定时上报 Host NUMA 的资源信息。 NOTE 2:Setup Flavor extra-specs 实际上是设定 Guest NUMA Topology。 NOTE 3:Guest vCPU/Memory 不能大于虚拟机自身 flavor 所拥有的 CPU/Memory 规格。 NOTE 4:如果 Guest NUMA node 的 vCPU/Memory 规格大于 Host NUMA node 的 CPU/Memory 规格,则应该讲 Guest NUMA node 划分为多个 nodes。 NOTE 5:如果 hw:numa_cpus.N 或 hw:numa_mem.N 设定的值比 Host 可用 CPU/Memory 大,则会引发错误。 NOTE 6hw:numa_cpus.N 与 hw:numa_mem.N 只在设置了 hw:numa_nodes 后有效。 NOTE 7:N 是 Guest NUMA node 的索引 ID,并非实际上的 Host NUMA node ID。例如,Guest NUMA node(hw:numa_mem.0),可能会被映射到 Host NUMA node 1。类似的,FLAVOR-CORES 也值是 vCPU 的编号,并不对应 pCPU。因此,Nova 的 NUMA 特性并不能用来约束 Guest vCPU/Memory 所处于的 Host NUMA node。要完成 vCPU 绑定到指定的 pCPU,还需要应用 Nova 的 CPU binding 机制。 NOTE 8:在最终的 XML 文件里面可能并没有 numatune 信息,因此从 XML 无法看出 Guest NUMA node 的 Memory 是从哪个 Host NUMA node 上分配的,在 RHEL 中,默认的 Memory 分配方式与 CPU 分配方式是一致的,但是在 SUSE OS 上,就需要指定 numatune 信息才能生效。

除了通过 Flavor extra-specs 来设定 Guest NUMA topology 之外,还可以通过 Image Metadata 来设定。e.g.

glance image-update --property \ 
  hw_numa_nodes=2 \ 
  hw_numa_cpus.0=0 \ 
  hw_numa_mem.0=512 \ 
  hw_numa_cpus.1=0 \ 
  hw_numa_mem.1=512 \ 
  image_name

NOTE:当用户镜像的 NUMA 约束与虚拟机类型的 NUMA 约束冲突时,以虚拟机类型约束为准。

调度器使用虚拟机类型的参数 numa_nodes 决定如何布置虚拟机。如果没有设置 numa_nodes 参数, 调度器将自由决定在哪里运行虚拟机,而不关心单个 NUMA 节点是否能够满足虚拟机类型中的内存设置,尽管仍然会优先考虑一个 NUMA 节点可以满足情况的主机。

  • 如果参数 numa_nodes 设置为 1,调度器 将会选择单个 NUMA 节点能够满足虚拟机类型中内存设置的主机。

  • 如果参数 numa_nodes 设置大于 1,调度器将会选择 NUMA 节点数量与 NUMA 节点中内存能够满足虚拟机类型中 numa_nodes 参数与内存设置的主机。

ComputeNode 将会暴露他们的 NUMA 拓扑信息(例如:每个 NUMA 节点上有多少 CPU 和内存),以及当前的资源利用率。这些数据会被加入到计算节点的数据模型(compute_nodes)中。

应用场景:

  • hw:huma_nodes=1,应该让 Guest 的 vCPU/Memory 从一个固定的 Host NUMA node 中获取,避免跨 NUMA node 的 Memory 访问,减少不可预知的通信延时,提高 Guest 性能。

  • hw:huma_nodes=N,当 Guest 的 vCPU/Memory 超过了单个 Host NUMA node 占有的资源时,手动将 Guest 划分为多个 Guest NUMA node,然后再与 Host NUMA node 对应起来。这样做有助于 Guest OS 感知到 Guest NUMA 并优化应用资源调度。(e.g. 数据库应用)

  • hw:huma_nodes=N,对于 Memory 访问延时有高要求的 Guest,即可以将 vCPU/Memory 完全放置到一个 Host NUMA node 中,也可以主动将 Guest 划分为多个 Guest NUMA node,再分配到 Host NUMA node。以此来提高总的访存带宽。(e.g. NFV/搜索引擎)

    • 如果 N == 1,表示 Guest 的 vCPU/Memory 固定从一个 Host NUMA node 获取

    • 如果 N != 1,表示为 Guest 划分 N 和 Guest NUMA node,并对应到 N 个 Host NUMA node 上

大页内存

大页内存:使用大页来进行内存分配,那么将会明显减少 CPU 页表项,因此会增加页表缓存的命中率,降低内存访问延迟。

与 NUMA 不同,如果虚拟机类型中声明了大页内存,则需要主机能够进行预留该内存块。因为这些内存同时也作为该主机上的 NUMA 节点专用内存,所以必须提前显式声明。例如,如果主机配置了大页内存,也应该从 NUMA 节点中分配。

透明巨型页技术允许主机出现内存超配,并且调度程序可以使用该特性。如果主机支持内存预分配,主机将会上报是否支持保留内存或者 THP,甚至在严格条件下,可以上报剩余可用内存页数。如果虚拟机使用的主机类型中将 huge_pages 参数设置为 strict 时,并且没有主机在单 NUMA 节点中拥有足够的大页内存可用,调度器将会返回失败。

openstack flavor set FLAVOR-NAME \
    --property hw:mem_page_size=PAGE_SIZE
  • PAGE_SIZE

    • small:(默认)使用最小的 page size,例如:4KB on x86 架构

    • large:只为 Guest 使用的 larger page size,例如:2MB 或 1GB on x86 架构

    • any:有 Nova virt drivers 决定,不同的 driver 具有不同的实现。

    • <pagesize>:字符串,显式自定义 page size,例如:4KB/2MB/2048/1GB

NOTE:针对虚拟机的 RAM 可以启动 large page 特性,可以有效提供虚拟机性能。

NOTE:将大页内存分配给虚拟机,可以不考虑 GuestOS 是否使用。如果 GuestOS 不使用,则会识别小页内存。相反,如果 GuestOS 是需要使用大页内存的,则必须要为虚拟机分配大页内存,否则虚拟机的性能将达不到预期。

NOTE:专有内存约束

  • 为专有资源虚拟机使用大页内存。这需要主机拥有足够的可用大页内存,并且虚拟机内存大小是大页内存大小的倍数。

  • 在主机配置时,为所有虚拟机创建两个资源组,为两个组分配不同的物理内存区域。使用专有资源的虚拟机与共享资源的虚拟机分别使用两个不同的资源组。

专用内存的分配的复杂性还在于,主要虚拟机之外,KVM 还有许多不同的内存分配的需求,有些虚拟机处理视频内容,会在 KVM 过程处理 I/O 请求时,分配任意大小的内存。有些情况下,这也会影响虚拟 CPU 的使用,因为 KVM 模拟程序线程代表的就是虚拟机行为。更进一步讲,主机操作系统也需要内存与 CPU 资源。

  • 只有当系统中有可用大页内存时,虚拟化程序才启动虚拟机。设置虚拟机类型参数 page_sizes=large

  • 虚拟化管理程序将会优先尝试大页内存,不可用时,使用小页内存启动虚拟机。设置虚拟机类型参数 page_sizes=any

  • 虚拟机程序将不选择大页内存启动虚拟机,即使大页内存可用。设置虚拟机类型参数 page_sizes=small

  • 只有当系统中有可用的 1GB 大页内存时,虚拟化管理程序才启动虚拟机,并且将不会使用 2MB 的大页内存。设置虚拟机类型参数 page_sizes=1GB

PCI passthrough

可以通过下述属性参数来分配 PCI 直通设备给虚拟机。

openstack flavor set FLAVOR-NAME \
    --property pci_passthrough:alias=ALIAS:COUNT
  • ALIAS:字符串,在 nova.conf 中配置的特定 PCI 设备的 alias。(DEFAULT pci_alias)

  • COUNT:整数,分配给虚拟机的 ALIAS 类型的 PCI 设备数量

Nova 实现 NUMA 的流程

1.nova-api 对 flavor metadata 或 image property 中的 NUMA 配置信息进行解析,生成 Guest NUMA topology,保存为 instance['numa_topology']

2.nova-scheduler 通过 NUMATopologyFilter 判断 Host NUMA topology 是否能够满足 Guest NUMA topology,进行 ComputeNode 调度

这里写图片描述

3.nova-compute 再次通过 instance_claim 检查 Host NUMA 资源是否满足建立 Guest NUMA。

这里写图片描述

4.nova-compute 建立 Guest NUMA node 和 Host NUMA node 的映射关系,并根据映射关系调用 libvirt driver 生成 XML 文件。

<domain> 
  <cputune> 
   /* vCPU 与 Host NUMA node 的绑定关系,4-7, 12-15 在一个 Host NUMA Node 节点上,0-3,8-11 在另外一个 Node 上 */
   /* cpuset 设定的 pCPU 是由 libvirt 根据 Host NUMA node 资源信息自动分配的*/
    <vcpupin vcpu="0" cpuset="4-7,12-15"/>  
    <vcpupin vcpu="1" cpuset="4-7,12-15"/>  
    <vcpupin vcpu="2" cpuset="0-3,8-11"/>  
    <vcpupin vcpu="3" cpuset="0-3,8-11"/>  
    <emulatorpin cpuset="0-15"/> 
  </cputune>  
***
  <cpu match="host-model"> 
    <model fallback="allow"/>  
    <topology sockets="2" cores="2" threads="1"/>  
   /* Guest NUMA Topology,一个 cell 表示一个 Guest NUMA node,默认从 0 开始编号 */
    <numa> 
     /* cpus 表示该 Guest NUMA node 内包含的 vCPU ID,memory 表示该 Guest NUMA nova 包含的 Memory Size 大小,单位 KB*/
      <cell id="0" cpus="0-1" memory="1048576"/>  
      <cell id="1" cpus="2-3" memory="1048576"/> 
    </numa> 
  </cpu> 
</domain>

Resource Tracker 会刷新 Host NUMA 资源的使用情况:

这里写图片描述

对 NUMA 相关数据的解析和处理,提供了以下 class: vim nova/virt/hardware.py

  • class VirtNUMATopologyCell(object):

    • NUMA 单元,定义了 NUMA cell 内的基本数据成员。


  • class VirtNUMATopologyCellLimit(VirtNUMATopologyCell):

    • NUMA 限制量单元,定义了 NUMA cell 内可以使用资源的最大限。

  • class VirtNUMATopologyCellUsage(VirtNUMATopologyCell):

    • NUMA 使用量单元,定义了 NUMA cell 内已使用的资源。


  • class VirtNUMATopology(object):

    • NUMA 拓扑单元,定义了 NUMA 的基本数据成员,即 cells[]

  • class VirtNUMAInstanceTopology(VirtNUMATopology):

    • 为 guest VM 提供 NUMA 相关的操作。


  • class VirtNUMAHostTopology(VirtNUMATopology):

    • 为 Host 提供 NUMA 相关的操作。

查看 Host NUMA topology

[root@control01 ~]# numactl --hardware
available: 1 nodes (0)                     # 1 NUMA nodes
node 0 cpus: 0 1 2 3 4 5 6 7          # 8 Processor 
node 0 size: 16383 MB                  # 15G Memory/Node
node 0 free: 195 MB                      # 195M Memory/Node
node distances:                             # 跨 Node 访问 Memory 的成本
node   0
  0:  10
root@aju-dev-vmware:~# sudo virsh nodeinfo
sudo: unable to resolve host aju-dev-vmware
CPU model:           x86_64
CPU(s):              4
CPU frequency:       2299 MHz
CPU socket(s):       4
Core(s) per socket:  1
Thread(s) per core:  1
NUMA cell(s):        1
Memory size:         8176640 KiB

查看 Guest NUMA topology:

  • 从 libvirt.xml 查看


  • Host OS 上执行 numastat -c qemu-system-x86_64


  • 查看 Instance 的 NUMA Topology 信息


NFV 支撑


发布于 2023-05-21 21:39・IP 属地北京


VMware ESXi和VMware ESX是VMware公司推出的两个虚拟化平台产品。它们都是面向企业级用户的服务器虚拟化平台,允许用户在一台物理服务器上同时运行多个虚拟操作系统。但它们之间有以下几个区别:
1、架构不同:VMware ESX采用一个完整的Linux操作系统,而VMware ESXi是一种基于微内核的操作系统,具有更小的存储空间和更快的启动速度。

2、大小不同:VMware ESX需要更多的磁盘空间和内存资源,而VMware ESXi则占用更少的磁盘空间和内存资源。

3、管理接口不同:VMware ESX使用Service Console进行管理,而VMware ESXi使用vSphere Client进行管理。

4、安全性不同:由于VMware ESXi采用了微内核架构,因此其攻击面更小,安全性更高。

5、插件支持不同:由于架构不同,VMware ESXi对插件支持有一定限制,而VMware ESX则可以支持更多的插件。
总体来说,VMware ESXi相对于VMware ESX具有更小的存储空间、更快的启动速度和更高的安全性,而VMware ESX则具有更好的插件支持和更完整的操作系统环境。根据实际需求,用户可以选择使用其中之一来搭建自己的虚拟化平台。

k8s是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可以促进声明式配置和自动化,下面这篇文章主要给大家介绍了关于部署k8s集群的实践步骤,文中通过图文介绍的非常详细,需要的朋友可以参考下

目录
  • 1、部署k8s的两种方式:

  • 2、环境准备

  • 3、初始化配置

    • 3.1、安装环境准备:下面的操作需要在所有的节点上执行。

    • 3.2、安装 Docker、kubeadm、kubelet【所有节点】

  •  4、部署k8s-master【master执行】

    • 4.1、kubeadm部署(需要等上一会)

    • 4.2、拷贝k8s认证文件

  • 5、配置k8s的node节点【node节点操作】

    • 5.1、向集群添加新节点,执行在kubeadm init输出的kubeadm join命令

  • 6、部署容器网络 (master执行)

    • 7、部署Dashboard

      • 总结

        1、部署k8s的两种方式:

        目前生产部署Kubernetes集群主要有两种方式:

        • kubeadm

        Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。

        • 二进制包

        从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

        本实验采用kubeadm的方式搭建集群。

        2、环境准备

        服务器要求:

        • 建议最小硬件配置:2核CPU、2G内存、20G硬盘

        • 服务器最好可以访问外网,会有从网上拉取镜像需求,如果服务器不能上网,需要提前下载对应镜像并导入节点

        软件环境:

        • 操作系统:centos7.9_x64(mini)

        • Docker:20-ce

        • K8s:1.23

        服务器规划:(本实验采用虚拟机)

        • k8s-master:192.168.178.171

        • k8s-node1:192.168.178.172

        • k8s-node2:192.168.178.173

        3、初始化配置

        3.1、安装环境准备:下面的操作需要在所有的节点上执行。

        # 关闭防火墙  systemctl stop firewalld  systemctl disable firewalld    # 关闭selinux  sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久  setenforce 0  # 临时    # 关闭swap  swapoff -a  # 临时  sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久    # 根据规划设置主机名  hostnamectl set-hostname <hostname>    # 在master添加hosts  cat >> /etc/hosts << EOF  192.168.178.171 k8s-master  192.168.178.172 k8s-node1  192.168.178.173 k8s-node2  EOF    # 将桥接的IPv4流量传递到iptables的链  cat > /etc/sysctl.d/k8s.conf << EOF  net.bridge.bridge-nf-call-ip6tables = 1  net.bridge.bridge-nf-call-iptables = 1  EOF  sysctl --system  # 生效    # 时间同步  yum install ntpdate -y  ntpdate time.windows.com    注意:虚拟机不管关机还是挂起,每次重新操作都需要更新时间进行同步。

        部署k8s集群的超详细实践步骤

        3.2、安装 Docker、kubeadm、kubelet【所有节点】

        安装docker:

        wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo  yum -y install docker-ce  systemctl enable docker && systemctl start docker

        部署k8s集群的超详细实践步骤

        配置镜像下载加速器:

        vim /etc/docker/daemon.json    {    "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],    "exec-opts": ["native.cgroupdriver=systemd"]  }    systemctl restart docker  docker info                                                        #查看docker信息,进行确认

        部署k8s集群的超详细实践步骤

        添加阿里云软件源:

        cat > /etc/yum.repos.d/kubernetes.repo << EOF  [kubernetes]  name=Kubernetes  baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64  enabled=1  gpgcheck=0  repo_gpgcheck=0  gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg  EOF

        安装kubeadm、kubelet、kubectl:

        yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0  systemctl enable kubelet

        部署k8s集群的超详细实践步骤

         4、部署k8s-master【master执行】

        4.1、kubeadm部署(需要等上一会)

        kubeadm init     --apiserver-advertise-address=192.168.178.171     --image-repository registry.aliyuncs.com/google_containers     --kubernetes-version v1.23.0     --service-cidr=10.96.0.0/12     --pod-network-cidr=10.244.0.0/16     --ignore-preflight-errors=all
        • –apiserver-advertise-address 集群通告地址

        • –image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址

        • –kubernetes-version K8s版本,与上面安装的一致

        • –service-cidr 集群内部虚拟网络,Pod统一访问入口

        • –pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致

         初始化之后,会输出一个join命令,先复制出来,node节点加入master会使用。

        部署k8s集群的超详细实践步骤

        4.2、拷贝k8s认证文件

        mkdir -p $HOME/.kube  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config  sudo chown $(id -u):$(id -g) $HOME/.kube/config

        查看工作节点:

        kubectl get nodes

        部署k8s集群的超详细实践步骤

        注:由于网络插件还没有部署,还没有准备就绪 NotReady,继续操作。 

        5、配置k8s的node节点【node节点操作】

        5.1、向集群添加新节点,执行在kubeadm init输出的kubeadm join命令

        部署k8s集群的超详细实践步骤

        默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:

         kubeadm token create --print-join-command

        6、部署容器网络 (master执行)

        Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。

        下载YAML:

         wget https://docs.projectcalico.org/manifests/calico.yaml

        下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 –pod-network-cidr指定的一样。

        修改完后文件后,进行部署:

        kubectl apply -f calico.yaml  kubectl get pods -n kube-system                        #执行结束要等上一会才全部running

        部署k8s集群的超详细实践步骤

        等Calico Pod都Running后,节点也会准备就绪。

        部署k8s集群的超详细实践步骤

        注:以后所有yaml文件都只在Master节点执行。

        安装目录:/etc/kubernetes/

        组件配置文件目录:/etc/kubernetes/manifests/

        7、部署Dashboard

        Dashboard是官方提供的一个UI,可用于基本管理K8s资源。

        YAML下载地址:

        wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

        默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:

        vi recommended.yaml  ...  kind: Service  apiVersion: v1  metadata:    labels:      k8s-app: kubernetes-dashboard    name: kubernetes-dashboard    namespace: kubernetes-dashboard  spec:    ports:      - port: 443        targetPort: 8443        nodePort: 30001    selector:      k8s-app: kubernetes-dashboard    type: NodePort  ...
        kubectl apply -f recommended.yaml  kubectl get pods -n kubernetes-dashboard

        部署k8s集群的超详细实践步骤

        访问地址:https://NodeIP:30001 

        部署k8s集群的超详细实践步骤

        创建service account并绑定默认cluster-admin管理员集群角色:

         # 创建用户  kubectl create serviceaccount dashboard-admin -n kube-system  # 用户授权  kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin  # 获取用户Token  kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

        部署k8s集群的超详细实践步骤

        使用输出的token登录Dashboard。 

        部署k8s集群的超详细实践步骤

        注: 

        以上为本人实际搭建过程中的经验总结

        总结

        到此这篇关于部署k8s集群的超详细实践的文章就介绍到这了,更多相关k8s集群搭建内容请搜索主机以前的文章或继续浏览下面的相关文章希望大家以后多多支持好主机!


        低代码 / 无代码的主要概念并不新鲜,它可以追溯到十多年前的无代码编程 (PWCT) 和类似系统。下面小编整理了十几款开源的低代码开发平台,一起来看看吧~

        1、Appsmith 构建和自托管内部应用程序

        图片
        许可证:Apache-2.0
        开发语言:Java、JavaScript、TypeScript
        官网:https://www.appsmith.com/
        Appsmith 是一个用于构建管理面板、内部工具和仪表板的低代码项目。与超过 15 个数据库和任何 API 集成。构建你需要的一切,速度提高 10 倍。允许你拖放组件来构建仪表板、使用 JavaScript 对象编写逻辑并连接到任何 API、数据库或 GraphQL 源。
        图片
        项目地址:https://www.oschina.net/p/appsmith
        2、BudiBase 构建内部工具的开源低代码平台
        图片
        许可证:GPLv3
        开发语言:JavaScript、TypeScript
        官网:https://budibase.com/
        Budibase 是一个开源的低代码平台,帮助 IT 专业人士在几分钟内在自己的基础架构上构建、自动化和交付内部工具。它专注于为开发人员提供工具,以加快一个平台内的开发、部署和集成过程。
        图片
        项目地址:https://www.oschina.net/p/budibase
        3、Baserow 开源 Airtable 替代品
        图片

        许可证:MIT
        开发语言:Python
        官网:https://baserow.io/

        Baserow 是一个 Airtable 的开源替代品,是一个开源的在线表格应用,其单元格支持各种各样的数据类型。用户可以使用这个无代码的平台来创建一个数据库,而无需任何开发技能。

        Baserow 是一种用于动态创建、管理数据库和构建数据库应用程序的迷人工具。它具有确保高生产力和可用性的功能。

        因为 Baserow 是一个模块化系统,它提供了一个完整的 REST-API 无头系统,所以它吸引了移动开发人员的注意,将其用作他们应用程序的后端。

        图片
        项目地址:https://www.oschina.net/p/baserow
        4、CUBA-Platform 企业级应用开发平台
        图片
        许可证:Apache-2.0
        开发语言:Java
        官网:https://www.jmix.cn/
        CUBA 平台是一个面向企业的开源快速应用开发系统。它带有数十种工具作为 IDE、应用程序构建工作室、CLI 命令行界面和可靠的可扩展基础设施。CUBA 平台有一个丰富的插件系统,其中包含一个 BPM(业务流程管理)附加组件,需要花费一些时间来构建和安装。
        图片
        项目地址:https://www.oschina.net/p/cuba-platform
        5、Digdag 多云工作流引擎
        图片
        许可证:Apache-2.0
        开发语言:Java、JavaScript、Python
        官网:https://www.digdag.io/
        Digdag 是一个简单的工具,帮助你建立、运行、安排和监控复杂的任务管道。它可以处理依赖性问题,使任务串联或并行运行。
        Digdag 取代了 cron,促进了 IT 运营自动化,协调了数据工程任务,协调了机器学习管道,等等。
        Digdag 旨在实现易于部署、多云设置和模块化的结构来构建和扩展业务应用。拥有一系列企业功能,包括丰富的管理面板、多语言支持、错误处理、配置工具和版本控制工具。该解决方案采用 Java 和 Node.js 开发,支持 AWS、私有云、IBM 云和 Digital Ocean。
        项目地址:https://www.oschina.net/p/digdag
        6、Jeecg-Boot 基于代码生成器的 J2EE 开发平台
        图片
        许可证:Apache-2.0
        开发语言:Java、JavaScript
        官网:http://www.jeecg.com/
        JeecgBoot是一款基于BPM的低代码平台!前后端分离架构 SpringBoot 2.x,SpringCloud,Ant Design&Vue,Mybatis-plus,Shiro,JWT,支持微服务。强大的代码生成器让前后端代码一键生成,实现低代码开发。
        JeecgBoot引领新低代码开发模式 OnlineCoding-> 代码生成器-> 手工MERGE, 帮助Java项目解决70%的重复工作,让开发更多关注业务,既能快速提高效率,节省研发成本,同时又不失灵活性。一系列低代码能力:Online表单、Online报表、Online图表、表单设计、流程设计、报表设计、大屏设计 等等...
        项目地址:https://www.oschina.net/p/jeecg-boot
        7、JEPaaS 低代码快速开发平台
        图片
        许可证:AGPL
        开发语言:Java
        官网:https://www.jepaas.com/
        JEPaaS 是一款国内实用型低代码快速开发平台,11 年技术沉淀,百余人开发团队不断维护升级,是国内中大型企业信息化御用平台。
        可视化的开发环境,低代码拖拽式配置开发,操作极其简单,可以大幅度帮助企业缩减人力和时间成本。支持工作流、IM 即时通讯、bi 图表报表、APP 开发、对接微信、钉钉…… 是国内老牌靠谱开发平台。
        图片
        项目地址:https://www.oschina.net/p/jepaas
        8、Metabase 公司团队数据分析工具
        图片
        许可证:AGPL
        开发语言:Clojure、JavaScript、TypeScript
        官网:https://www.metabase.com/
        Metabase 是一个简单、开源的方式,通过给公司成员提问,从得到的数据中进行分析、学习。Metabase 是一个无代码和低代码的开源 (Libre) 项目,它消除了从数据库中获取有洞察力的数据的所有麻烦。它不需要处理 SQL 代码甚至不需要知道任何 SQL 就可以完成很多工作。
        Metabase 是一个开源的面向数据的可定制仪表板,支持广泛的数据库后端,如 MongoDB、MySQL、PostgreSQL、SQL Server、Oracle 等。它提供了一个用于管理数据库记录、操作数据、操作记录的可视化方法、支持连接、多重聚合、高级过滤和全文搜索的层。它是在几分钟内为企业创建具有高生产力和可用性的高效数据库就绪仪表板的终极解决方案。
        图片
        项目地址:https://www.oschina.net/p/metabase
        9、OpenXava Java 快速 Web 开发套件
        许可证:LGPL
        开发语言:Java
        官网:https://www.openxava.org/
        OpenXava 是一个低代码应用程序构建平台,主要关注生产力、简单性和可用性。作为一个使用 Java 技术构建的跨平台系统,它运行在 Linux 和 Windows 服务器上。它可能看起来像一个遗留系统(stated 2005),但它仍然是许多企业的首选。
        OpenXava 确保了高生产力、较短的功能学习曲线、大量的企业功能以及完整的移动和平板电脑响应式布局。OpenXava 是一个免费的开源社区版,但企业可以购买不同的额外功能版本。
        图片
        项目地址:https://www.oschina.net/p/openxava
        10、Saltcorn 无代码数据库管理器 Web 应用程序
        图片
        许可证:MIT
        开发语言:Python、JavaScript
        官网:https://saltcorn.com/
        Saltcorn 是一个无代码数据库管理器 Web 应用程序。它是一个完整的端到端解决方案,适用于你的应用程序的前端、后端和数据库,它以直观的点选、拖放用户界面管理你的应用程序生命周期的构建和托管阶段。
        它配备了一个引人注目的仪表板、丰富的生态系统和视图构建器以及可主题化的界面。几乎没有编码经验的用户可以在几分钟内构建一个丰富的交互式数据库应用程序。公司也可以使用它来创建日常使用的工具并即时重新塑造它们。
        Saltcorn 有一个令人印象深刻的示例应用程序列表,其中包括:博客、地址簿、项目管理系统、问题跟踪器、wiki、团队管理等。
        图片
        项目地址:https://www.oschina.net/p/saltcorn
        11、Skyve 业务软件构建平台
        图片
        许可证:LGPL
        开发语言:Java、JavaScript、TypeScript
        官网:https://skyve.org/
        Skyve 是一个开源的业务软件构建平台。它支持无代码和低代码的快速应用开发。支持不同的数据库引擎:MySQL、SQL 服务器和 H2 数据库引擎。其开发人员目前正在努力支持 PostgreSQL 和 Oracle。Skyve 提供了丰富的 API 集,以及低代码开发应用构建向导。
        项目地址:https://www.oschina.net/p/skyve
        12、ToolJet 低代码框架
        图片
        许可证:GPL-3.0
        开发语言:JavaScript、TypeScript
        官网:https://www.tooljet.com/
        ToolJet 是一个开源的低代码框架,无需工程团队付出太多努力即可快速构建和部署内部工具。你可以连接到你的数据源,例如数据库(如 PostgreSQL、MongoDB、Elasticsearch 等)、API 端点(ToolJet 支持导入 OpenAPI 规范和 OAuth2 授权)和外部服务(如 Stripe、Slack、Google Sheets、Airtable)并使用预先构建的 UI 小部件来构建内部工具。
        图片
        项目地址:https://www.oschina.net/p/tooljet



        本文所述软件已收录至 Awesome 软件集锦:https://www.oschina.net/project/awesome?columnId=40


        目录

        1、云程低代码平台

        2、ClickPaaS

        3、阿里云宜搭

        4、华为云AppCube

        5、腾讯云微搭

        6、百度爱速搭

        7、网易轻舟

        8、字节飞书多维表格

        9、用友YonBuilder

        10、金蝶苍穹云平台

        11、泛微平台

        12、蓝凌低代码平台

        13、简道云

        14、轻流




        今天给大家分享国内常见的14款低代码平台欢迎收藏


        1、云程低代码平台

        • 云程平台是一款基于springboot+vue.js的低代码开发平台。采用微服务、前后端分离等标准云原生架构基于可视化业务建模、流程建模、表单建模、页面建模、报表建模、大盘建模、移动端建模等工具零代码快速构建云端业务应用 平台即可本地化物理机或虚拟机部署也可基于华为云、阿里云、企业私有云方式部署。云程平台也是一款专业的BPM软件即可独立部署支撑企业级端到端流程落地也可嵌入到您的OA、ERP等系统中作为流程引擎组件使用。云程平台主要目的让开发者注重专注业务降低技术难度从而节省人力成本缩短项目周期提高软件安全质量为企业信息化建设降本增效。云程研发团队核心成员有10年以上的软件研发经验聚焦于低代码平台、流程引擎等中间件产品研发即可输出平台产品和组件也可交付平台源代码。核心能力包括

        • 业务建模基于元数据模型驱动开发的思想提供灵活、稳定的元数据模型建模与管理通过数据实体、属性、关系等元数据配置响应业务需求变化云程平台提供了在线的数据库实体建模和E-R建模功能支持单表、一对一、一对多关系。

        • 表单建模在线可视化化表单设计器可快速建符合业务的表单用于数据采集和流程审批在线预览所见即所得。

        • 页面建模提供可视化配置功能支持单表、主子表、树等多种模板基于组件化组合思想可构建复杂页面功能并可配置页面查询框、操作按钮等功能。

        • 流程建模BPMN2.0规范可视化拖拉拽流程设计会签、加签、跳转、退回、撤销等多种流程操作配置即用用户、部门、角色、岗位、 关系等多种选人方式符合中国特色组织选人需求。

        • 报表建模报表设计器是一款在线可视化报表建模工具提供了汇总表、明细表、柱形图、条形图、饼图、折线图、面积图、雷达图、指标图等多种种常用图表可以组合及联动使用。设计器采用拖拽操作的风格简单易用能够实时展示配置效果一目了然。

        • 门户建模拖拉拽方式设计首页无需编码多种布局风格可自由布局支持多角色门户不同角色不同首页在线预览所见即所得。

        • 大屏建模无需写代码在线可视化设计大屏支持图表、表格、媒体等20+常用组件支持静态数据、HTTP、SQL等多种获取数据方式。

        • *移动建模云程移动APP是一款轻量化的移动办公软件可以在线设计流程和表单开发应用无需手写代码可自动生成移动端界面极大提升了移动应用开发效率。

        • *数据服务化无需开发Controller、Service、Dao、Mapper、XML、VO等Java对象一键即可生成HTTP API接口跟Swagger无缝结合生成标准RESTful接口文档。


        官网http://www.yunchengxc.com/

        2、ClickPaaS

         


        • 上海爱湃斯科技有限公司以下简称ClickPaaS是一家企业级低代 码开发平台公司以帮助更多组织更快速度、更易迭代、更低成 本建设关键业务系统为使命专注于领域模型驱动开发帮助中大 型企业快速搭建核心业务系统同时赋能生态伙伴快速实现定制化 垂直行业解决方案助力其开拓新的业务增量。ClickPaaS依托完全 自主研发的低代码开发平台携手一众合作伙伴广泛服务于工程 基建、跨境物流、敏捷政务、创新金融、智能制造等领域头部客户 的数智化战略转型。

        • ClickPaaS平台提供高性能PaaS、aPaaS、iPaaS组合的产品以及以此为基础的应用模板库服务各类企业不同的IT诉求、SaaS产品的进化以及IT和管理咨询公司项目落地的需求。企业数字化转型对技术平台的要求必然是敏捷搭建加大集成反映到PaaS层就是以高性能PaaS为地基需要具备应用创建PaaS(aPaaS)和应用集成PaaS(iPaaS)功能其中aPaaS通过业务模型构建满足各种业务场景应用iPaaS通过非代码方式完成应用之间数据匹配、数据转换和数据管理。

        • 其中高效能应用平台hpaPaaS(High-Productivity Application PaaS)是极具效率的应用生成平台使IT部门可以与业务部门密切合作快速交付应用并高效实现企业的数字化流程快速响应业务变化。

        • aPaaS是创建器ClickPaaS提供了业务流设计器、模型设计器、运维工具、报表设计器、页面设计器、模板设计器、规则设计器等工具快速创建快速响应变化。

        • iPaas是一个全方位集成平台可以连接不同的异构系统为客户提供统一的系统集成解决方案并拥有丰富的原生组件、生态组件、自定义组件为个性化的复杂对接场景提供保障。


        官网https://www.clickpaas.com/

        3、阿里云宜搭

        • 2021 年 10 月在 2021 云栖大会低代码分论坛 上钉钉宜搭负责人 - 阿里巴巴资深技术专家叶周全花名骁勇发布钉钉宜搭 3.0 版本主打易连接、酷数据、更安全。钉钉上的低代码应用数突破 120 万其中宜搭应用数破 100 万低代码让越来越多的企业和组织找到了高效、低成本的数字化创新路径也让个体的需求得到了满足让个人更有获得感。

        • 宜搭是阿里巴巴自研的低代码应用构建平台通过可视化拖拽的方式传统模式下需要 2 周才能完成开发的应用用宜搭 2 小时就能完成。在宜搭模版市场我们为大家准备了一些免费应用模版你只需选择一个模版修改个别文案一分钟就能搭建一款专属应用体验人人都是开发者的乐趣。宜搭核心功能包括

        • 应用可视化搭建宜搭提供了大量的图形化的开发组件用户通过拖拽和配置无需代码或仅需少量代码就能快速完成应用的搭建。不懂代码的业务人员如 HR、财务等也可以成为开发者。

        • 应用量身定制通过表单、流程、数据能力搭建更贴合业务需求的应用把身边每一件事数字化。

        • 集成云原生+钉原生能力打通阿里云和钉钉的底层能力和技术将企业原有系统与钉钉连接降低企业数字化门槛。


        官网https://www.aliwork.com/

        4、华为云AppCube

        • 应用魔方 AppCube是华为云为行业客户、合作伙伴、开发者量身打造的低代码应用开发平台提供全场景可视化开发能力和端到端部署能力可快速搭建行业和大型企业级应用并沉淀复用行业资产加速行业数字化。

        • 应用魔方 AppCube以下简称AppCube是低代码应用开发平台源于华为应用开发和数字化转型的实践提供了云上无码化、低码化、支持多码化的应用开发模式屏蔽了技术的复杂性提升了企业开发的效率。同时提供应用资产的开发标准和微服务框架助力企业不断沉淀可复制的套件加速应用的定制并通过开放的生态实现套件资产的商业变现。应用魔方顾名思义就如同魔方一样可以通过任意组合排列各种模块化元素创建功能各异的应用。通过应用魔方 AppCube提供的界面、逻辑、对象等可视化编排工具以“拖、拉、拽”的方式来快速构建应用从而实现所见即所得的快速应用开发和构建。

        官网https://www.huaweicloud.com/product/appcube.html

        5、腾讯云微搭

         

        • 腾讯云微搭低代码是高效、高性能的拖拽式低代码开发平台。腾讯云微搭低代码以云开发作为底层支撑提供高度开放的开发环境将繁琐的底层架构和基础设施抽象化为图形界面通过行业化模板、拖放式组件和可视化配置快速构建多端应用小程序、H5 应用、Web 应用等免去了代码编写工作让您能够完全专注于业务场景。

        • 腾讯云微搭低代码提供了应用开发的一站式低代码开发服务从底层能力迭代至行业级方案云原生全链路支撑为您的应用保驾护航让您能够完全专注于业务场景小白也可以极速搭建出成熟、专业的应用。

        • 腾讯云微搭的产品优势是与腾讯生态的完美结合。微搭基于腾讯云底层资源/技术/生态赋能

        • 多环节耦合微信生态能力实现外部客户运营和营销打通企业微信能力实现内部客户沉淀链接腾讯会议、腾讯文档、微信支付、腾讯广告等腾讯内部生态。


        官网https://cloud.tencent.com/product/weda

        6、百度爱速搭

         

        百度爱速搭低代码平台作为可与百度 AI 生态能力和企业自有技术平台深度对接的 APaaS 应用开发底座以 “随想即现、随需而变” 的核心价值定位、广泛的应用场景、敏捷高效的应用构建能力和极低的运维成本加倍提升开发与落地效率打破传统数字化实践的困境引领企业数字化转型。

        爱速搭最初用户是百度内部开发者因此它最重要的设计理念是「开发者优先」。

        我们认为面向非开发者的零代码平台使用场景有限只能做简单的办公应用大部分时候还不如在线 Excel 简单方便因此爱速搭不是零代码平台它面向的是有一定开发经验的用户。爱速搭低代码平台的目标不是取代开发者而是辅助开发者更高效地完成工作。爱速搭前端使用了自主开发的开源项目 amis爱速搭后端的数据模型是基于传统数据库。

        因为重视开发者爱速搭比起其它低代码平台有三个显著特点

        灵活性高我们重视灵活性和功能可扩展让开发人员可以最大程度发挥而不是为了易用性处处设限这点在后续的前端和后端设计中都有体现。

        开放和透明低代码平台最大的风险是技术锁定和黑盒作为开发者我们自己也不喜欢封闭的低代码平台因此爱速搭重视开放性前端方面渲染器开源了后端方面也选择了开发人员最熟悉的传统数据库技术没有中间层对开发者是透明的并且爱速搭后端不依赖任何云厂商可以部署到任意环境。

        架构上松耦合比起大而全的集成系统我们选择了松耦合的架构这样能让开发者有更多选择可以选择只用前端、只用可视化编辑器、只用后端可以很好和现有开发结合。

        官网https://suda.baidu.com/

        7、网易轻舟


         

        • 网易轻舟低代码平台帮助企业快速搭建云原生应用的低代码平台提供强大的数据模型构建能力、灵活易用的可视化编程语言帮助构建多层次细粒度企业数字化资产。

        • 数据模型通过实体、数据结构、枚举等构建低代码数据模型。可视化定义数据之间的关联关系平台自动生成数据库表和通用接口。

        • 页面视图基于模板创建页面或在空白页面上通过拖、拉、拽组件的方式完成页面搭建。平台提供标准化组件以及组件扩展能力可维护自有组件库。

        • 逻辑编辑平台提供逻辑单元可使用搭积木的方式完成逻辑判断、接口调用、逻辑调用等前后端逻辑功能。

        • 接口开放企业存量接口可通过低代码平台快速导入并自动接入 API 网关。提供可视化定义接口能力并将接口自动接入 API 网关。

        • 工作流程集成流程引擎支持 BPMN2.0 规范的业务流程开发并在此基础上进行了模型和符号标准化。可支持常规流程的快速开发如请假、入职、离职等企业内常用流程。

        • 数据统计可通过拖拽组件的方式实现折线图、柱状图、饼状图、散点图也可在有数 BI 产品上完成从数据到模型再到报表的设计低代码可以直接将生成的复杂报表集成到应用中。


        官网https://sf.163.com/product/lcap

        8、字节飞书多维表格

         


        • 字节跳动飞书多维表格是一款以表格为基础的新一代效率应用。它具备表格的轻盈和业务系统的强大融合了在线协作、信息管理和可视化能力能够自适应团队思维和业务发展需求是具备个性化能力的业务管理工具。

        • 设置高级权限保障表格数据安全性精细到每行每列权限。

        • 智能的自动化流程让企业级业务流转高效、及时、全自动。

        • 使用直观清晰的仪表盘汇总各数据表数据洞察稳坐数据驾驶舱。

        • 一键生成表单视图解决各类信息收集问题充分释放人力。

        • 将强大的 API 能力与企业内部系统打通让数据驱动业务助力企业分布式组织转型。

        • 飞书多维表格多维表格能用表格视图、看板视图、甘特视图、画册视图和表单视图5种呈现同一个数据源。所有放入多维表格的数据都能被实时转换为不同形式可一键切换不同视图满足各部门人员的查阅需求。


        官网https://www.feishu.cn/hc/zh-CN/articles/796815692857

        9、用友YonBuilder

         



        • YonBuilder在用友内部从2016年开始开发和实践持续积累各种业务组件、可视化设计器、规则引擎。2019年用友的云 ERP 套件 YonSuite 发布YonBIP 的核心云服务经完成了向 iuap5. 0统一平台底座的迁移而这个底座就是 YonBuilder是其云原生开发层和 MDD 驱动层。现在YonBuilder 面向开发者提供完整覆盖设计开 发 、 测 试开发、测试部署、运维&升级的能力。同时YonBuilder 还会和用友其他产品线配和。如 YonLinker 面向开发者提供的服务集成在 YonBuilder 中面向开发者一体化提供YonBuilder 构建的成果可以发布到云市场 YonStore 来推广形成开发者服务的商业闭环。

        • YonBuilder提供企业级全能基础设施帮助用户通过“零安装低编码可视化”来构建适用于不同场景的应用拖拽式开发web应用、移动应用、小程序加速业务创新转化。并提供向导和大量应用模板快速轻松构建企业应用程序满足用户想象力激活更多商业潜能。具体来说 YonBuilder 是基于数据和模型驱动的低代码或无代码的开发平台从四个层次提供支持

        • 1、业务管理为核心。YonBuilder 提供从数据模型定义、页面模型、流程模型、业务规则、到多端应用发布的支持这些都是以数据为驱动整个业务过程都能够业务管理人员通过无代码方式设计和配置完成或者通过反向建模的能力直接在设计器上画出页面通过设计器的能力反向生成数据模型和流程。

        • 2、以业务控制为目标的主要功能。业务人员完成的页面、流程、规则实现了业务的基础逻辑控制如果需要更加个性化的交互控制、数据检查、调用三方系统企业中的多系统关联、企业应用社会的服务就由有 coding 能力开发的人员来完成形成接力棒的效果。

        • 3、YonBuilder 本身提供了完整的脚本能力和脚手架。通过脚本片段和脚本向导也能够大规模提升开发人员的效率。此外 YonBuilder 还提供扩展机制比如组件中心能够帮助开发人员扩展组件使应用更贴近业务。

        • 4、YonBuilder 将用友的全部服务和应用组合后提供给用户。从业务应用、业务报表、数据可视化、分析&预测都能一套平台通过完整的元数据提供支持。

        官网https://developer.yonyoucloud.com/

        10、金蝶苍穹云平台

         

        • 金蝶云·苍穹 开发服务云基于金蝶独创的第四代动态领域模型(KDDM)开发服务云提供动态建模工具支持可视化配置、低代码开发轻松构建基于微服务架构的自定义应用。为云应用(SaaS服务)的开发、部署、运行及运营提供一系列服务及管理工具涵盖微服务组件、开发服务、运行服务、服务管理、API服务框架、应用建模、云支撑服务与运维服务等。金蝶云·苍穹 开发服务云基于动态领域模型提供动态建模工具支持可视化配置、低代码开发轻松构建基于微服务架构的自定义应用。

        • 动态领域模型是金蝶将多年企业级应用经验沉淀结合“企业架构EA、模型驱动架构MDA、领域驱动设计DDD”等企业建模思想所形成的一套企业业务建模体系和方法论解决了企业级软件研发效率、一致性、安全、共性与个性、IT资产化的一系列难题是低代码开发平台的核心基础。


        官网https://www.kingdee.com/products/cosmic_development_services.html


        11、泛微平台

        • 泛微以“组织权限引擎、建模引擎、流程引擎、集成引擎、内容引擎、门户以及消息引擎”等7大引擎为支撑帮助组织打造开放共享的低代码应用构建平台。

        • 快速构建能力是泛微低代码构建平台的重要特性组织通过后台引擎配置方式拖拉拽即可构建个性化应用场景。灵活的表单设计、流程搭建功能还有在线调试、智能修改功能让应用搭建更加方便、智能。

        • 泛微低代码平台实现了内部协同确保内部流程、门户、文档、数据、角色之间的协同关联点击任何一个字段即可追溯与之相关的数据及工作内容了解业务全貌。通过泛微低代码业务构建平台组织可以在一个平台连接、扩展和集成ERP、CRM、HRM、SRM等应用。

        • 在平台能力的基础上泛微提供了“应用共享商城”的运营模式与客户时时互联、共享应用成果。并且直接获取用户的需求和想法第一时间了解市场需求进一步满足不同组织的需求大大缩短了和客户的距离。泛微应用商城里已有上百种各类场景应用包括共享复用的元素、组件、表单、模版、门户、应用等组织可以自由选择各种已经构建好的应用查找安装即可使用。


        官网https://eteams.cn/appbuilder


        12、蓝凌低代码平台


        • 蓝凌软件成立于2001年是生态OA引领者、数字化工作专业服务商、 深圳500强企业为各类组织提供智能办公、移动门户、知识管理、 数字经营、财务共享等一体化解决方案。

        • 蓝凌软件是国内知名的知识管理、协同OA服务品牌。在协同办 公市场创造出较高的知名度也是最早与互联网TOB生态走的 最近的老牌协同厂商。2015年蓝凌软件与钉钉达成战略合作直至2018年钉钉注资 蓝凌软件与钉钉生态开始紧密结合由于其过往的大量大客户 项目经验和产品服务的积累蓝凌软件在基于大客户的“表格 +流程+数据”的低代码服务领域构筑一定的先发优势形成了 对钉钉生态的市场补充。蓝凌软件水桶型产品特征比较突出作为一个老牌协同OA品牌 蓝凌软件将低代码作为能力之一输出给客户的倾向更浓如何 定位/平衡“低代码”的产品化路径将是蓝凌的挑战之一。


        核心优势

        • UI、移动组件丰富调用更方便

        • 蓝凌低代码平台封装丰富UI和移动组件减少专业美工依赖利于界面风格统一移动化组件调用让应用移动化更方便。

        • 可视化表单、流程设计门槛低

        • 支持流程表单和无流程表单两种类型拖拽布局、控件即可生成表单根据需求绘制自定义流程图快速搭建工作流业务人员也可以快速上手。

        • 规则配置化灵活应对业务变化

        • 基于平台所带规则引擎轻松完成业务表单关系设计、触发动作设计、业务操作设计更敏捷响应业务变化。

        • 动态生成多图表支撑数据分析

        • 集成原生图表引擎支撑列表统计、图表统计、图表集统计等可动态生成各类业务报表让应用分析更方便。

        • 精细化权限设计让应用更安全

        • 支持角色权限、数据管理、数据权限、字段权限等精细化管理确保不同场景下的数据与应用安全。

        • 支持全面移动化应用随时随地

        • PC建模与移动建模结合PC建模拥有MK-PaaS各机制服务深化业务需求移动建模采用前后端分离技术让业务创新在移动端随时发挥作用。

        官网http://www.landray.com.cn/static-old/solution/didaima/index.html


        13、简道云

        • 简道云是帆软软件有限公司旗下的一款软件。简道云提供表单、流程、分析仪表盘、知识库等功能模块。管理员无需代码即可构建出符合需求的业务管理应用如生产管理、进销存、订餐等应用。员工可以在电脑、手机上接收简道云消息、处理业务。

        • 数据可视化和分析仪表盘是简道云的核心功能在表单中收集得到的数据可通过仪表盘来进行查看、分析和处理。仪表盘由 数据组件、文本组件、图片组件 以及 筛选组件 组成其中数据组件包含种类丰富的图表类型管理员可以根据实际需要选择图表类型进行仪表盘统计看板的搭建。仪表盘中提供了多种样式的图表可以通过明细表、数据透视表等查看表单数据的明细和汇总通过柱形、折线、图形、雷达图等可以对数据进行处理显示出数据的发展趋势、分类对比等结果。

        官网https://www.jiandaoyun.com/

        14、轻流

         


        • 轻流是上海易校信息科技有限公司出品的一个无代码开发平台也是一个云端的无代码业务流程管理平台提供轻流业务流程SaaS工具不需要开发就能够创建在线的业务流程管理系统同时将云端业务流程顾问与企业进行对接输出基于轻流的业务流程解决方案。轻流QingFlow内置了强大的表单引擎、流程引擎、报表引擎通过自动化业务机器人Q-Robot进行串联并且提供了丰富的拓展插件以及开放接口“乐高式”的操作体验让你的想法立刻成为现实。企业信息化·有轻流就够了。

        • 表单引擎像“乐高”一样拖拽式设计表单字段类型丰富还可以定义表单样式设置数据联动、公式函数、逻辑规则、来源标记等强大、实用且美观。自定义您的企业数据入口。

        • 流程引擎创新强悍的工作流引擎为业务高效流转提供了坚实的技术支持可视化的流程设计界面易于上手、无比强大无需代码即可轻松创建、改变、维护业务流程应用。

        • 报表引擎通过业务流程自动化积累大量业务数据设置可实时查看的报表、仪表盘 让你从各方面一目了然业务现状工作效率成倍提升。


        官网https://qingflow.com/