任务退出后从cgroup中移除
The task is removed from cgroup after the exit
这是我的测试代码。我想将当前 PID 写入 tasks
文件:
package subsystems
import (
"io/ioutil"
"os"
"path"
"strconv"
"testing"
)
func TestSubsystems(t *testing.T) {
p := "/sys/fs/cgroup/memory/test1"
f := "tasks"
err := os.MkdirAll(p, 0644)
if err != nil {
t.Log(err.Error())
}
pid := os.Getpid()
if err := ioutil.WriteFile(path.Join(p, f), []byte(strconv.Itoa(pid)), 0644); err != nil {
t.Failed()
}
}
但是当程序以代码 0 退出时,我在 tasks
中看不到任何内容:
root@ubuntu:/sys/fs/cgroup/memory/test1# cat tasks
root@ubuntu:/sys/fs/cgroup/memory/test1# cat tasks
root@ubuntu:/sys/fs/cgroup/memory/test1#
如何解决这个问题?
您所描述的根本不是问题 — 它是正确的行为:
- 您创建了一个空的 cgroup;
- 你给它添加一个任务;
- 任务在cgroup中运行一段时间;
- 任务退出;
- 由于上一个项目;
,任务从 cgroup 中删除
- cgroup又空了;
- 你观察cgroup成员列表,什么也看不到。
为什么这是正确的行为?好吧,最简单的答案是没有理由在 cgroup 成员列表中保留不存在的 PID。另一方面,不这样做的原因有很多。
PID 重用是首先想到的原因之一:如果某些 PID 在任务死亡或正常关闭后没有从 cgroup 中删除,任何其他任务稍后将重用此 PID(假设cgroup 仍然存在)将成为该组的成员,这显然不是我们想要的行为,尤其是当我们谈论容器时(例如,如果我们谈论 devices
cgroup).
正如我之前在评论中提到的,我在文档中找不到对这种行为的明确描述——可能是因为感觉太明显了,但源代码是不言自明的:exit(2)
系统调用executes cgroup_exit()
under the hood, and this function moves the task out of its cgroups.
这是我的测试代码。我想将当前 PID 写入 tasks
文件:
package subsystems
import (
"io/ioutil"
"os"
"path"
"strconv"
"testing"
)
func TestSubsystems(t *testing.T) {
p := "/sys/fs/cgroup/memory/test1"
f := "tasks"
err := os.MkdirAll(p, 0644)
if err != nil {
t.Log(err.Error())
}
pid := os.Getpid()
if err := ioutil.WriteFile(path.Join(p, f), []byte(strconv.Itoa(pid)), 0644); err != nil {
t.Failed()
}
}
但是当程序以代码 0 退出时,我在 tasks
中看不到任何内容:
root@ubuntu:/sys/fs/cgroup/memory/test1# cat tasks
root@ubuntu:/sys/fs/cgroup/memory/test1# cat tasks
root@ubuntu:/sys/fs/cgroup/memory/test1#
如何解决这个问题?
您所描述的根本不是问题 — 它是正确的行为:
- 您创建了一个空的 cgroup;
- 你给它添加一个任务;
- 任务在cgroup中运行一段时间;
- 任务退出;
- 由于上一个项目; ,任务从 cgroup 中删除
- cgroup又空了;
- 你观察cgroup成员列表,什么也看不到。
为什么这是正确的行为?好吧,最简单的答案是没有理由在 cgroup 成员列表中保留不存在的 PID。另一方面,不这样做的原因有很多。
PID 重用是首先想到的原因之一:如果某些 PID 在任务死亡或正常关闭后没有从 cgroup 中删除,任何其他任务稍后将重用此 PID(假设cgroup 仍然存在)将成为该组的成员,这显然不是我们想要的行为,尤其是当我们谈论容器时(例如,如果我们谈论 devices
cgroup).
正如我之前在评论中提到的,我在文档中找不到对这种行为的明确描述——可能是因为感觉太明显了,但源代码是不言自明的:exit(2)
系统调用executes cgroup_exit()
under the hood, and this function moves the task out of its cgroups.