实验 1:Cgroup 树的基本操作
参考文档
参考文档
实验目标
- 本次实验将创建并挂载一颗不与任何 subsystem 绑定的 cgroup 树,演示如何创建、删除子 cgroup,以及如何向 cgroup 中添加和删除进程。
- 由于不和任何subsystem绑定,所以这棵树没有任何实际的功能,但这不影响我们的演示,还有一个好处就是我们不会受subsystem功能的影响,可以将精力集中在cgroup树上。
实验步骤
1. 挂载 Cgroup 树
kevin@ZB-PF4WQHKS:~$ mkdir cgroup && cd cgroup
kevin@ZB-PF4WQHKS:~/cgroup$ mkdir demo
kevin@ZB-PF4WQHKS:~/cgroup$ sudo mount -t cgroup -o none,name=demo demo ./demo
kevin@ZB-PF4WQHKS:~/cgroup$ ls ./demo/
cgroup.clone_children cgroup.procs cgroup.sane_behavior notify_on_release release_agent tasks
kevin@ZB-PF4WQHKS:~/cgroup$ wc -l ./demo/cgroup.procs
36 ./demo/cgroup.procs
- cgroup.clone_children
- 这个文件只对cpuset(subsystem)有影响,当该文件的内容为1时,新创建的cgroup将会继承父cgroup的配置,即从父cgroup里面拷贝配置文件来初始化新cgroup
- cgroup.procs
- 当前cgroup中的所有进程ID,系统不保证ID是顺序排列的,且ID有可能重复
- notify_on_release
- 该文件的内容为1时,当cgroup退出时(不再包含任何进程和子cgroup),将调用release_agent里面配置的命令。新cgroup被创建时将默认继承父cgroup的这项配置。
- release_agent
- 里面包含了cgroup退出时将会执行的命令,系统调用该命令时会将相应cgroup的相对路径当作参数传进去。 注意:这个文件只会存在于root cgroup下面,其他cgroup里面不会有这个文件。
- tasks
- 当前cgroup中的所有线程ID,系统不保证ID是顺序排列的
2. 创建和删除cgroup
kevin@ZB-PF4WQHKS:~/cgroup/demo$ sudo mkdir cgroup1
kevin@ZB-PF4WQHKS:~/cgroup/demo$ ls cgroup1/
cgroup.clone_children cgroup.procs notify_on_release tasks
kevin@ZB-PF4WQHKS:~/cgroup/demo$ wc -l cgroup1/cgroup.procs
0 cgroup1/cgroup.procs
kevin@ZB-PF4WQHKS:~/cgroup/demo$ wc -l cgroup1/tasks
0 cgroup1/tasks
kevin@ZB-PF4WQHKS:~/cgroup/demo$ sudo rmdir cgroup1/
3. 添加、删除进程
- 创建新的cgroup后,就可以往里面添加进程了。注意下面几点:
- 在一颗cgroup树里面,一个进程必须要属于一个cgroup。
- 新创建的子进程将会自动加入父进程所在的cgroup。
- 从一个cgroup移动一个进程到另一个cgroup时,只要有目的cgroup的写入权限就可以了,系统不会检查源cgroup里的权限。
- 用户只能操作属于自己的进程,不能操作其他用户的进程,root账号除外。
kevin@ZB-PF4WQHKS:~/cgroup/demo$ sudo mkdir test && cd test
kevin@ZB-PF4WQHKS:~/cgroup/demo$/test$ echo $$
581
kevin@ZB-PF4WQHKS:~/cgroup/demo/test$ sudo sh -c 'echo 581 > cgroup.procs'
kevin@ZB-PF4WQHKS:~/cgroup/demo/test$ cat cgroup.procs
1421
kevin@ZB-PF4WQHKS:~/cgroup/demo/test$ top
kevin@ZB-PF4WQHKS:~/cgroup/demo/test$ cat cgroup.procs
581
16515
kevin@ZB-PF4WQHKS:~/cgroup/demo/test$ ps -ef|grep top
dev 16515 581 0 04:02 pts/0 00:00:00 top
kevin@ZB-PF4WQHKS:~/cgroup/demo/test$
kevin@ZB-PF4WQHKS:~/cgroup/demo/test$ sudo sh -c 'echo 1421 > ../cgroup.procs'
kevin@ZB-PF4WQHKS:~/cgroup/demo/test$ cat cgroup.procs
16515
kevin@ZB-PF4WQHKS:~/cgroup/demo/test$ cd ..
kevin@ZB-PF4WQHKS:~/cgroup/demo$ sudo rmdir test
4. cgroup.procs vs tasks
kevin@ZB-PF4WQHKS:~/cgroup/demo$ sudo mkdir c1 c2
kevin@ZB-PF4WQHKS:~/cgroup/demo$ ps -ef
systemd+ 610 1 610 0 2 01:52 ? 00:00:00 /lib/systemd/systemd-timesyncd
systemd+ 610 1 616 0 2 01:52 ? 00:00:00 /lib/systemd/systemd-timesyncd
kevin@ZB-PF4WQHKS:/home/dev/cgroup/demo
kevin@ZB-PF4WQHKS:/home/dev/cgroup/demo
610
kevin@ZB-PF4WQHKS:/home/dev/cgroup/demo
610
616
root@ubuntu:/home/dev/cgroup/demo
root@ubuntu:/home/dev/cgroup/demo
610
root@ubuntu:/home/dev/cgroup/demo
610
root@ubuntu:/home/dev/cgroup/demo
610
root@ubuntu:/home/dev/cgroup/demo
616
- 在cgroup V2以后,将不再支持该功能,只能以进程为单位来配置cgroup
5. 相关Linux命令解释
- echo $$
- 输出当前 Shell 进程的 PID(进程 ID)。
- $$ 是一个特殊变量,表示当前 Shell 进程的 PID。
-
- top
- 实时显示系统中各个进程的资源占用情况,包括 CPU、内存、进程数等。
- top 是一个交互式命令,默认会动态更新显示内容。
- 按 q:退出 top。
- 按 k:杀死指定进程。
- 按 P:按 CPU 使用率排序。
- 按 M:按内存使用率排序。
-
- ps -ef | grep top
- 查找与 top 相关的进程信息。
- ps -ef:列出系统中所有进程的详细信息。
- grep top:过滤出包含 top 的行。
-
- wc -l ./demo/cgroup.procs
- wc:word count 的缩写,用于统计文件中的行数、单词数和字节数。
- -l:–lines 的缩写,表示只统计行数。
- ./demo/cgroup.procs:要统计的文件路径。
-
- ps 命令
- ps 命令可以显示进程的详细信息,结合 -eLf 参数可以列出所有线程。
- ps -ef
