Linux cgroup freezer subsystem 与 SIGSTOP/SIGCONT
在 Linux 上, 使用 cgroup freezer subsystem
和 SIGSTOP/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 文件系统, 然后创建一个文件夹, 然后把进程扔进去, 然后冻结, 解冻.
三种状态:
- FROZEN — tasks in the cgroup are suspended. 冻结.
- FREEZING — the system is in the process of suspending tasks in the cgroup. 过度, 瞬间状态.
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
进程的跨服务器迁移
整个服务器有可能, 也有可用的商业方案.
单进程, 不可行.
- /proc, debugFS 这些伪文件系统不可复制.
- 进程号冲突.
- 在用的文件描述符.
- IP 地址.
- socket buff 未读/未发的数据.