Cgroup分析之cpu、cpuacct

1      组调度

1.1      进程调度基础

操作系统为了协调多个进程的同时运行,最基本的手段就是给进程设定优先级,如果有多个进程处于可执行状态,那么优先级高的进程先被调度执行。

Linux内核将进程分为两种级别,普通进程和实时进程,实时进程的优先级高于普通进程,另外他们的调度策略也不同。

实时进程的调度

1、如果一个进程是实时进程,只要它是可执行状态的,内核就一直让它执行,以尽可能满足它对cpu的需要,直到进程执行完成,睡眠或退出(不可执行状态)。

2、如果有多个进程一直处于可执行状态,则内核会先满足优先级最高的实时进程对cpu的需求,直到这个进程执行完成变成非可执行状态。

这样,如果高优先级的实时进程一直处于可执行状态,低优先级的实时进程就一直不能得到cpu;只要一直有实时进程处于可执行状态,普通进程就一直不能得到cpu。明显不能达到多任务的效果。

所以内核中通过/proc/sys/kernel/sched_rt_runtime_us和/proc/sys/kernel/sched_rt_period_us两个参数来控制在sched_rt_period_us为周期的时间内,实时进程最多只能运行sched_rt_runtime_us这么多时间,这样留给普通进程一定的运行时间。

3、如果有多个相同优先级的实时进程处于可执行状态,有两种调度策略可以选择

        SCHED_FIFO:先进先出。直到先被执行的进程变为非可执行状态,后来的进程才被调度执行。在这种策略下,先来的进程可以执行sched_yield系统调用,自愿放弃CPU,以让权给后来的进程;

        SCHED_RR:轮转调度。内核为实时进程分配时间片,在时间片用完时,让下一个进程使用CPU;

实时进程的调度是比较简单的,进程的优先级和调度策略都由用户设定,内核总是选择优先级最高的实时进程来调度执行。在选择具有相同优先级的实时进程时,要考虑两种调度策略。

 

普通进程的调度

普通进程没有实时的需求,调度器力图让每个处于可执行状态的进程平分cpu时间,从而让用户认为这些进程是同时进行的。

普通进程的调度中,内核要关注动态调整进程的优先级和进程调度的公平性两方面。

1、动态调整优先级

进程按照行为可以分为交互式进程和批处理进程,交互式进程较批处理进程有较高的优先级。但系统正常运行场景下,用户并不会完全设置交互式进程和批处理进程的优先级。于是内核中通过调度程序来区分这些进程的优先级,调度程序关注进程近一段时间内的表现(主要是检查其睡眠时间和运行时间),根据一些经验性的公式,判断它现在是交互式的还是批处理的?程度如何?最后决定给它的优先级做一定的调整。

进程的优先级被动态调整后,就出现了两个优先级:

1)、用户程序设置的优先级(如果未设置,则使用默认值),称为静态优先级。这是进程优先级的基准,在进程执行的过程中往往是不改变的;

2)、优先级动态调整后,实际生效的优先级。这个值是可能时时刻刻都在变化的;

2、调度公平性

在支持多进程的系统中,理想情况下,各个进程应该是根据其优先级公平地占有CPU。而不会出现“谁运气好谁占得多”这样的不可控的情况。

linux实现公平调度基本上是两种思路:

1)、给处于可执行状态的进程分配时间片(按照优先级),用完时间片的进程被放到“过期队列”中。等可执行状态的进程都过期了,再重新分配时间片;

2)、动态调整进程的优先级。随着进程在CPU上运行,其优先级被不断调低,以便其他优先级较低的进程得到运行机会;

后一种方式有更

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cgroup(Control Group)是Linux内核中的一个功能,用于对不同进程或进程组进行资源限制和隔离。其中,CFS(Completely Fair Scheduler)是Linux内核中的一种调度算法,用于对多个进程进行公平的CPU时间片分配。 cgroupCPU隔离的原理是通过CFS调度算法和cgroup分组管理来实现的。首先,用户可以使用cgroup机制将一组相关进程划分到一个或多个cgroup中。然后,通过对cgroup设置不同的CPU资源限制,实现对这些进程的CPU使用量进行控制。 具体实现的原理是,内核通过cgroup结构体来维护cgroup信息,并通过层次结构组织多个cgroup。在每个cgroup中,可以通过设置相应的参数来控制CPU的使用。例如,可以将一组进程划分到一个单独的cgroup中,并设置该cgroupCPU份额(cpu.shares)来决定其获取CPU时间片的优先级。相对而言,具有更高份额的cgroup会获得更多的CPU时间片,优先进行CPU调度。 另外,cgroup还提供了其他参数,如cpu.cfs_quota_us和cpu.cfs_period_us。使用这两个参数可以限制一个cgroup在一定时间段内获取的CPU时间片数量。并结合cfs.bandwidth来控制CPU的使用。这样可以进一步限制每个cgroupCPU使用量,保证在物理机的CPU资源有限的情况下,每个cgroup获得公平的CPU时间片分配。 总而言之,cgroup通过使用CFS调度算法和设置cgroup参数,可以实现对CPU的隔离和限制。这样可以确保不同的进程组在使用CPU资源时能够公平竞争,避免某个进程或进程组占用过多的CPU,从而提高整个系统的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值