实时调度类及SMP和NUMA
今天继续学习进程调度相关的视屏课:实时调度类及SMP和NUMA
进程分类:实时/普通
Linux进程可以分为两大类:实时进程和普通进程。实时进程与普通进程根本不同之处,如果系统中有一个实时进程且可执行,那么调度器总是会选择它,除非有一个优先级更高的实时进程。
SCHED_FIFO: 没有时间片,在被调度器选择之后,可以运行任意长的时间
SCHED_RR: 有时间片,其值在进程运行时会减少
实时调度实体:sched_rt_entity数据结构
实时调度提sched_rt_entity数据结构,表示实时调度实体,包含整个实时调度数据信息。具体源代码如下
struct rt_rq
实时调度类:rt_sched_class数据结构
实时调度类rt_sched_class数据结构
实时调度操作核心详解
进程插入函数enqueue_task_rt
内核源码:./kernel/sched/rt.c
//更新调度信息,将调度实体插入到相应优先级队列的末尾
static void
enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags)
{
struct sched_rt_entity *rt_se = &p->rt;
if (flags & ENQUEUE_WAKEUP)
rt_se->timeout = 0;
enqueue_rt_entity(rt_se, flags);
if (!task_current(rq, p) && p->nr_cpus_allowed > 1)
enqueue_pushable_task(rq, p);
}
进程选择函数pick_next_task_rt
实时调度会选择最高优先级的实时进程来运行。
内核源码:./kernel/sched/rt.c
static struct sched_rt_entity *pick_next_rt_entity(struct rq *rq,
struct rt_rq *rt_rq)
{
struct rt_prio_array *array = &rt_rq->active;
struct sched_rt_entity *next = NULL;
struct list_head *queue;
int idx;
// 第一个找到可用的实体
idx = sched_find_first_bit(array->bitmap);
BUG_ON(idx >= MAX_RT_PRIO);
// 从链表组中找到对应的链表
queue = array->queue + idx;
next = list_entry(queue->next, struct sched_rt_entity, run_list);
return next; //返回找到运行实体
}
进程删除函数dequeue_task_rt
从优先级队列中删除实时进程,并更新调度信息,然后把这个进程添加到队尾
内核源码:./kernel/sched/rt.c
//删除进程
static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int flags)
{
struct sched_rt_entity *rt_se = &p->rt;
update_curr_rt(rq); //更新调度数据信息等等
// 将rt_se从运行队列当中进行删除,然后添加到队列的尾部
dequeue_rt_entity(rt_se, flags);
dequeue_pushable_task(rq, p);//从hash表中进行删除
}
SMP
SMP(又称UMA)
对称多处理器结构(Symmetrical Mulit-Processing, SMP), SMP服务器CPU利用率最好的情况下是2-4个CPU,这个结论是经过实践证明。
在多处理器系统中,内核必须考虑几个额外的问题,主要以确保良好的调度。
- CPU负荷必须尽可能公平的在所有处理器上共享
- 进程与系统中某些处理器的亲和性(affinity)必须是可设置的
- 内核必须能够将进程从一个CPU迁移到另一个
Linux SMP调度就是将进程安排/迁移到合适的CPU中去,保持各CPU负载均衡的过程。
NUMA(非一致内存访问结构)
NUMA是多处理器计算机,各个CPU都有本地内存,可以支持超快的访问能力。各个处理器之间通过总线连接起来,支持对其他CPU的本地内存访问(但比访问自己的内存要慢)
MPP
海量并行处理结构
从应用层系统架构,目前商用服务器大体分为三类: SMP、NUMA、MPP
NUMA优势: 一台物理服务器内部集成多个CPU,使系统具有较高事务处理能力。NUMA架构适合OLTP事务处理场景。
SMP优势:当前使用的OLTP程序当中,用户访问中心数据库,如果采用SMP系统,它的效率要比MPP架构要快
CPU域初始化
根据实际物理属性,CPU分类:
- SMT(超线程)
- MC(多核)
- SoC(system on chip)
从Linux内核分类
- CONFIG_SCHED_SMT
- CONFIG_SCHED_MC
- DIE
Linux内核对CPU的管理是通过bitmap来管理的,并定义四种状态:possible/present/online/active
内核源码目录:./kernel/cpu.c
SMP负载均衡
SMP负载均衡机制从注册软中断开始,,每次系统处理调度tick时会检查当前是否需要处理SMP负责均衡。
负载均衡时机
周期性调用进程调度程序scheduler_tick()-> trigger_load_balance()中,通过软中断触发负载均衡
某个CPU上无可运行进程,__schedule()准备调度idle进程前,会尝试从其他CPU上拉一批进程过来
关注公众号:qiubinwei-1986
一起开启运维工程师成长之路