欢迎光临
我们一直在努力

从Cgroups精准调控到LXC容器全流程操作​:用pidstat/stress测试Cgroups限流,手把手玩转Ubuntu LXC容器全流程​

本篇摘要

本文围绕Linux资源管理与容器技术展开,通过pidstat监控、stress压测演示Cgroups对CPU/内存的精准控制,并实战Ubuntu 22.04下LXC容器的创建、隔离及销毁,验证资源限制与轻量级虚拟化能力。

在这里插入图片描述

欢迎拜访: 点击进入博主主页 本篇主题: Docker之cgroups+lxc操作详解 制作日期: 2025.08.28 隶属专栏: 点击进入所属Docker专栏

一. Cgroups资源控制

pidstat与stress

pidstat

  • 所属工具集:是 sysstat 工具集的一部分。
  • 功能:监控全部或指定进程的 CPU、内存、线程、设备 IO 等系统资源占用情况。首次采样显示自系统启动以来的统计,后续采样显示自上次命令以来的统计,可指定采样次数和时间。
  • 语法:pidstat [选项] [时间间隔] [次数]
  • 常用参数:
    • -u:默认参数,显示各进程的 CPU 使用统计。
    • -r:显示各进程的内存使用统计。
    • -d:显示各进程的 IO 使用情况。
    • -p:指定进程号,ALL 表示所有进程。
    • -C:指定命令。
    • -l:显示命令名和参数。
  • 安装(Ubuntu):卸载命令为 apt remove sysstat -y,安装命令为 apt install sysstat -y。
  • stress

  • 功能:Linux 的压力测试工具,可对 CPU、Memory、IO、磁盘进行压力测试。
  • 语法:stress [OPTION [ARG]]
  • 常用参数:
    • -c, –cpu N:产生 N 个进程,每个进程循环调用 sqrt 函数产生 CPU 压力。
    • -i, –io N:产生 N 个进程,每个进程循环调用 sync 将内存缓冲区内容写到磁盘上产生 IO 压力,SSD 磁盘环境可能因大量调用 sync 导致 sys 升高但 iowait 为 0。
    • -m, –vm N:产生 N 个进程,每个进程循环调用 malloc/free 函数分配和释放内存。
    • –vm-bytes B:指定分配内存的大小。
    • –vm-keep:一直占用内存,区别于不断释放和重新分配。
    • -d, –hdd N:产生 N 个不断执行 write 和 unlink 函数的进程(创建文件,写入内容,删除文件)。
    • –hdd-bytes B:指定文件大小。
    • -t, –timeout N:在 N 秒后结束程序。
    • -q, –quiet:程序运行过程中不输出信息。
  • 安装:
    • Ubuntu:卸载命令为 apt remove stress -y,安装命令为 apt install stress -y。
  • 下面来简单测试下:

    测试stress对用户cpu模拟产生压力:

    在这里插入图片描述

    在这里插入图片描述

    测试stress对内核cpu模拟产生压力:

    在这里插入图片描述

    在这里插入图片描述

    测试stress对写入文件产生压力:

    在这里插入图片描述

    在这里插入图片描述 在这里插入图片描述

    其他测试就不过多演示了。

    cgroups

    相当于进行资源控制的。

    查看支持版本: 在这里插入图片描述 在这里插入图片描述

    • 支持两个版本!

    查看cgroups系统:

    在这里插入图片描述

    通过挂载信息找到不同方位控制组存储位置:

    在这里插入图片描述

    查看对shell的cpu的控制信息:

    在这里插入图片描述 在这里插入图片描述

    使用cgroups进行对内存的控制

    查看相关内容挂载信息:

    在这里插入图片描述

    进入关于内存的挂载位置:

    在这里插入图片描述 在对应目录里面创建目录,让它受到cgroup控制,发现被初始化好了:

    在这里插入图片描述 查看最大内存使用限制:

    在这里插入图片描述

    这里改成 20M:

    在这里插入图片描述

    然后进行对内存的压力测试(写50M)及监测:

    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

    • 发现正常。

    但是如果把对应的pid放入到cgroup限制的里面,它就只能被限制使用20M,然后对应的stress对应的12817进程就会被杀死。

    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

    • 符合预期。

    总结下:这里对应cgroups有个专门控制内存的文件夹,然后进去后,只要在这里面创建目录,就会自动被初始化一些配置信息,然后这里可以对内存进行限制,然后只需要把对应pid写入对应tasks里面,然后这个进程运行就会收到cgroup里面配置信息的限制了!

    使用cgroups进行对用户级cpu的控制

    首先我们让stress不停的进行计算的压力测试(在用户cpu内),然后一开始会看到cpu被打满,之后让这个stress进程被它管理起来,然后把对应的cpu利用上线搞到20%,观察pidstat检测情况:

    先查找一样cpu组的位置: 在这里插入图片描述

    在这里插入图片描述

  • 计算公式:CPU 使用率 = cfs_quota_us / cfs_period_us
  • cfs_period_us:表示一个 CPU 带宽,单位为微秒,默认值 100000(即 100ms,对应系统总 CPU 带宽)。
  • cfs_quota_us:表示 Cgroup 可使用的 CPU 带宽,单位为微秒。值为 -1 时不限制 CPU;最小值 1ms(1000),最大值 1s(100000)。
  • 设置示例:将 cfs_quota_us 设为 30000(即 30ms),理论上可限制对应进程的 CPU 使用率为 30%(30000 / 100000 = 30%)。
  • 这里发现这里面控制的进程对cpu利用可以满,创建对应测试目录进入。

    启动对应的压力测试+监测:

    在这里插入图片描述

    • 监测对应的stress名字的进程,每1秒打一次,200000000次。

    在这里插入图片描述

    • 进行1个进程计算来对用户cpu进行压力测试。

    在这里插入图片描述

    • 把对应的cgroup组可用cpu限制在20%。

    在这里插入图片描述

    • 进行添加对应进程。

    最后观察监测情况:

    在这里插入图片描述

    • 发现符合预期。

    二.LXC容器

  • LXC是什么: LXC(LinuX Containers)即Linux容器,属于操作系统层虚拟化技术,是Linux内核容器功能的用户空间接口。它把应用软件系统打包成“容器”,容器内包含应用代码、所需操作系统核心与库;借助统一名字空间和共享API分配硬件资源,为应用打造独立沙箱运行环境,让Linux用户能便捷创建、管理系统或应用容器。

  • LXC的特点与局限:

    • 它是早期简化容器技术使用的方案,用简易工具和模板降低了容器技术使用门槛。
    • 但和“直接通过内核调用来用容器技术”比,复杂度没降太多——得学习LXC命令工具,且内核创建依赖命令,批量操作做数据迁移不方便;隔离性也不如虚拟机强。
  • 与Docker的关系:

    LXC存在局限后,Docker出现。某种程度上,Docker可看作LXC的增强版,弥补了LXC在易用性、隔离性等方面的不足,推动容器技术进一步普及和发展。

  • 简单来说,LXC是Linux下较早的容器化技术,简化了容器使用但也存在操作门槛与隔离性短板,后续Docker在其基础上做了诸多优化增强,成为更流行的容器解决方案之一。

    如图:

    在这里插入图片描述

    LXC指令

    1. 检查与准备

    • lxc-checkconfig:检查系统环境是否能满足容器运行要求。

    2. 容器生命周期管理

    • lxc-create:创建新的LXC容器,需指定容器名称与使用的模板。
    • lxc-start:启动指定的LXC容器(示例中用了 -d 后台启动)。
    • lxc-stop:停止正在运行的LXC容器。
    • lxc-destroy:删除已停止的LXC容器。

    3. 容器信息查看与交互

    • lxc-ls:列出当前系统中所有LXC容器(可加 -f 打印更详细信息)。
    • lxc-info:查看某一个LXC容器的详细信息。
    • lxc-attach:进入容器内部并执行指定命令(也可直接进入交互式Shell)。

    基于linux的ubuntu22.04进行简单的容器生成测试

    1.首先安装LXC:

    这段内容主要是关于在Ubuntu系统上安装LXC(Linux Containers)的步骤,分为卸载已有LXC和全新安装LXC两部分,最后还提到了CentOS安装(但内容未展示完)。下面是简单概括:

    Ubuntu 安装前的卸载(若有旧版LXC)

    如果要卸载旧版LXC,按以下步骤清理:

  • 检查并停止容器:

    • 用 systemctl status lxc 查看LXC服务状态。
    • 用 lxc-stop -n xxx 停止指定容器(xxx 是容器名);也可先用 lxc-ls -f 遍历所有容器再批量停止。
    • 用 lxc-destroy -n xxx 删除已停止的容器。
  • 卸载LXC软件包: 执行 apt-get purge –auto-remove lxc lxc-templates 彻底卸载LXC及模板。

  • 验证卸载: 再次执行 systemctl status lxc,确认服务已不存在,说明卸载完成。

  • Ubuntu 全新安装LXC(无旧版时)

    若系统没装过LXC,直接执行安装:

  • 安装必要软件包: 运行 apt install lxc lxc-templates bridge-utils -y,一次性装好LXC主程序、配置模板、网桥工具。

  • 检查服务状态: 执行 systemctl status lxc,确认LXC服务正常运行。

  • 2.检查对状态以及是否存在容器:

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    • 发现不存在。

    3.下面进行LXC容器创建:

    lxccreate t ubuntu name host1 r xenial a amd64

    解释下:

    参数/部分含义
    lxc-create LXC 的核心命令,用于创建新容器。
    -t ubuntu 指定使用 Ubuntu 模板 来创建容器(即基于 Ubuntu 系统镜像生成容器)。这里的 ubuntu 是 LXC 预置的模板名称,代表官方提供的 Ubuntu 安装模板。
    –name host1 设置容器的名称为 host1(后续通过该名称管理容器,如启动、停止等)。
    分隔符,用于区分 lxc-create 的通用参数和 模板特有的参数(后面 -r 和 -a 是 Ubuntu 模板专用的)。
    -r xenial 指定容器的 Ubuntu 版本为 xenial(即 Ubuntu 16.04 LTS)。-r 是模板参数,代表 release(发行版版本)。
    -a amd64 指定容器的 系统架构为 amd64(即常见的 64 位 x86 架构,适用于大多数现代电脑)。-a 是模板参数,代表 architecture(架构)。

    在这里插入图片描述

    • 成功并返回对应的用户名及密码。

    4.检查相关信息:

    在这里插入图片描述

    • 没有运行,其他正常。

    5.启动容器,换个机器进行ssh连接对应容器:

    在这里插入图片描述

    在这里插入图片描述

    6.测试下功能:

    新机器:

    在这里插入图片描述

    宿主机:

    在这里插入图片描述

    • 这里发现明显不一样,说明对应的容器已经与外界隔离了。

    7.宿主机进入容器内部执行:

    在这里插入图片描述

    8.停止运行容器+释放:

    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

    • 成功销毁!

    三.本篇小结

    我通过实战掌握了用pidstat和stress测试Cgroups资源控制,限制CPU和内存;并在Ubuntu上实操LXC容器创建与管理,验证了其隔离性,理解了容器化技术的核心原理与基础操作。

    赞(0)
    未经允许不得转载:171主机测评 » 从Cgroups精准调控到LXC容器全流程操作​:用pidstat/stress测试Cgroups限流,手把手玩转Ubuntu LXC容器全流程​
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址