使用 cgroups 时将进程放入控制组有三种方法:
1 通过文件操作进行添加
echo [PID] > /path/to/cgroup/tasks
上述命令就是把进程ID打印到tasks中,如果tasks文件中已经有进程,需要使用">>"向后添加。
通过cgclassify将进程添加到cgroup
2 cgclassify -g subsystems:path_to_cgroup pidlist
这个命令中,subsystems指的就是子系统(如果使用man命令查看,可能也会使用controllers表示),如果mount了多个,就是用","隔开的子系统名字作为名称,类似cgset命令。
3 通过cgexec直接在cgroup中启动并执行进程
cgexec -g subsystems:path_to_cgroup command arguments
command和arguments就表示要在cgroup中执行的命令和参数。cgexec常用于执行临时的任务。
当控制 java 程序时,前两种方法都没有效果,只能用第三种方法
使用的 pid 是 top 指令显示出的 java 进程 pid

使用前两种方法时只能在 cgroup 的 tasks 中写入一个主线程的 pid

资源控制也没有效果

而使用第三种方法时,可以把 jvm 运行的所有相关线程写入 tasks,资源控制也生效了


环境 阿里云服务器 Centos7
网友评论