从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容器创建:

cpp 复制代码
lxc-create -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容器创建与管理,验证了其隔离性,理解了容器化技术的核心原理与基础操作。

相关推荐
好运连连9995 小时前
ubuntu promethus+grafana监控多台服务器
linux·ubuntu·grafana
zjj5875 小时前
服务器音频查找
服务器·windows·音视频
Mr_Xuhhh5 小时前
Qt中UDP回显服务器和客户端
服务器·qt·udp
额呃呃5 小时前
阻塞,非阻塞,同步,异步的理解
linux·服务器·网络
LLLLYYYRRRRRTT5 小时前
云计算与服务器
运维·服务器·云计算
大余里5 小时前
windows下查看别的服务器的端口是否通
linux·运维·服务器·windows
蒋星熠5 小时前
Redis 7.0 高性能缓存架构设计与优化
数据库·redis·分布式·python·缓存·docker·微服务
袋子(PJ)5 小时前
codecombat(Ubuntu环境详细docker部署教程)
运维·docker·容器
矢志不移7925 小时前
SQLite 数据库
数据库·sqlite