目录
2.要使用Linux CGroup,则需要先通过执行以下步骤确认Linux的内核是否启用了Linux CGroup。
3.示例1,通过Linux CGroup限制应用的CPU使用率。
4.示例2,通过Linux CGroup限制应用使用系统内存。
5.示例3,通过Linux CGroup限制应用使用I/O带宽。
一、理论讲解
- 有了Docker的镜像,就可以创建Docker容器了。Docker容器是一种轻量级的虚拟化方式可以在“秒”级时间内快速启动和停止。另外,Docker容器对系统资源(如CPU、内存、I/O带宽)的要求很低。除运行在容器中的应用外,Docker容器基本不会消耗其他的系统资源。
1.Docker容器的基本概念与操作。
- Docker的容器类似操作系统的文件夹,其中包含应用和应用运行时所需要的依赖环境。每一个Docker容器都是从Docker镜像创建的。
- Docker容器的操作包括:创建容器、停止容器、进入容器、删除容器、导入和导出容器、查看容器等。
(1)创建容器,创建Nginx容器,改名为“mycontainer”。
[root@localhost ~]# docker create --name mycontainer nginx
[root@localhost ~]# docker ps -a 查看容器
[root@localhost ~]# docker run -d -p 60:70 nginx 创建并启动容器
- -d:启动容器的守护进程。
- -p:将容器内的68端口映射到宿主机的67端口。这样就可以通过宿主机访问容器内部了。
(2)启动和停止容器,c9ded80f1ffb是容器ID。
[root@localhost ~]# docker start c9ded80f1ffb 启动
[root@localhost ~]# docker stop c9ded80f1ffb 停止
(3)进入容器,mycontainer是Nginx改的名字。
[root@localhost ~]# docker exec -it mycontainer /bin/bash
root@c9ded80f1ffb:/# exit 退出
(4)删除容器,容器要停止了才能删除。
[root@localhost ~]# docker stop c9ded80f1ffb 停止
[root@localhost ~]# docker rm c9ded80f1ffb 删除
[root@localhost ~]# docker ps -a 查看
(5)在A机器上存出镜像,把dokken/centos-8镜像存出了,名为centos8。
[root@localhost ~]# docker images
[root@localhost ~]# docker save -o centos8 dokken/centos-8
[root@localhost ~]# ls
- 将存出的镜像从A机器复制到B机器,需要在B机器上使用该镜像,就可以将该导出文件导入到B机器的镜像库中,这一过程叫作载入镜像。
(6)在B机器上载入镜像。
[root@localhost ~]# docker load --input centos8 第一种方法
[root@localhost ~]# docker load < centos8 第二种方法
二、管理容器的资源
1.什么是Linux CGroup
由于Docker结构在Linux的基础之上,因此从Linux底层来看,Docker是利用Linux Control Group(简称Linux CGroup)来实现对资源使用的控制。因此,要掌握Docker容器的资源管理有必要先了解一下什么是Linux CGroup。
Linux CGroup主要提供以下功能
-
Resourcelimitation:限制资源的使用,例如,使用CPU及内存的上限。
-
Prioritization:应用的优先级控制,例如,控制任务的调度。
-
Accounting:应用的审计和统计,例如,实现应用的计费。
-
Control:实现对应用的控制,例如,应用的挂起,恢复和执行等。
2.要使用Linux CGroup,则需要先通过执行以下步骤确认Linux的内核是否启用了Linux CGroup。
(1)查看操作系统的发行版本。
[root@localhost ~]# uname -r 查看
3.10.0-957.el7.x86_64
(2)根据操作系统的发行版本,可以确认是否启用了Linux CG roup。CGROUP参数的值是“y”,表示已经启动Linux CGroup。
[root@localhost ~]# cat /boot/config-3.10.0-957.el7.x86_64 | grep CGROUP
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_NETPRIO_CGROUP=y
3.示例1,通过Linux CGroup限制应用的CPU使用率。
(1)开发一段C语言程序代码产生一个死循环,并将代码保存为hello.c。
[root@localhost ~]# vim hello.c 添加以下内容
//hello.c
int main(void)
{
int i = 0;
for(;;) i++;
return 0;
}
(2)将程序代码进行编译。
[root@localhost ~]# gcc -o hello hello.c
(3)执行程序代码,这时程序将产生死循环无法退出。
[root@localhost ~]# ./hello
(4)在一个新的命令行窗口中,查看监控应用hello的CPU使用率,可以看到已经达到了99.7%。
[root@localhost ~]# top
(5)创建一个新的子目录,hello目录用于设置CPU使用率的闻值。
[root@localhost ~]# cd /sys/fs/cgroup/cpu 切换到cpu目录上
[root@localhost cpu]# mkdir hello 创建hello子目录
[root@localhost cpu]# ls hello/ 查看hello目录
(6)查看文件cpu.cfs_quota_us的内容。
[root@localhost cpu]# cd hello/ 切换到hello目录
[root@localhost hello]# cat cpu.cfs_quota_us
-1 -1表示没有对其CPU使用率进行限制
(7)执行以下语句将CPU使用率的闻值设置为20%。
[root@localhost hello]# echo 20000 > cpu.cfs_quota_us
(8)将应用hello的进程ID写入tasks文件。
[root@localhost hello]# top 查看进程ID
[root@localhost hello]# echo 15317 > tasks
(9)再次观察“top”命令的输出信息,发现应用hello的CPU使用率降到了20%。
(10)重新启动一个hello应用,并按照上面的步骤将进程ID写入tasks文件。两个hello应用各自占用10%的CPU使用率。
[root@localhost ~]# ./hello 重启hello
[root@localhost hello]# echo 20000 > cpu.cfs_quota_us CPU使用率设置为20%
[root@localhost hello]# top 查看进程ID
[root@localhost hello]# echo 8151 > tasks 将hello的进程ID写入tasks
[root@localhost hello]# top 查看CPU使用率
4.示例2,通过Linux CGroup限制应用使用系统内存。
(1)进入“/sys/fs/cgroup/memory/”目录下,创建子目录hello。
[root@localhost ~]# cd /sys/fs/cgroup/memory/
[root@localhost memory]# mkdir hello
[root@localhost memory]# cd hello
(2)查看文件memory.limit_in_bytes内容,9223372036854771712表示没有对内存进行任何限制
[root@localhost hello]# more memory.limit_in_bytes 查看
9223372036854771712 输出的内容
(3)给内存设置为64KB的值,如果应用内存超过了该值,则该应用会被系统自动“杀掉”。
[root@localhost hello]# echo 64k > memory.limit_in_bytes
(4)生效配置,将应用hello的进程ID 写入tasks 文件。
[root@localhost hello]# top 查看进程ID
[root@localhost hello]# echo 9186 > tasks
[root@localhost hello]# more memory.limit_in_bytes
65536
5.示例3,通过Linux CGroup限制应用使用I/O带宽。
(1)安装“iotop”工具,为了更好地观察结果。
root@localhost ~]# yum -y install iotop
(2)使用Liunx的“dd”命令从磁盘持续读写数据。
[root@localhost ~]# dd if=/dev/sda of=/dev/null
[root@localhost ~]# iotop
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
10666 be/4 root 699.49 M/s 0.00 B/s 0.00% 0.00% dd if=/de~/dev/null
(3)查看设备“/dev/sda”的信息,设备“/dev/sda”备号是“disk 8, 0”。
[root@localhost ~]# ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 11月 24 09:17 /dev/sda
(4)使用Linux CGroup限制I/O对设备“/dev/sda”的读取速率。
[root@localhost ~]# mkdir /sys/fs/cgroup/blkio/io 创建目录
[root@localhost ~]# cd /sys/fs/cgroup/blkio/io/ 切换
[root@localhost io]# echo '8:0 1048576' > blkio.throttle.read_bps_device 限制
(5)将“dd”命令的进程ID写入tasks文件。
[root@localhost io]# iotop 查看ID进程
[root@localhost io]# echo 10666 > tasks 写入tasks文件
(6)查看结果。
[root@localhost io]# iotop 查看ID进程
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
10666 be/4 root 3.35. M/s 0.00 B/s 0.00% 0.00% dd if=/de~/dev/null

被折叠的 条评论
为什么被折叠?



