负载均衡之均衡 何时均衡 在linux内核中,有一些场景会触发任务均衡的分布在系统的各个cpu上,可以分为以下几个场景: 任务放置:task placement,fork创建的任务、sched_exec的任务或者阻塞被唤醒的任务,这些任务加入就绪队列时,可以确定放置任务到那个cpu上。 主动均衡:active upmigration,一个低算力的cpu无法运行某个重载任务时(misfit task),可以主动将m 进程调度 laumy 2023-04-22 254 热度 0评论
负载均衡之调度组和调度域 概述 从上一章节大概应该能够理解负载和利用率的区别了,当一个进程正在运行或者即使没有在cpu上运行,而在就绪队列中等待运行,那么他依旧消耗cpu的负载。这是合理的,因为cpu的就绪队列有10个任务等待着运行与5个任务等待运行,明显是10个任务的负载重。而利用率只是关注正在运行的任务而不包含在就绪队列的任务,在某个时间段内可能某个任务的cpu利用率很高,但是占用完之后一直睡眠,那么其队系统的负载贡献 进程调度 laumy 2023-04-16 482 热度 0评论
负载均衡之负载跟踪 各任务负载、各cpu的算力(频率+架构)、任务迁移开销(调度域,调度组)。 root@Linux:/# cat /proc/loadavg 3.49 3.43 3.54 4/131 3065 cat /proc/loadavg可以获取CPU全局平均负载,前面的三个值分别表示为1分钟、5分钟、15分钟系统平均负载,第四个字段正在运行的进程数量/总进程数量,第五个字段最后一个运行的进程ID。 公式①: 进程调度 laumy 2023-04-08 156 热度 0评论
CFS调度实现 时间计算 vruntime与runtime static void update_curr(struct cfs_rq *cfs_rq) { struct sched_entity *curr = cfs_rq->curr; u64 now = rq_clock_task(rq_of(cfs_rq)); u64 delta_exec; if (unlikely(!curr)) return; 进程调度 laumy 2023-04-02 170 热度 0评论
CFS分组调度 Linux系统都是支持多用户登录,如果一个Linux系统两个用户存在不同的数量的进程,假设A用户有10个进程,B用户有20个进程,如果系统对这30个进程进行平分CPU,实际上是不公平的,因此引入了组调度的概念,即A用户对CPU的占用应该跟B用对CPU的占用各自为50 如上图,组A的进程分别分配到了CPU0和CPU1上运行,在CPU0和CPU1上的进程各自组合成一个调度实体G1,两个组在各自的C 进程调度 laumy 2023-04-01 131 热度 0评论
CFS调度原理 上一章节中描述了Linux系统中支持多种调度,不同的调度有不同的优先级范围。对于普通进程使用的CFS调度(Completely Fair Scheduler,CFS)。完全公平调度主要核心思想就是保证在一段时间内,每个进程能够运行的时间趋于相等。 为了尽可能的保证一段时间内,每个进程能够运行的时间相等,那么系统就需要计算出每个进程每次能够运行的时间runtime,计算出每个进程的runti 进程调度 laumy 2023-03-26 145 热度 0评论
进程调度简介 调度类别 进程调度依赖于调度策略(schedule policy),linux内核把相同的调度策略抽象成调度类(schedule class)。不同类型的进程采用不同的调度策略,目前Linux内核中默认采用5种调度类,分别是stop、deadline、realtime、CFS和idle。 Stop:最高优先级的进程,只在多核场景下启用,用于热插拔等场景下停止CPU。 Dealine:用于有严格 进程调度 laumy 2023-03-25 179 热度 0评论
进程创建 fork创建了一个新的进程,也就是fork执行后就会返回两次,分别是父进程返回和子进程返回。 exec可以加载新的程序运行(原程序是A,可以在A中运行后加载可执行程序B,B是A的子进程)。而如果没有exec,A程序执行fork后,仅只是将fork之后的代码复制了一份。exec最早是为了实现shell而涉及的,目的是能够A程序启动B程序后,可以改变进程的环境变量实现如 ps > 1.txt这种处理。 进程调度 laumy 2023-03-19 111 热度 0评论
进程基本概念 进程标识 进程是程序加载到内存的执行过程。进程与程序相比用于操作系统的资源如内存空间、文件、signal等。对于进程的标识我们使用process id来标识(PID)。 线程是进程中活跃状态的实体,也是操作系统实际调度的基本单元。进程中的所有线程是共享一些资源的。在linux中,实际上不区分进程和线程,进程和线程都是task_struct结构体来描述。在linux中使用thread ID( 进程调度 laumy 2023-03-12 95 热度 0评论