DragonOS 多核负载均衡

什么是负载均衡

操作系统中CPU有多个核,(为了方便介绍,后续称为多个CPU),为了减少每个CPU之间的干扰,每个CPU上都有对应的运行队列。整个操作系统运行的过程中,可能存在有的CPU非常忙,有的CPU非常闲,因此需要有负载均衡来平衡各个CPU之间的负载。

将pcb从负载较重的CPU上转移到负载相对较轻的CPU上执行,这个过程就是负载均衡

常见负载均衡方法

负载均衡的发展历程如下:

  1. 根据运行队列的长度作为当前的负载
  2. 计算过去一段时间的运行的队列数量,加权作为负载

本文使用方法

根据过去一段时间的运行队列的活跃程度,以及对应进程的权重作为负载的主要参数

  1. 设置一个load_list用来存放当前核上的pcb加入队列的时钟数
  2. 计算每个核的过去一段时间的运行队列数量
    1. 在进行入队操作时,通过rdtsc()获取当前的时钟,并将当前时钟加入load_list
    2. 将队首元素中与当前时钟差距大于一个临界值的全部出队列
  3. 获取CPU的的负载时,只需要获取对应的load_list的长度即可
  1. 关于临界值的判断

假设load_list队首元素的值为a,当前时钟数为b,当前系统的CPU频率为2.5GHZ,那么(a-b)/2.5×10^9^即为两次入队操作经过的时间,假设我们的临界值为t,t的意义为统计过去t秒的CPU的负载情况,那么需要 (a-b)/2.5×10^9^>t 是临界情况。

由于操作系统内核不能做浮点运算,将其调整为 (a-b)>t×2.5×10^9^ 作为临界情况

  1. 关于时钟数面临被重置导致b<a,经查阅发现rdtsc() 获取的时钟数占据了64位,假设在2.5GHZ的CPU上跑,需要跑两百多年才会归零,因此可以忽略此问题。

image-20230311174759773

参考链接

使用rdtsc测量函数的执行时间 - 简书 (jianshu.com)

细说RDTSC的坑 – Dreamer Thinker Doer (wangkaixuan.tech)


DragonOS 多核负载均衡
https://kkkkkong.github.io/posts/46077.html
作者
Kong Weichao
发布于
2023年3月11日
许可协议