CFS 调度器两种调度类型普通调度 和 组调度

在 Linux 的 CFS(Completely Fair Scheduler) 调度器中,确实存在两种调度类型:普通调度组调度。这两种调度类型分别适用于不同的场景,并通过三个关键维度(权重、抢占优先级、最大配额)来影响程序对 CPU 资源的使用。以下是对这些概念的详细解析:


1. 普通调度与组调度

(1)普通调度
  • 普通调度是指直接针对单个任务(进程或线程)进行调度。
  • 不涉及 cgroup(Control Group),即没有将任务分组管理。
  • 适合简单的应用场景,比如运行独立的任务。
(2)组调度
  • 组调度是基于 cgroup 的调度方式,允许多个任务被组织到一个组中,并以组为单位分配 CPU 资源。
  • 这种方式特别适合需要资源隔离或按组分配资源的场景,例如容器化环境(如 Docker、Kubernetes)。
  • 在 cgroup 中,可以定义组级别的资源限制和优先级,从而实现更精细的资源管理。

2. 影响 CPU 资源使用的三个维度

在 CFS 调度器中,无论使用普通调度还是组调度,都会通过以下三个维度来影响任务对 CPU 资源的使用:

(1)权重(CPU Weight)
  • 含义
    权重决定了任务或组在 CPU 时间分配中的比例。权重越高,任务获得的 CPU 时间越多。
  • 实现机制
    • 在普通调度中,权重由任务的 nice 值 决定,范围为 -20(最高优先级,权重最高)到 +19(最低优先级,权重最低)。
    • 在组调度中,权重由 cgroup 的 cpu.weight 参数控制,范围为 1 到 10000,默认值为 100。
  • 示例
    如果有两个任务,A 的权重为 200,B 的权重为 100,则 A 获得的 CPU 时间是 B 的两倍。
(2)抢占优先级(CPU Latency)
  • 含义
    抢占优先级决定了任务之间的响应时间,或者说调度器允许任务等待的最大延迟。
  • 实现机制
    • 在 CFS 中,调度器会根据任务的历史行为动态调整其抢占优先级。
    • 对于 I/O 密集型任务(如文件读写),调度器会优先让它们运行,因为它们通常会快速释放 CPU。
    • 对于 CPU 密集型任务(如计算密集型任务),调度器会让它们运行更长时间,减少上下文切换的开销。
  • 影响
    • 较低的 CPU Latency 表示调度器会更频繁地切换任务,从而提高响应速度。
    • 较高的 CPU Latency 表示调度器会让任务运行更长时间,减少上下文切换,但可能会降低响应速度。
(3)最大配额(CPU Quota)
  • 含义
    最大配额限制了任务或组在一定时间周期内可以使用的最大 CPU 时间。
  • 实现机制
    • 在普通调度中,最大配额通常不直接设置,而是通过系统的整体负载动态调整。
    • 在组调度中,最大配额由 cgroup 的 cpu.cfs_quota_uscpu.cfs_period_us 参数控制:
      • cpu.cfs_quota_us:指定一个周期内任务或组最多可以使用的微秒数。
      • cpu.cfs_period_us:指定时间周期的长度(默认为 100ms)。
    • 示例:
      • 如果 cpu.cfs_quota_us = 50000cpu.cfs_period_us = 100000,则该任务或组每 100ms 最多可以使用 50ms 的 CPU 时间。
  • 用途
    • 用于限制任务或组的 CPU 使用量,防止某个任务或组占用过多资源。
    • 在容器化环境中,最大配额常用于保证不同容器之间的资源公平性。

3. 总结对比

维度 描述 适用场景
权重(CPU Weight) 决定任务或组在 CPU 时间分配中的比例,权重越高,分配的 CPU 时间越多。 需要按比例分配资源的场景,如多个容器共享 CPU。
抢占优先级(CPU Latency) 决定任务之间的响应时间,动态调整任务的运行时间,优先响应 I/O 密集型任务。 需要平衡响应速度和系统效率的场景,如桌面系统。
最大配额(CPU Quota) 限制任务或组在一定时间周期内可以使用的最大 CPU 时间,防止资源过度占用。 需要资源隔离或限制的场景,如容器化环境。

4. 总结

  • 普通调度

    直接针对单个任务进行调度,适合简单的应用场景。通过权重、抢占优先级和最大配额来动态分配 CPU 资源。

  • 组调度

    基于 cgroup 的调度方式,允许多个任务被组织到一个组中,并以组为单位分配 CPU 资源。通过 cgroup 的参数(如 cpu.weightcpu.cfs_quota_uscpu.cfs_period_us)来实现精细化的资源管理。

  • 三个维度

    • 权重:决定资源分配的比例。
    • 抢占优先级:决定任务的响应速度。
    • 最大配额:限制资源的使用上限。

通过这三个维度,CFS 调度器能够在多任务环境下实现高效的资源分配,同时满足不同场景的需求(如响应速度、资源隔离等)。

相关推荐
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS2 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
codeejun2 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
赵文宇(温玉)2 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang2 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren2 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
忆~遂愿2 天前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器
Thneonl2 天前
你的 Pod 为什么 Pending:调度器两阶段
后端·kubernetes
不吃香菜kkk、2 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove2 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21