|
@@ -1,4 +1,4 @@
|
|
- The cgroup freezer is useful to batch job management system which start
|
|
|
|
|
|
+The cgroup freezer is useful to batch job management system which start
|
|
and stop sets of tasks in order to schedule the resources of a machine
|
|
and stop sets of tasks in order to schedule the resources of a machine
|
|
according to the desires of a system administrator. This sort of program
|
|
according to the desires of a system administrator. This sort of program
|
|
is often used on HPC clusters to schedule access to the cluster as a
|
|
is often used on HPC clusters to schedule access to the cluster as a
|
|
@@ -6,7 +6,7 @@ whole. The cgroup freezer uses cgroups to describe the set of tasks to
|
|
be started/stopped by the batch job management system. It also provides
|
|
be started/stopped by the batch job management system. It also provides
|
|
a means to start and stop the tasks composing the job.
|
|
a means to start and stop the tasks composing the job.
|
|
|
|
|
|
- The cgroup freezer will also be useful for checkpointing running groups
|
|
|
|
|
|
+The cgroup freezer will also be useful for checkpointing running groups
|
|
of tasks. The freezer allows the checkpoint code to obtain a consistent
|
|
of tasks. The freezer allows the checkpoint code to obtain a consistent
|
|
image of the tasks by attempting to force the tasks in a cgroup into a
|
|
image of the tasks by attempting to force the tasks in a cgroup into a
|
|
quiescent state. Once the tasks are quiescent another task can
|
|
quiescent state. Once the tasks are quiescent another task can
|
|
@@ -16,7 +16,7 @@ recoverable error occur. This also allows the checkpointed tasks to be
|
|
migrated between nodes in a cluster by copying the gathered information
|
|
migrated between nodes in a cluster by copying the gathered information
|
|
to another node and restarting the tasks there.
|
|
to another node and restarting the tasks there.
|
|
|
|
|
|
- Sequences of SIGSTOP and SIGCONT are not always sufficient for stopping
|
|
|
|
|
|
+Sequences of SIGSTOP and SIGCONT are not always sufficient for stopping
|
|
and resuming tasks in userspace. Both of these signals are observable
|
|
and resuming tasks in userspace. Both of these signals are observable
|
|
from within the tasks we wish to freeze. While SIGSTOP cannot be caught,
|
|
from within the tasks we wish to freeze. While SIGSTOP cannot be caught,
|
|
blocked, or ignored it can be seen by waiting or ptracing parent tasks.
|
|
blocked, or ignored it can be seen by waiting or ptracing parent tasks.
|
|
@@ -37,26 +37,29 @@ demonstrate this problem using nested bash shells:
|
|
|
|
|
|
<at this point 16990 exits and causes 16644 to exit too>
|
|
<at this point 16990 exits and causes 16644 to exit too>
|
|
|
|
|
|
- This happens because bash can observe both signals and choose how it
|
|
|
|
|
|
+This happens because bash can observe both signals and choose how it
|
|
responds to them.
|
|
responds to them.
|
|
|
|
|
|
- Another example of a program which catches and responds to these
|
|
|
|
|
|
+Another example of a program which catches and responds to these
|
|
signals is gdb. In fact any program designed to use ptrace is likely to
|
|
signals is gdb. In fact any program designed to use ptrace is likely to
|
|
have a problem with this method of stopping and resuming tasks.
|
|
have a problem with this method of stopping and resuming tasks.
|
|
|
|
|
|
- In contrast, the cgroup freezer uses the kernel freezer code to
|
|
|
|
|
|
+In contrast, the cgroup freezer uses the kernel freezer code to
|
|
prevent the freeze/unfreeze cycle from becoming visible to the tasks
|
|
prevent the freeze/unfreeze cycle from becoming visible to the tasks
|
|
being frozen. This allows the bash example above and gdb to run as
|
|
being frozen. This allows the bash example above and gdb to run as
|
|
expected.
|
|
expected.
|
|
|
|
|
|
- The freezer subsystem in the container filesystem defines a file named
|
|
|
|
|
|
+The freezer subsystem in the container filesystem defines a file named
|
|
freezer.state. Writing "FROZEN" to the state file will freeze all tasks in the
|
|
freezer.state. Writing "FROZEN" to the state file will freeze all tasks in the
|
|
cgroup. Subsequently writing "THAWED" will unfreeze the tasks in the cgroup.
|
|
cgroup. Subsequently writing "THAWED" will unfreeze the tasks in the cgroup.
|
|
Reading will return the current state.
|
|
Reading will return the current state.
|
|
|
|
|
|
|
|
+Note freezer.state doesn't exist in root cgroup, which means root cgroup
|
|
|
|
+is non-freezable.
|
|
|
|
+
|
|
* Examples of usage :
|
|
* Examples of usage :
|
|
|
|
|
|
- # mkdir /containers/freezer
|
|
|
|
|
|
+ # mkdir /containers
|
|
# mount -t cgroup -ofreezer freezer /containers
|
|
# mount -t cgroup -ofreezer freezer /containers
|
|
# mkdir /containers/0
|
|
# mkdir /containers/0
|
|
# echo $some_pid > /containers/0/tasks
|
|
# echo $some_pid > /containers/0/tasks
|
|
@@ -94,6 +97,6 @@ things happens:
|
|
the freezer.state file
|
|
the freezer.state file
|
|
2) Userspace retries the freezing operation by writing "FROZEN" to
|
|
2) Userspace retries the freezing operation by writing "FROZEN" to
|
|
the freezer.state file (writing "FREEZING" is not legal
|
|
the freezer.state file (writing "FREEZING" is not legal
|
|
- and returns EIO)
|
|
|
|
|
|
+ and returns EINVAL)
|
|
3) The tasks that blocked the cgroup from entering the "FROZEN"
|
|
3) The tasks that blocked the cgroup from entering the "FROZEN"
|
|
state disappear from the cgroup's set of tasks.
|
|
state disappear from the cgroup's set of tasks.
|