本篇摘要
本文围绕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
。
- Ubuntu:卸载命令为
下面来简单测试下:
测试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容器创建:
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容器创建与管理,验证了其隔离性,理解了容器化技术的核心原理与基础操作。