CFS调度器(Completely Fair Scheduer),顾名思义,即想要实现多任务在同一硬件上能够被完全公平的调度。内核中对“完全公平”的定义如下:
CFS调度器(Completely Fair Scheduer),顾名思义,即想要实现多任务在同一硬件上能够被完全公平的调度。内核中对“完全公平”的定义如下:
task group,即所谓的任务组调度,旨在解决指定的一组任务如何做CPU带宽控制的问题。
为什么需要对一组任务做带宽控制?或者说什么场景需要这种能力?
调度的目的是要解决在有限资源的情况下如何高效分配资源给消费者的问题。内核中需要调度的地方有很多,比如:对CPU而言,消费CPU的进程需要调度;对IO而言,下发的IO包需要调度;对PMU(perf monitor unit)而言,perf event需要调度,等等。可以说,调度无处不在。本文重点介绍进程的调度框架。对于现今流行的SMP多核架构,本文将从单CPU、任务组、整机SMP三个视角来进行拆解,便于理解其背后的设计原理。
PSI全称为Pressure Stall Information,是一种衡量系统负载压力的方法。PSI所要测量的对象包括cpu、memory和io三部分(在近期的内核6.12+中新加入了irqtime),其测量的粒度是cgroup级别的,当cgroup层级为1时,则测量的是整个系统的负载。对于系统的负载,PSI将压力信息输出在/proc/pressure/{cpu,memory,io},而对于cgroup的负载,压力信息则输出到/sys/fs/cgroup/xxx/{cpu,memory,io}.pressure,具体输出格式为:
前面我们了解了PELT算法,它提供了一种计算任务负载的方式。在linux系统中,除了PELT外,还有另一种观测负载的方式 —— loadavg,具体可以查看/proc/loadavg
文件:
1 | root@ubuntu-server:~# cat /proc/loadavg |
其中,前3个数值分别表示系统在1分钟、5分钟和15分钟的负载。关于负载的作用本文不再撰述,感兴趣的可以翻看前面PELT文章介绍,本文将重点讨论loadavg这三个数值都是怎么计算的,以及为什么这么算。
PELT全称是per-entity load tracking,翻译过来是一种针对entity的负载追踪技术,这里entity是指内核调度模块内的struct sched_entity
,也就是调度单元的基本抽象。而所谓负载追踪,其本质是提供一种衡量负载的指标以及在运行过程中动态计算该指标的方法。
那么,何谓负载?
良好的开发环境可以让内核的学习事半功倍。
由于特殊性,内核无法像普通程序那样直接./xxx
运行,而是需要借助外围工具:qemu启动。除此之外,在启动过程中,内核还依赖了另一个很重要的文件,即rootfs,来为其挂载各类虚拟文件系统和提供shell会话。因此,在搭建开发环境时,我们需分别准备:编译好的内核镜像、rootfs文件以及qemu启动脚本。
本文尝试部署kubernetes集群,并理解该组件能够做什么,什么时候使用。