一、大纲
二、负载均衡
1)
原来是nice+/-5的改变。
例子:两个死循环子线程:real为自然时间,sys内核态时间和user用户态时间 因为两个线程是在两个核上面运行所以 sys+user = 2* real。
四核运行环境:
RT:
普通进程:
- 周期性闲时其他核负载达到一定程度拖过来跑,
- IDLE时负载均衡时拖过来跑,
- fork和exec(数据段和代码段替换)推到其他闲的核上面跑。
push到最闲的核和闲时pull到本核。
2)task的亲和力 affinity
函数:
工具:taskset -a 所有 -p 01/02/03是cpu掩码
三、中断负载均衡 特指硬中断
1)一个网卡的4个中断队列分给4个核
2)有时候中断做不了负载均衡,比如只有一个中断队列,cpu0里IRQ里面调度softIRQ,softIRQ也会运行在cpu0,这样cpu0比较忙,RPS补丁可以做软中断负载均衡,帮助把软中断借用ipi中断派发到其他核,(ipi中断:先发中断,在中断抛软中断)。
四、cgroup
1)分群调度,群间和群内都是cfs调度算法。
RT进程能不能放进cgroup,和普通进程放一个group???
创建cgroup:
加进程到cgroup:下面是把整个进程加到group里面,也可以把单个线程放到group里面修改task
修改group的权重,默认值为1024
quota:-1表示不限制,在cpu.cfs_period_us时间里面最多跑cpu.cfs_quota_us。
Android对cgroup的应用
docker也有使用cgroup
五、硬实时
硬实时是可预期,有截止期限。
工具测试调度抖动,应该唤醒到实际唤醒的时间差。
六、linux调度
1)红色为不可抢占的区间:
最后一个为打上RT补丁后的效果。
2)四类区间
第四类为可调度的进程上下文。spin_lock可以有好几种api,默认是关本cpu的调度,也可以用另一个api关中断。
软中断里面可以再软中断,中断里面不可以再中断,不能嵌套。软中断可以被中断打断,spin_lock可以被中断抢占。
例子:IRQ1为软中断,
3)RT补丁,把linux改造为一个hard real-time系统。
- spin_lock是关中断自旋,改为mutex睡眠,让渡CPU。
- 优先级继承是解决优先级反转问题。
- 中断线程化:把中断服务程序放到一个线程里面执行,变为第四类区间,只有在中断到来和线程之间不可抢占。
- 软中断线程化:也变为第四类区间。
七、答疑
- 不能嵌套中断,正在执行中断,中断控制器会pending 后来的中断。硬件有可能会丢中断。
- FIQ能打断IRQ,一般linux说的IRQ不是FIQ。
- 实时操作系统不是所有进程都是实时的,
- 一句话中断不能抢,time tick中断不能抢因为不能线程化,raw_spin_lock不能抢。
- spin_lock_irq 、spin_lock_irqsave 是既关调度又关中断,spin_lock_irqsave会保存调用前的中断开/关状态。