我已经在我的系统中创建了一个cgroup mygroup,并在它下运行了一个进程。
cgexec -g memory,cpu:groupname/mygroup someprocess过了一段时间,当我觉得没有必要担心cpu和内存时,如何将进程从我应用的cgroup中分离出来呢?
发布于 2020-07-28 18:00:54
一旦一个C组子系统可用(通过挂载),进程总是这个子系统层次结构中的cgroup的一部分,并且它最初将是它的根cgroup,除非移到另一个cgroup中,否则它的后代也会出现。“分离”一个进程通常意味着将它移回给定子系统(S)的根组。
假设子系统已经适当地挂载,那么通过创建/删除伪目录或为那些目录中出现的伪文件(通常如/sys/fs/cgroup中的man cgroups.7描述)读取/写入足够的值,一切都是可用的,否则沿cgexec提供的专用命令是cgclassify。
下面是一个示例(使用cgroup v1)从bash中演示它:
# ls /sys/fs/cgroup/{memory,cpu}/groupname/mygroup
ls: cannot access '/sys/fs/cgroup/memory/groupname/mygroup': No such file or directory
ls: cannot access '/sys/fs/cgroup/cpu/groupname/mygroup': No such file or directory
# cgcreate -g memory,cpu:groupname/mygroup
# ls -d /sys/fs/cgroup/{memory,cpu}/groupname/mygroup
/sys/fs/cgroup/cpu/groupname/mygroup /sys/fs/cgroup/memory/groupname/mygroup当然,在创建上面的cgroup之后,可能会应用一些专用设置。
# cgexec -g memory,cpu:groupname/mygroup sh -c 'echo $; exec sleep 999'
14682其他航站楼:
# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/groupname/mygroup/cgroup.procs
/sys/fs/cgroup/memory/groupname/mygroup/cgroup.procs:14682
/sys/fs/cgroup/cpu/groupname/mygroup/cgroup.procs:14682
# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/cgroup.procs
#
# cgclassify -g memory,cpu:/ 14682
# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/groupname/mygroup/cgroup.procs
# grep -w 14682 /sys/fs/cgroup/{memory,cpu}/cgroup.procs
/sys/fs/cgroup/memory/cgroup.procs:14682
/sys/fs/cgroup/cpu/cgroup.procs:14682上面的三个专用命令可以被以下简单的shell命令所取代:
# mkdir -p /sys/fs/cgroup/{memory,cpu}/groupname/mygroup
# bash -c 'echo $ | tee /sys/fs/cgroup/{memory,cpu}/groupname/mygroup/cgroup.procs; exec sleep 999'
15533和(“分离”它):
# echo 15533 | tee /sys/fs/cgroup/{memory,cpu}/cgroup.procs
15533注意,实际上,专用命令cgclassify (至少在cgroup v1上)作用于进程的线程(使用.../tasks),而不是进程本身(使用.../cgroup.procs)。对于简单的进程,pid (进程ID)是唯一的线程,因此任务组ID (tgid=pid)在两个伪文件中都是相同的,没有区别。对于多线程进程,移动整个进程需要在使用.../tasks或简单地使用.../cgroup.procs时标识其所有线程。它就在男人身上:
当将PID写入
cgroup.procs时,进程中的所有线程都会同时移动到新的cgroup中。在cgroup v1中,可以通过将其线程ID (即克隆(2)和gettid(2)返回的内核线程ID )写入cgroup目录中的tasks文件将单个线程移动到另一个cgroup。可以读取此文件以发现作为cgroup成员的一组线程。
这就是为什么之后我选择显示和使用.../cgroup.procs。在移动多线程进程(如Firefox、java应用程序等)时,这一点很重要。pgrep --lightweight可以用于在这种情况下向cgclassify提供所有任务(不过要注意种族问题)。
https://unix.stackexchange.com/questions/600725
复制相似问题