Cgroups 与 Systemd

前端之家收集整理的这篇文章主要介绍了Cgroups 与 Systemd前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

》先了解 cgroups。当 Linux 的 init 系统发展到 systemd 之后,systemd 与 cgroups 发生了融合(或者说 systemd 提供了 cgroups 的使用和管理接口,systemd 管的东西越来越多啊!)。本文将简单的介绍 cgroups 与 systemd 的关系以及如何通过 systemd 来配置和使用 cgroups。

层级结构(A)和资源控制(B)。首先 cgroups 是以层级结构组织并标识进程的一种方式,同时它也是在该层级结构上执行资源限制的一种方式。我们简单的把 cgroups 的层级结构称为 A,把 cgrpups 的资源控制能力称为 B。

slice、scope 和 service unit 的层级(slice、scope 和 service 都是 systemd 的 unit 类型,参考《》),来为 cgroup 树提供统一的层级结构。

  • service: 一个或一组进程,由 systemd 依据 unit 配置文件启动。service 对指定进程进行封装,这样进程可以作为一个整体被启动或终止。
  • scope:一组外部创建的进程。由进程通过 fork() 函数启动和终止、之后被 systemd 在运行时注册的进程,scope 会将其封装。例如:用户会话、 容器和虚拟机被认为是 scope。
  • slice: 一组按层级排列的 unit。slice 并不包含进程,但会组建一个层级,并将 scope 和 service 都放置其中。真正的进程包含在 scope 或 service 中。在这一被划分层级的树中,每一个 slice 单位的名字对应通向层级中一个位置的路径。

用户会话、虚拟机和容器进程会被自动放置在一个单独的 scope 单元中。

  • -.slice:根 slice
  • system.slice:所有系统 service 的默认位置
  • user.slice:所有用户会话的默认位置
  • machine.slice:所有虚拟机和 Linux 容器的默认位置

systemd-run 命令创建临时的 cgroup,它可以创建并启动临时的 service 或 scope unit,并在此 unit 中运行程序。systemd-run 命令默认创建 service 类型的 unit,比如我们创建名称为 toptest 的 service 运行 top 命令:

$ systemd-run --unit=toptest --slice=test top -b @H_502_77@

后台了!

$ vim /proc//cgroup # 为 top 进程的 PID @H_502_77@

cpuShares 为 600,可用内存的上限为 550M:

$ systemctl set-property toptest.service cpuShares= MemoryLimit=500M @H_502_77@

cpu 和 memory 子系统中都出现了 toptest.service 的名字。同时去查看 /sys/fs/cgroup/memory/test.slice/sys/fs/cgroup/cpu/test.slice 目录,这两个目录下都多出了一个 toptest.service 目录。我们设置的 cpuShares=600 MemoryLimit=500M 被分别写入了这些目录下的对应文件中。

临时 cgroup 的特征是,所包含的进程一旦结束,临时 cgroup 就会被自动释放。比如我们 kill 掉 top 进程,然后再查看 /sys/fs/cgroup/memory/test.slice 和 /sys/fs/cgroup/cpu/test.slice 目录,刚才的 toptest.service 目录已经不见了。

配置文件修改 cgroup

配置文件。比如我们常见的 service 类型 unit 的配置文件。我们可以通过设置 unit 配置文件来控制应用程序的资源,persistent cgroup 的特点是即便系统重启,相关配置也会被保留。需要注意的是,scope unit 不能以此方式创建。添加 cpu 和内存相关的一些限制,编辑 /lib/systemd/system/cron.service 文件

$ vim /lib/systemd/system/cron.service @H_502_77@

添加红框中的行,然后重新加载配置文件并重启 cron.service:

$ systemctl daemon- systemctl restart cron.service @H_502_77@

cpu/system.slice/cron.service/cpu.shares 文件,是不是已经包含我们配置的内容了!

修改 cgroup

配置文件,还可以通过 systemctl set-property 命令来修改 cgroup,这种方式修该的配置也会在重启系统时保存下来。现在我们把 cron.service 的 cpuShares 改为 700:

$ systemctl set-property cron.service cpuShares= @H_502_77@

cpu/system.slice/cron.service/cpu.shares 文件内容应该是 700,重启系统后该文件内容还是 700。

显示 cgoups 的实时资源消耗情况:

@L_404_1@

原文链接:/systemd/71441.html

猜你在找的sysTemd相关文章