当前位置: 首页 > news >正文

从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

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

stress

  1. 功能:Linux 的压力测试工具,可对 CPU、Memory、IO、磁盘进行压力测试。
  2. 语法stress [OPTION [ARG]]
  3. 常用参数
    • -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:程序运行过程中不输出信息。
  4. 安装
    • 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组的位置:
在这里插入图片描述

在这里插入图片描述

  1. 计算公式:CPU 使用率 = cfs_quota_us / cfs_period_us
  2. cfs_period_us:表示一个 CPU 带宽,单位为微秒,默认值 100000(即 100ms,对应系统总 CPU 带宽)。
  3. cfs_quota_us:表示 Cgroup 可使用的 CPU 带宽,单位为微秒。值为 -1 时不限制 CPU;最小值 1ms(1000),最大值 1s(100000)。
  4. 设置示例:将 cfs_quota_us 设为 30000(即 30ms),理论上可限制对应进程的 CPU 使用率为 30%(30000 / 100000 = 30%)。

这里发现这里面控制的进程对cpu利用可以满,创建对应测试目录进入。

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

  • 进行添加对应进程。

最后观察监测情况:

在这里插入图片描述

  • 发现符合预期。

二.LXC容器

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

  2. LXC的特点与局限

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

  1. 检查并停止容器

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

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

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

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

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

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

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 发现不存在。

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

lxc-create -t ubuntu --name host1 -- -r xenial -a amd64

解释下:

参数/部分含义
lxc-createLXC 的核心命令,用于创建新容器
-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容器创建与管理,验证了其隔离性,理解了容器化技术的核心原理与基础操作。

http://www.xdnf.cn/news/1378873.html

相关文章:

  • 冒泡排序算法详解(python code)
  • Two Knights (数学)
  • 大模型微调示例三之Llama-Factory_Lora
  • 【C++详解】用哈希表封装实现myunordered_map和 myunordered_set
  • Kubernetes一Prometheus概述
  • [linux仓库]透视文件IO:从C库函数的‘表象’到系统调用的‘本质’
  • [调试][实现][原理]用Golang实现建议断点调试器
  • 获取小红书某个用户列表
  • 【LeetCode 热题 100】32. 最长有效括号——(解法二)动态规划
  • 集成电路学习:什么是TensorFlow
  • AI实时故障诊断系统(实时采集信号)
  • Python 正则表达式完全指南:从基础语法到实战案例
  • 【从0带做】基于Springboot3+Vue3的呱呱同城(微服务项目)
  • 实现微信小程序的UniApp相机组件:拍照、录像与双指缩放
  • ARM相关的基础概念和寄存器
  • PCIe 5.0 SSD连续读写缓存用完速度会骤降吗?
  • 2024年09月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 帕累托优化:多目标决策的智慧与艺术
  • 【重学 MySQL】九十二、 MySQL8 密码强度评估与配置指南
  • 关于virtual camera
  • 【C++游记】模板升级
  • 【半导体制造流程概述】
  • windows 子系统 wsl 命令的用法
  • vue3 字符 居中显示
  • SpringBoot整合Redis:从入门到实战的完整指南
  • 关于DTO、DO、BO、VO
  • 工业 DCS 全面科普:从入门到 AI 赋能的未来
  • mybatis-plus实现苍穹外卖项目-分类操作,不定期更新-day2
  • 【和春笋一起学C++】(三十七)类的析构函数
  • 死锁产生的条件是什么? 如何进行死锁诊断?