1. Linux 容器
使用 Cgroup 和 Namespace 就可以实现容器。 容器这个技术也称为操作系统虚拟化, 是将一个内核所管理的资源划分成多个分组。在 容 器 中,CPU 和 内 存 资 源 是 使 用 Cgroup 来 划 分 的。PID、IPC、 网 络 等 资 源 使 用Namespace 来划分 的。
Cgroup:Cgroup(control group) 是将任意进程进行分组化管理的 Linux 内核功能。Cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。
Cgroup 提供了一个 cgroup 虚拟文件系统, 作为进行分组管理和各子系统设置的用户接口。 要使用 Cgroup, 必须挂载 cgroup 文件系统 : mount -t cgroup -o cpu,cpuet,memory cgroup /cgroup。
2.调度策略
Linux 调度策略的类别大致可以分为 TSS(Time Sharing System, 分时系统 ) 和实时系统这两种。
TSS:一方面, 一般的进程是通过分时运行的。 也就是说, 使用 CPU 的时间达到分配给进程的时间(时间片)时,就会切换到其他进程。这种分时运行的调度策略称为 TSS。
RS: 另一方面, 在实时制约较严格且要求保证实时的处理中 , 就需要指定静态的执行优先级 , 并严格按照执行优先级进行调度 。 对这种对应答性有要求的进程 , 可以使用实时调度策略 。 另外 , 与 TSS 调度策略的进程相比 , CPU 将优先分配给使用实时调度策略的进程。
要说调度,不得不说下优先级:
在 Linux 中, 进程的静态优先级为 0 ~ 99 ,TSS 调度策略的优先级为 0, 实时调度策略的优先级可以指定的范围为 1 ~ 99。 在100以下的优先级中,数值越大则优先级越高,而非实时进程的优先级一般是100-139,这段范围内,数值越大那么优先级越小,这里是和静态优先级相反的。
linux的进程调度策略分为FIFO,RR,和OTHER(NORMAL)三种。实时进程使用FIFO或RR调度,非实时进程使用OTHER调度。实时进程调度策略(FIFO,RR)和非实时进程调度策略上的主要不同点在于FIFO和RR在有高优先级进程的情况下,低优先级进程不可能运行。FIFO调度的特点是在没有更高优先级进程出现或主动释放CPU的情况下,进程可以一直运行,直到任务结束。RR调度将同优先级的进程放到一个队列,在没有更高优先级进程的情况下同优先级的进程公平分配CPU时间,也就是说相比于FIFO,RR调度的进程可以被同优先级的进程抢占,RR调度在同优先级的进程间引入时间片轮转机制。OTHER则是在所有不同优先级的进程间引入时间片轮转机制,所有优先级的进程根据优先级的高低进行分时运行,通过动态调整进程优先级使所有进程都有运行机会,在OTHER调度中就存在低优先级抢占高优先级进程(静态优先级)的情况。
下面稍微详细的说下:
SCHED_FIFO
这是实时调度策略 , 即具有静态优先级的调度策略 。 Linux 内核中能够为实时调度策略 的进程指定的优先级为 1 ~ 99 。 使用了 SCHED_FIFO 调度策略的进程 , 除了等待I/O 完 成 时 休 眠 、 自 发 休 眠 或 优 先 级 更 高 的 实 时 进 程 获 得 优 先 权 以 外 , 不 会 释 放 执行权。
使用 SCHED_FIFO 的实时调度策略时, 需要注意的是, 它的进程不会自动释放 CPU,也就是说执行权不会转移到其他进程。 例如, 实时调度策略的进程陷入无限循环时, 其他所有优先级较低的进程永远不会被赋予执行权,此时系统就会死机。
SCHED_RR
这也是实时调度策略。RR 是 round robin( 轮询 ) 的缩写, 与 SCHED_FIFO 不同的是,它具有时间片。时间片使用完时,执行权将转移到其他进程。
SCHED_OTHER
这是 Linux 的标准调度策略,也是所谓 TSS用户使用 chrt 命令可以很简单地更改调度策略
调度策略。在Linux 2.6.23 之后的 CFS 中,会公平地为所有 TSS 策略的进程分配 CPU 时间。其时间片是动态决定的。
知道不同的调度策略之后,那么如何更改不同的调度策略呢?
用户使用 chrt 命令可以很简单地更改调度策略。chrt -- help : chrt - manipulate real-time attributes of a process。
cheduling policies:
-b | --batch set policy to SCHED_BATCH
-f | --fifo set policy to SCHED_FIFO
-i | --idle set policy to SCHED_IDLE
-o | --other set policy to SCHED_OTHER
-r | --rr set policy to SCHED_RR (default)
Scheduling flags:
-R | --reset-on-fork set SCHED_RESET_ON_FORK for FIFO or RR
Options:
-a | --all-tasks operate on all the tasks (threads) for a given pid
-h | --help display this help
-m | --max show min and max valid priorities
-p | --pid operate on existing given pid
-v | --verbose display status information
-V | --version output version information
例如 chrt -p -r 99 <pid> : 将某个运行的进程的优先级设置为 99。