架构设计 ​

📌软件定位 ​


部署视图 ​

部署视图


软件模块 ​

软件模块


外部依赖 ​

外部依赖


关键业务 ​

关键业务流程: 采集并调度CPU资源, 实现虚机vCPU绑核使用

调度与整理并发处理

调度与整理设计思路 ​

调度 ​

原则:

  1. 无法调优的虚拟机不做管理
  2. vCPU不支持跨numa CPU绑定
  • 初步筛选

    plantuml
    @startuml
    start
    if (vCPU数量 > numa_cpu_num) then
        :跳过本虚拟机;
        stop
    endif
    :根据vCPU绑定范围, 计算交集获得可用绑定范围;
    repeat
        :选择资源足够的numa(vCPU数量 < numa空闲cpu数量);
    repeat while (可用绑定范围)
    if (无可用的numa) then
        :跳过本虚拟机;
        stop
    endif
    stop
    @enduml
  • 申请

    • vCPU数量超过cluster_cpu_total:即一定会跨cluster, 则要求尽可能分配完整空闲的cluster, 否则放弃调优exp: vCPU = 12; cluster_cpu_total = 8; 只有一种调优结果, 8 + 4; 分两个cluster调优
    • vCPU数量不超过cluster_cpu_total:即一定不会跨cluster, 则只能接收分配在一个cluster内, 否则放弃调优exp: vCPU = 6; cluster_cpu_total = 8; 只有一种调优结果, 一个cluster中分配6个
    plantuml
    @startuml
    start
    repeat
        repeat
            :虚机可用绑定范围 与 当前cluster可用范围取交集;
            if (待申请vCPU数量 > cluster的数量) then
                :本次向cluster申请cpu = cluster_cpu_total;
            else
                :本次想cluster申请cpu = 待申请vCPU数量;
            endif
            :从可分配的交集中, 申请cpu;
            if (申请成功) then
                break
            endif
        repeat while(遍历numa中所有cluster)
        if (当前numa中没申请到vCPU) then
            if (超分场景 && 超分比例未到上限) then
                :增加一层超分, 重新申请;
            else
                :申请失败;
                stop
            endif
        else
            :申请vCPU数量 -= 本次申请数量;
        endif
    repeat while(待申请vCPU数量 != 0)
    stop
    @enduml

整理 ​

整理依旧需要满足调整的目标cpu在虚机可绑定的范围中

  • 1.cluster内整理

    cluster内整理

  • 2.cluster间整理

    cluster间整理

重调度 ​

即释放申请的资源, 再重新调度 exp: VM1 0; VM2 1-2; 当VM1虚拟机删除后, 在整理流程中, 不会进行调整. 可以通过reassign, 手动释放再申请. 结果为 VM2 0-1


👍可靠性设计 ​

可靠性场景类型服务分析项影响特性影响分析可靠性保障策略
外部接口可靠性重试virtAwarehSched线性调度服务提供socket中断CLI工具接口CLI工具使用短链接, socket断链, CLI指令执行失败CLI使用短链接, 失败由上层业务重试业务即可
自身服务中断后恢复virtAwarehSched下发CLI指令重调度后, 服务中断重启CLI工具接口业务中断,导致内存中调度队列被清空.丢失本次重调度任务调度任务丢失无需回复, CLI指令失败. 重试指令重新调度即可
自身服务中断后恢复virtAwarehSched定时器触发CPU碎片整理, 服务中断重启自感知调度业务中断,导致内存中调度队列被清空.丢失本次重调度任务定时任务, 重启后立即执行一次全量调度即可
自身服务中断后恢复virtAwarehSched接收到libvirt虚拟机生命事件后, 服务中断重启自感知调度业务中断,导致内存中调度队列被清空.丢失本次重调度任务虚拟机生命周期异步触发的事件, 重启后立即执行一次全量调度即可
自身服务中断后恢复virtAwarehSched服务中断重启自感知调度业务中断,导致调度结果丢失调度任务丢失无需回复. 等待服务启动后, 会对虚拟机进行重新调度
预期内业务失败vasctlCLI指令执行失败CLI工具接口CLI指令执行失败, 功能执行失败CLI接口需要支持幂等调用

🛡安全性设计 ​

安全设计目标 ​

  • 权限最小化
  • 暴露面安全

威胁分析 ​

威胁分析.png

目录/文件权限设计 ​

元素类型owner权限其它说明
元素类型owner权限其它说明
:--------------------------------------------:-------------:----------:-----:------------------------
/usr/bin/vas_daemon可执行文件root:root0500daemon 服务可执行文件
/usr/bin/vasctl可执行文件root:root0500vasctl 运维命令
/usr/lib/systemd/system/vas-daemon.servicesystemd 单元root:root0644服务单元文件
/var/log/vas目录root:root0750日志目录
/var/log/vas/vasd.log日志文件root:root0640运行时日志文件
/var/log/vas/vasd.log.1归档日志文件root:root0440归档日志文件
/var/run/vas目录root:root0700运行时目录
/var/run/vas/vas_uds.sockuds 文件root:root0600ctl与daemon服务通信uds

暴露面设计 ​

  • 基于UDS的对外接口安全设计
  • vas-daemon启动参数安全设计(详见接口设计)
  • vas-cli指令参数安全设计(详见接口设计)
  • 环境变量
  • 依赖动态库

基于UDS的对外接口安全设计 ​

uds对外接口的访问入口/var/run/vas/vas_uds.sock. sock文件的安全访问, 基于文件权限控制, 其属主为root, mod为600, 如下:

shell
srw-------  root root /var/run/vas/vas_uds.sock

环境变量 ​

未指定特殊环境变量, 环境变量继承于root用户环境变量。详见vas-daemon.service。

依赖动态库 ​

依赖动态库包括libvirt.so, libboundscheck.so. 依赖所有库均以root权限安装,不存在引用低权限动态库导致的攻击行为。

依赖动态库.png