Linux 容器的资源管理
LXC 就是 Linux 容器工具,容器可以提供轻量级的虚拟化,以便隔离进程和资源,使用 LXC 的优点就是不需要安装太多的软件包,使用过程也不会占用太多的资源。LXC 是在 Linux 平台上基于容器的虚拟化技术的未来标准,最初的 LXC 技术是由 IBM 研发的,目前已经进入 Linux 内核,这意味着 LXC 技术将是目前最有竞争力的轻量级虚拟容器技术。本文将循序渐进地介绍在 Linux 容器中如何管理几种主要资源设备:内存、CPU 、硬盘存储器。
什么是虚拟机的重要资源
资源管理是将资源从资源提供方分配到资源用户的一个过程。对于资源管理的需求来自于资源过载(即,需求大于容量)以及需求与容量随着时间的推移而有所差异的事实。通过资源管理,可以动态重新分配资源,以便更高效地使用可用容量。资源包括 CPU(中央处理器)、内存、存储器和网络资源。本文主要介绍内存、CPU(中央处理器)和存储器。
LXC 虚拟机资源调配的两种方法
直接修改配置文件
LXC 虚拟机的配置文件是 lxc.conf,LXC 配置项都是以 key=value 的形式,LXC 采用 cgroup 系统来对容器进行资源管理,因此 cgroup 的各个子系统均可以使用。一个完成的配置文件包括 cgroup 部分、network 部分、rootfs 部分。 通过修改配置文件用户可以直接 LXC 虚拟机资源调配。本文主要介绍第二种方法。
使用相关命令行工具
LXC 采用 cgroup 来对容器进行资源管理,并且所有 cgroup 子系统的配置参数均可以通过 lxc-cgroup 命令进行动态获得或者调整。首先看看 lxc-cgroup 命令的使用方法。 lxc-cgroup 命令格式:
lxc-cgroup --name=NAME subsystem [value]
- -n, —name=NAME 容器名称
- Subsystem 指定子系统对照组名
- [value] 指定子系统对照组要设置值
- 配置 LXC 虚拟计算机的 CPU(中央处理器)资源
说明下面笔者使用的 LXC 虚拟计算机名称是 cjhlxc(下同):
1、首先查看虚拟机目前使用的资源列表
#lxc-cgroup -n cjhlxc devices.list
2、 查看 LXC 虚拟计算机 cjhlxc 目前 CPU(中央处理器)资源使用情况 说明首先用户必须启动这个 cjhlxc,然后查看
$ lxc-start -n cjhlxc -d
$ lxc-cgroup -n cjhlxc cpuset.cpus
操作过程见图 1
图 1
说明:0-1 表示确实情况下 LXC 虚拟计算机使用是全部 CPU(中央处理器) 。 3 指定 LXC 虚拟计算机 cjhlxc 只能使用 CPU 1
#lxc-cgroup -n cjhlxc cpuset.cpus "1"
除了使用 lxc-cgroup 命令,也可以直接修改 LXC 虚拟计算机的配置文件:
# sudo vim /var/lib/lxc/cjhlxc /config
在文件结尾处添加一行:
〝lxc.cgroup.cpuset.cpus = 1〞
然后存盘退出。 然后用户可以重新查看一下
#lxc-cgroup -n cjhlxc cpuset.cpus
1
注意此时输出直接从“0-1”变成“1”
说明:cpuset.cpus 是cpuset 子系统中的参数,指定允许这个 cgroup 中任务访问的 CPU(中央处理器)。这是一个用逗号分开的列表,格式为 ASCII,使用小横 线(”-“)代表范围,例如:cpuset.cpus=1,2-4
安装 mpstat 工具进行验证
首先登录 LXC 虚拟计算机安装 sysstat 工具包
lxc-console –n cjhlxc
下面这个命令是在 LXC 虚拟计算机 cjhlxc 上执行的
$ sudo apt-get install sysstat
$ mpstat -P ALL 2
输出见图 2
图 2
图 2 显示 CPU(中央处理器) 0 使用率低于 CPU(中央处理器) 1, 不过 CPU(中央处理器) 0 使用率也会变高, 因 mpstat 命令是显示物理 CPU(中央处理器) 信息, 主机计算机还是会使用 CPU(中央处理器) 0 。
更加细化分配 CPU(中央处理器)资源
lxc 通过 cgroup 实现资源隔离功能。从 CPU 资源来说,主要有两个变量 cpu.shares 和 cpuset.cpus。cpu.shares 是一个 lxc 使用 cpu 的份额,按照百分比来计算。另外 cgroup 的目录下还有一个 cpu.shares 的文件,对其写入整数值可以控制该 cgroup 获得的时间片。如果我们希望 cjhlxc1 使用更多的 CPU(中央处理器)资源,cjhlxc2 使用较少的 CPU(中央处理器)资源,那么可以使用如下命令设置:
# lxc-cgroup -n cjhlxc2 cpu.shares 512
# lxc-cgroup -n cjhlxc1 cpu.shares 1024
通过以上设置后 cjhlxc1 资源占用比例是 66%,cjhlxc2 资源占用比例是 33% 。 说明:LXC 支持动态分配调整,以上操作均在不停止应用程序前提下完成。LXC 支持“资源抢占”,在共享 cpu 的前提下,忙碌的 lxc 会抢占闲置 lxc 的资源。 回页首
配置 LXC 虚拟计算机的内存资源
内存子系统自动生成 cgroup 中任务使用的内存资源报告,并设定由那些任务使用的内存限制,内存子系统有两个参数:
memory.limit_in_bytes
:设定用户内存的最大量(包括文件缓存)。
memory.memsw.limit_in_bytes
:设定最大内存与 swap 用量之和。
应用实例
1、设置 LXC 虚拟计算机 cjhlxc 使用的内存容量是 320 兆 使用 lxc-cgroup 命令 如果用户希望 LXC 虚拟计算机 cjhlxc 使用的内存容量是 320 兆,可以使用如下命令设置: 下面使用 lxc-cgroup 命令修改
# lxc-cgroup -n cjhlxc memroy.limit_in_bytes 320000000
除了使用 lxc-cgroup 命令,也可以直接修改 LXC 虚拟计算机的配置文件:
# sudo vim /var/lib/lxc/cjhlxc /config
把配置文件添加一行:
lxc.cgroup.memory.limit_in_bytes = 320000000
2、设置 LXC 虚拟计算机 cjhlxc 取消 swap 功能 直接修改 LXC 虚拟计算机的配置文件
vim /var/lib/lxc/myUS1204_bak/config
加入以下二行
lxc.cgroup.memory.limit_in_bytes = 300000000
lxc.cgroup.memory.memsw.limit_in_bytes = 300000000 # 此项目的设定值与 memory.limit_in_bytes 一样, 代表取消 swap 功能
为 LXC 虚拟计算机添加硬盘存储器
首先用户要在主机上添加一块新硬盘并且格式化,限于篇幅这里笔者不进行详细介绍。下面看看如何添加到 LXC 虚拟计算机 cjhlxc : 在 LXC 虚拟计算机建立挂载目录
$ sudo mkdir /var/lib/lxc/cjhlxc/rootfs/mnt/mydisk
挂载新增硬盘至 LXC 虚拟计算机的挂载目录
$sudo mount /dev/sdb1 /var/lib/lxc/cjhlxc/rootfs/mnt/disk1
在挂载目录新增 abc 的 目录
$ sudo touch /var/lib/lxc/cjhlxc/rootfs/mnt/disk1/abc
说明以上三个步骤在主机上操作,rootfs 用于指定容器的虚拟根目录,设定此项以后,容器内所有进程将会把此目录根目录,不能访问此目录之外的路径,相当于 chroot 的效果 。下面启动 LXC 虚拟计算机完成添加。
$ sudo lxc-start -n cjhlxc -d
$ sudo lxc-console -n cjhlxc
查看使用挂载目录内容 (在 LXC 虚拟计算机中操作)
LXC 虚拟计算机的监控
查看所有使用中的容器,使用命令:
# lxc-ls --active
cjhlxc
查看一个容器的使用情况,使用命令:
# lxc-info -n cjhlxc
state: RUNNING
pid: 10171
查看容器中进程,使用命令:
监控容器的状态
说明:lxc-monitor 命令用来监控一个容器状态的变换,当一个容器的状态变化时,lxc-monitor 命令会在屏幕上打印出容器的状态变化过程。
总结
使用 LXC 的优点就是不需要安装太多的软件包,使用过程也不会占用太多的资源,Linux conatiners (LXC) 是在 Linux 平台上基于容器的虚拟化技术的未来标准,最初的 LXC 技术是由 IBM 研发的,目前已经进入 Linux 内核,这意味着 LXC 技术将是目前最有竞争力的轻量级虚拟容器技术,到此为止本文将循序渐进地介绍在 Linux 容器的建立管理和如何管理几种主要资源设备:网络接口、内存、CPU(中央处理器) 、硬盘存储器。下面笔者把 LXC 和 Linux 下其它两种主要的虚拟技术做一些简单的对比见表 1
表1
LXC 的优缺点
优点
- 虚拟化开销小,一台物理机可以运行很多“小”虚拟机。
- 通过 cgroup 的方法增减 CPU(中央处理器)/内存非常方便,调整速度很快。
- 虚拟机运行速度和本地环境相同的速度基本相同。
缺点
- 不能热迁移 。
- 不能模拟不同体系结构、装不同操作系统。
- 安全隔离差 。
原文链接:http://www.ibm.com/developerworks/cn/linux/1404_caojh_lxc/index.html
- 自定义ArrayAdapter
- ListActivity和自定义列表项
- ListView列表数据源——Adapter
- 初识ListView
- 响应Android系统的事件
- ImageSwitcher和TextSwitcher
- Android BLE 基础框架全新改版
- Android 混淆从入门到精通
- 基础篇章:关于 React Native 之 ViewPagerAndroid 组件的讲解
- 基础篇章:关于 React Native 之 DrawerLayoutAndroid 组件的讲解
- Android 使用 ApachePOI 组件读写 Word doc 和 docx 文件
- Android 开发中如何动态加载 so 库文件
- 良心推荐:总结 Android 开发中必备的代码 Review 清单
- 强烈推荐:基于Java反射实现一个 Android ORM 框架
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【线上排查实战】AOP切面执行顺序你真的了解吗
- 使用markdown,knitr和pandoc在R语言中编写可重现的报告
- R语言广义线性模型(GLMs)算法和零膨胀模型分析
- R语言中广义线性模型(GLM)中的分布和连接函数分析
- R语言自适应平滑样条回归分析
- R语言区间数据回归分析
- R语言ggsurvplot绘制生存曲线报错 : object of type ‘symbol‘ is not subsettable
- R软件SIR模型网络结构扩散过程模拟
- R语言中使用线性模型、回归决策树自动组合特征因子水平
- R语言缺失值的处理:线性回归模型插补
- R语言如何解决线性混合模型中畸形拟合(Singular fit)的问题
- Android如何在Gradle中更改APK文件名详解
- 面试中常见的 C 语言与 C++ 区别的问题
- Linux系统实现ansible自动化安装配置httpd的方法
- 常用Linux发行版镜像源配置小结