Linux cgroup freezer subsystem 与 SIGSTOP/SIGCONT

在 Linux 上, 使用 cgroup freezer subsystemSIGSTOP/SIGCONT 都能暂停和继续进程的执行. 那么它的区别与联系是什么呢?

为什么需要 SIGSTOP/SIGCONT

暂停与继续进程.
SIGSTOP tells LINUX to pause a process to be resumed later.
SIGCONT tells LINUX to resume the processed paused earlier.

什么是 cgroup freezer subsystem

https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt
首先它是 cgroup 控制的一个子系统, 所以它有cgroup的层级结构. 它能把一个或者多个进程冻住, 然后就获得了该进程的一个snapshot(checkpoint), docker 的 pause 子命令就是使用 cgroup freezer subsystem 实现的. 当冻住该进程之后, 你能check 找个进程的 /proc 的状态, 内存的状态, 去收集它的运行时信息. 之后解冻之后, 就可以继续运行.

相比来说, 被 SIGSTOP/SIGCONT 的进程自己或者父进程能感知到自己收到了这些 signal.

cgroup freezer subsystem 的一个简单例子

先创建 cgroup freezer 目录, 然后挂载cgroup 文件系统, 然后创建一个文件夹, 然后把进程扔进去, 然后冻结, 解冻.
三种状态:

  1. FROZEN — tasks in the cgroup are suspended. 冻结.
  2. FREEZING — the system is in the process of suspending tasks in the cgroup. 过度, 瞬间状态.
  3. THAWED — tasks in the cgroup have resumed. 解冻.

    # 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
    # echo FROZEN > /sys/fs/cgroup/freezer/0/freezer.state
    # ps aux | grep $some_pid
    # echo THAWED > /sys/fs/cgroup/freezer/0/freezer.state

    为什么需要 cgroup freezer subsystem

进程的跨服务器迁移

整个服务器有可能, 也有可用的商业方案.
单进程, 不可行.

  1. /proc, debugFS 这些伪文件系统不可复制.
  2. 进程号冲突.
  3. 在用的文件描述符.
  4. IP 地址.
  5. socket buff 未读/未发的数据.

标签: none

添加新评论