岳麓做网站的公司域名直卖网
本篇摘要
本文围绕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容器创建与管理,验证了其隔离性,理解了容器化技术的核心原理与基础操作。
