Linux Cgroup v1(中文翻译)(5):cgroup freezer

  • Linux Cgroup v1(中文翻译)(5):cgroup freezer已关闭评论
  • 20 次浏览
  • A+
所属分类:linux技术
摘要

cgroup freezer对于批量启动和停止任务集合的任务管理系统来说是很有用的,这个程序经常被用在HPC族上来调度访问。cgroup freezer使用cgroups来描述被批处理任务管理系统启动和停止的任务集合。他也提供了方法来启动和停止任务。


Cgroup Freezer

cgroup freezer对于批量启动和停止任务集合的任务管理系统来说是很有用的,这个程序经常被用在HPC族上来调度访问。cgroup freezer使用cgroups来描述被批处理任务管理系统启动和停止的任务集合。他也提供了方法来启动和停止任务。

cgroup freezer也用来给运行的任务组设置检查点。freezer允许检查点代码通过强制cgroup中的任务到静止状态来获取连续的任务镜像。一旦任务静止,另一个任务就能进入/proc或者调用内核接口来收集这些静止任务的信息。设置了检查点的任务能够被重启,也可以从错误中恢复。这也允许设置了检查点的任务能在节点间迁移,通过复制采集的信息到另外的节点然后在那个节点上重启任务。

在用户空间里停止和恢复任务,SIGSTOP和SIGCONT信号序列总不是那么足够。这两个信号都可以从我们希望冻结的任务内观察得到。当SIGSTOP不能被捕捉,被阻塞或者被忽略,它就能被正在等待或者跟踪(ptracing)的父任务看到。SIGCONT特别地不适合,因为它能被任务捕捉到。任何程序被设计用来观察SIGSTOP和SIGCONT信号,都可能会被使用SIGSTOP和SIGCONT信号来停止和恢复任务的企图破坏掉。我们可以嵌套的bash shell来演示证明这个问题:

$ echo $$ 16644 $ bash $ echo $$ 16690  From a second, unrelated bash shell: $ kill -SIGSTOP 16690 $ kill -SIGCONT 16690  <at this point 16690 exits and causes 16644 to exit too> 

这种情况发生是因为bash能观察到两个信号,选择了如何来响应它们。

另一个能够捕捉并相应这些信号的程序例子就是gdb。实际上任何使用了ptrace的程序,用这种方法来停止和恢复任务,都有这个问题。

相比之下,cgroup freezer使用内核freezer代码来防止freeze/unfreeze循环。

cgroup freezer是分层结构。冻结cgroup会冻结掉属于该cgroup和它的子cgroups的所有任务。每个cgroup有它自己的状态(自状态self-state)和继承自父系的状态(父状态parent-state),如果两个状态都是THAWED,那么cgroup就是THAWED。

下面的cgroupfs文件由cgroup freezer创建:

  • freezer.state: Read-write
    当读取文件,返回有效cgroup状态:“THAWED”, “FREEZING”或者“FROZEN”。它是自状态和父状态的组合。如果任何一个在freezing,那么cgroup就是freezing(FREEZING或者FROZEN)。

当所有任务和子任务变成frozen,cgroup就从FREEZING状态迁移到FROZEN状态。注意,新任务添加到cgroup或者子cgroup之后直到被冻结之前,cgroup会从FROZEN反转到FREEZING。

当写入文件,就会设置cgroup的自状态。只允许两个值:“FROZEN”和“THAWED”。如果写入FROZEN,cgroup如果还没有准备freezing就会跟它的所有子系一起进入FREEZING状态。

如果写入THAWED,cgroup的自状态更改为THAWED。注意,如果父状态仍然是freezing,实际的状态可能不会改变为THAWED。如果cgroup的实际状态变为THAWED,它的所有正在冻结中子系也会离开freezing状态。

  • freezer.self_freezing: Read only
    显示自状态。如果自状态是THAWED,值就是0,否则就是1。如果最后写入freezer.state的是FROZEN,那这个值也是1。

  • freezer.parent_freezing: Read only
    显示父状态,如果它的任何父系都不是frozen,那么值就是0,否则就是1。

root cgroup是不可冻结的,上述的接口文件都不存在。

使用示例:

# mkdir /sys/fs/cgroup/freezer # mount -t cgroup -ofreezer freezer /sys/fs/cgroup/freezer # mkdir /sys/fs/cgroup/freezer/0 # echo $some_pid > /sys/fs/cgroup/freezer/0/tasks 

获取freezer子系统状态:

# cat /sys/fs/cgroup/freezer/0/freezer.state THAWED 

冻结容器内所有任务:

# echo FROZEN > /sys/fs/cgroup/freezer/0/freezer.state # cat /sys/fs/cgroup/freezer/0/freezer.state FREEZING # cat /sys/fs/cgroup/freezer/0/freezer.state FROZEN 

解冻容器内所有任务:

# echo THAWED > /sys/fs/cgroup/freezer/0/freezer.state # cat /sys/fs/cgroup/freezer/0/freezer.state THAWED 

这就是用户空间任务在简单场景下正确处理事物的基本机制。


原文地址:
https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/freezer-subsystem.html