linux - 任务退出后从cgroup中移除

标签 linux docker go 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 仍然存在)将成为该组的成员,这显然不是我们想要的行为,尤其是当我们谈论容器时(例如,如果我们谈论 设备,这种行为可能是获得特权的原因 cgroup).

正如我之前在评论中提到的,我在文档中找不到对这种行为的明确描述——可能是因为感觉太明显了,但源代码是不言自明的:exit (2)系统调用executes cgroup_exit() 和这个函数 moves the task out of its cgroups .

关于linux - 任务退出后从cgroup中移除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57806908/

相关文章:

linux - 如何使用 Glade/GtkD 和 D 编程语言显示 Hello World

docker - 无法拉 docker 图片

linux - 构建期间docker镜像目录不存在

c - 当从 C 调用一个 go 程序时,它是编译的还是解释的?

c++ - 如何配置系统日志以便应用程序日志转到特定文件

c++ - 在 C Linux 中捕获系统事件

docker - 在 Golang 中使用 docker 将敏感数据作为参数传递

memory - 使用 golang 测量可执行运行的内存使用情况

linux - XRDP - 连接到同一个 session (多个用户)

docker - Docker for Windows 的端口问题