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
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/267655.html