linux cgroups详细介绍

yizhihongxing

Linux cgroups详细介绍

什么是cgroups

cgroups(control groups)是Linux内核提供的一种机制,它允许你限制、分配和监控系统资源(如CPU、内存、磁盘IO等)的使用。cgroups可以通过文件系统的形式,将一组进程放置在一个子系统中。

cgroups的应用场景

cgroups常用于以下场景:

  • 系统性能优化:通过控制资源的使用限制,可以防止进程对系统资源的滥用,防止系统崩溃等问题;
  • 服务管理:通过控制某一组进程可以使用的资源范围,可以保证服务的稳定性;
  • 可靠性解决方案:在多租户环境下使用cgroups,可以避免一个用户的资源使用情况影响其他用户的使用体验。

cgroups的实现

cgroups操作需要对操作系统内核的进程处理进行控制,因此cgroups的实现离不开内核对进程管理的处理。目前Linux内核中已经内置了cgroups子系统(以cgroups_v1为主)。

对于cgroups的实现,常用的cgroups子系统有:

  • blkio:控制块设备IO的限制,如硬盘和闪存;
  • cpuacct:使用cgroups的进程所消耗的CPU资源(cache、用户时间、系统时间)的统计;
  • cpu:对进程使用CPU限制和权重的控制;
  • devices:禁止特定类型的设备和允许特定设备访问的控制;
  • freezer:暂停和恢复cgroup中的所有进程;
  • memory:内存使用情况的控制和统计;
  • net_cls:为网络流量分类提供标记;

cgroups的基本操作

创建cgroup

基于内核版本的不同,cgroups相关的文件系统可能会存在差异。在本文中,我们以基于cgroups v1的文件系统示例来演示如何操作。

首先,我们需要选择一个cgroup子系统,这里选取cpu子系统作为示例:

$ mkdir /sys/fs/cgroup/cpu/test-cgroup

这个命令会在路径/sys/fs/cgroup/cpu中创建一个名为test-cgroup的cgroup。

限制资源使用

限制进程组的CPU使用率为50%:

$ echo 50000 > /sys/fs/cgroup/cpu/test-cgroup/cpu.cfs_quota_us
$ echo 100000 > /sys/fs/cgroup/cpu/test-cgroup/cpu.cfs_period_us

这条命令中,我们指定了test-cgroup子系统在进程组中最多只能利用50%的CPU时间。

进程加入cgroup

将一个进程加入cgroup:

$ echo <pid of process> > /sys/fs/cgroup/cpu/test-cgroup/tasks

例如,通过下面的命令将PID为123的进程加入test-cgroup子系统下的cgroup:

$ echo 123 > /sys/fs/cgroup/cpu/test-cgroup/tasks

监控cgroup

使用cgtop命令可以使用CPU、内存和网络方面的统计信息监控cgroup:

$ apt install -y libcgroup-tools
$ cgtop

这个命令可以显示出所有cgroups的所有进程的统计信息。

示例1:限制进程组的CPU使用

假设我们要运行shell脚本test.sh,同时要限制其所用的CPU使用,并将其加入名为test的cgroup。

首先,我们创建一个名为test的cgroup:

$ mkdir /sys/fs/cgroup/cpu/test

然后,我们限制test子系统在进程组中最多只能利用50%的CPU时间:

$ echo 50000 > /sys/fs/cgroup/cpu/test/cpu.cfs_quota_us
$ echo 100000 > /sys/fs/cgroup/cpu/test/cpu.cfs_period_us

接着,我们将脚本test.sh运行在名为test的cgroup下:

$ bash test.sh &
$ echo $! > /sys/fs/cgroup/cpu/test/tasks

这个命令行会在后台运行脚本test.sh,并将它的PID加入名为test的cgroup。现在,这个脚本的CPU使用率不会超过50%。

示例2:限制Docker容器的内存使用

我们还可以使用cgroups限制Docker容器的内存使用。例如,我们可以将一个名为test-container的Docker容器利用内存限制为2G:

$ docker run -itd --name test-container ubuntu:18.04 /bin/bash
$ cgcreate -g memory:/docker-test
$ echo $(( 2 * 1024 * 1024 * 1024 )) > /sys/fs/cgroup/memory/docker-test/memory.limit_in_bytes
$ echo $(docker inspect -f '{{.State.Pid}}' test-container) > /sys/fs/cgroup/memory/docker-test/tasks

这个命令运行了容器,并创建了一个名为docker-test的cgroup。这个cgroup限制了该容器的内存使用为2GB。最后,我们使用docker inspect取得容器的PID,并将其加入docker-test的cgroup。

这种方法也可以运用到限制其他资源(CPU、IO、网络等)的使用上。

总结

cgroups帮助我们管理Linux系统上进程的资源使用,使用cgroups可以实现进程级别的资源限制,提高系统的可用性及稳定性。本文介绍了cgroups的基本概念及其应用场景,并提供了两个例子来进一步说明如何使用cgroups操作系统相关资源。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:linux cgroups详细介绍 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • java调用FFmpeg实现视屏压缩功能的详细步骤

    让我们来一步步讲解如何使用Java调用FFmpeg实现视频压缩的功能。 前置条件 在开始之前,需要安装FFmpeg工具,并且配置好环境变量。可以通过以下命令检查FFmpeg是否安装成功: ffmpeg -version 步骤一:导入FFmpeg库 首先,需要在Java项目中导入FFmpeg库,以便后续调用相应的方法。可以使用以下Maven依赖: <de…

    other 2023年6月26日
    00
  • 关于c#:unix非阻塞i/o:o_nonblock与fionbio

    以下是关于“关于c#:unix非阻塞i/o:o_nonblock与fionbio”的完整攻略,包含两个示例说明。 C#中的阻塞I/O 在C#中,我们可以使用阻塞I/O来现异步I/O操作。非阻塞I/O允许我们在等待I/O操作完成时继续执行其他任务,从而提高程序的性能和响应速度。在本攻略中,我们将介绍如何在C#中使用非阻塞I/O。 1. 使用o_nonblock…

    other 2023年5月9日
    00
  • zepeto进不去怎么办 zepeto一直在加载解决方法

    问题描述:在使用zepeto的过程中,有些用户会遇到无法进入或者一直在加载的情况。这种情况可能是由于网络连接问题或者其他因素导致的。本文将提供一些可能的解决方法供大家参考。 解决方法一:检查网络连接并重试1. 检查手机的网络连接状态,确保网络连接正常。2. 如果网络连接正常,但是仍然无法进入zepeto,可以尝试等待一段时间后重试。 解决方法二:清除缓存和数…

    other 2023年6月25日
    00
  • matlab读struct成数组

    Matlab读取struct成数组完整攻略 在Matlab中,我们可以使用struct来存储和处理结构化数据。有时候,我们需要将struct转换成数组,以便进行进一步的算和分析。本攻略将详介绍如何将struct转换成数组,包括基本概念、转换方法和示例说明。 基本概念 在Matlab中struct一种用于存储和处理结构化数据的数据类型。struct由一组字段组…

    other 2023年5月6日
    00
  • Python编程中对super函数的正确理解和用法解析

    Python编程中对super函数的正确理解和用法解析 在Python编程过程中,我们通常会涉及到类的继承,而使用super函数可以使得我们在子类中更简单地调用父类的方法,同时避免硬编码。 super函数的基本语法 super函数用于调用父类的方法,其基本语法如下: class ChildClass(ParentClass): def __init__(se…

    other 2023年6月27日
    00
  • 彻底搞明白Spring中的自动装配和Autowired注解的使用

    好的。自动装配是Spring的一种依赖注入(DI)机制,使得Spring能够在运行时自动将一个对象的依赖注入到另一个对象中。使用自动装配可以大大减少开发人员的工作量,提高代码的可读性和可维护性。在Spring中,可以使用@Autowired注解来实现自动装配。 下面是一个简单的示例来说明如何使用@Autowired注解来自动装配依赖: @Component …

    other 2023年6月27日
    00
  • mavenrepository库

    以下是关于Maven Repository库的完整攻略: 什么是Maven Repository库? Maven Repository库是一个用于存储和共享Java项目依赖项的中央存储库。它包含了大量的Java库和框架,可以通过Maven或Gradle等构建工具来访问和使用。 如何使用Maven Repository库? 以下是使用Maven Reposit…

    other 2023年5月6日
    00
  • es批量更新数据刷新

    es批量更新数据刷新 Elasticsearch(简称ES)被广泛应用在各种大数据应用场景中,基于其出色的搜索能力、灵活的数据结构和高性能的存储和检索能力而倍受青睐。在使用 ES 过程中,数据的批量更新和刷新是非常常见的操作,可以提高数据变更的效率和速度,本文将介绍 ES 批量更新数据刷新的具体实现方法。 什么是ES批量更新数据刷新 ES的一个特点就是,当文…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部