05. 容器资源管理

这篇具有很好参考价值的文章主要介绍了05. 容器资源管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、前言

2、CGroup

2.1、是否开启CGroup

2.2、Linux CGroup限制资源能使用

2.2.1、创建一个demo

2.2.2、CGroup限制CPU使用

2.3、Linux CGroup限制内存使用

2.4、Linux CGroup限制IO

3、Docker对资源的管理

3.1、Docker对CPU的限制

3.1.1、构建一个镜像

3.1.2、构建两个容器

3.1.3、查看CPU使用率

3.2、Docker对内存的限制

3.3、Docker对IO的限制

3.4、查看Docker的资源配置


1、前言

通常情况下,我们一台宿主机上会同时启动多个Docker容器,而在默认情况下,Docker是没有限制其运行的容器所使用的硬件资源,比如CPU,内存,IO等。而在实际环境中,往往一个容器的负载过高,会占用宿主机的大部分资源,会导致其他容器的访问资源被抢占,而出现响应超时或无法响应等情况。

因此,我们往往会对同时启动的Docker容器做资源的分配和管理。这就是我们今天要说的容器资源管理。

05. 容器资源管理,云原生,docker,云原生,linux

2、CGroup

熟悉Linux的应该知道,Linux内核提供了一组为cgroup(Controller Group)的进程,通过这些进程可以限制应用对资源的使用,如CPU,内存等。通过cgroup可以对系统资源做精细化控制,例如实现对每个容器使用的CPU比率进行限制。

Linux CGroup主要提供了几种功能:

  • Resource Limitation:限制资源的使用,如CPU,内存的上限。
  • Prioritization:应用的优先级控制,如控制任务的调度。
  • Accounting:应用的审计和统计,例如实现应用的计费。
  • Control:实现对应用的控制,例如应用的挂起,恢复和执行等。

2.1、是否开启CGroup

cat /boot/config-3.10.0-1160.el7.x86_64 |grep CGROUP

如果相关参数是y,表示已经启动了Linux CGroup,默认是开启的。

05. 容器资源管理,云原生,docker,云原生,linux

2.2、Linux CGroup限制资源能使用

2.2.1、创建一个demo

创建一个high_cpu.java文件。

touch high_cpu.java

编写一段死循环代码。

class HighCpu {
    public static void main(String args[]) {
        int i=0;
        while(true){
            i++;
        }

    }
}

再编译执行他。

javac high_cpu

nohup java HighCpu &

执行完观察cpu占用情况。

htop

我这里启了两个,所以两个进程。但是不影响我们观测,可以看到进程3999的CPU使用率已经接近100%。

05. 容器资源管理,云原生,docker,云原生,linux

安装htop步骤:

yum -y install epel-release.noarch

yum -y install htop

2.2.2、CGroup限制CPU使用

1)首先进入系统cgroup目录下。

cd /sys/fs/cgroup/
ls

可以看到里面有很多熟悉的资源相关文件,如cpu,memory,blkio等。

05. 容器资源管理,云原生,docker,云原生,linux

没错,我们要限制cpu使用,当然是进入到cpu/目录。

cd spu/
# 创建我们自己的资源隔离脚本,
mkdir mycpu
cd mycpu
ls

可以看到在里面默认生成很多cpu相关的脚本文件。

05. 容器资源管理,云原生,docker,云原生,linux

我们着重看cpu.cfs_quota_us。

cat cpu.cfs_quota_us

里面的值为-1,则表示不限制cpu使用。

05. 容器资源管理,云原生,docker,云原生,linux

我们修改他的值为2000,也就是限制20%阈值。

echo 20000 > cpu.cfs_quota_us

#同时把我们上面的进程号(3999)写进tasks文件
echo 3999 > tasks

05. 容器资源管理,云原生,docker,云原生,linux

我们再htop观察下cpu占用,可以看到CPU使用已经成功降到了20%的上限。

05. 容器资源管理,云原生,docker,云原生,linux

2.3、Linux CGroup限制内存使用

同上面的CPU限制,内存限制也类似。

cd /sys/fs/cgroup/memory
mkdir mymem
cd mymem
more memory.limit_in_bytes 

可以看到这个值很大,表示对内存没有进行限制。

05. 容器资源管理,云原生,docker,云原生,linux

同样我们可以通过配置进行调整。

echo 10m > memory.limit_in_bytes

#同时把我们上面的进程号(3999)写进tasks文件
echo 3999 > tasks

这样,内存使用就限制了10m可用。

2.4、Linux CGroup限制IO

cd /sys/fs/cgroup/blkio
mkdir myio
cd myio
echo '8:0 1048576' > blkio.throttle.read_bps_device

#同时把我们上面的进程号(3999)写进tasks文件
echo 3999 > tasks

上面的"8:0"是当前需要限制的设备号。如要查看/dev/sda磁盘的设备号,可以使用ls -l /dev/sda。

3、Docker对资源的管理

为什么前面说了那么多Linux CGroup对资源的管理?因为Docker是构建在Linux基础上的,因此Docker就是利用Linux CGroup来实现对资源的控制。那么有了前面CGroup的认识,我们接下来学习Docker资源管理就容易很多。

3.1、Docker对CPU的限制

Docker引擎可以通过-c或--cpu-shares来为每个容器分配一个“CPU使用的权重”。该权重与实际的处理速度无关,每个容器默认有1024个CPU配额权重。

如果启动了两个容器,并且两个都使用默认的权重值 1024,则 Docker 引擎将把 CPU使用率平均分配给这两个容器,即这两个容器各自占用 50%的 CPU使用率。

但是,如果给容器 A分配的是 1024 权重,而给容器 B分配的是 512 权重,则会发现容器A使用CPU的比例比容器B使用 CPU的比例多一倍。

3.1.1、构建一个镜像

创建一个Dockerfile文件,这里直接使用我们前面用过的例子:

# 指定基础镜像作为该容器的基础环境,如springboot应用最起码得有jdk环境
FROM openjdk:8

# 执行维护者的信息
MAINTAINER shamee csdn peng793049488

# 创建一个存放该工程的目录
RUN mkdir -p /data/project
ADD target/dockerfile-springboot-1.0-SNAPSHOT.jar /data/project/dockerfile-springboot-1.0-SNAPSHOT.jar

# 对外暴露一个8899端口
EXPOSE 8899

# 执行启动
ENTRYPOINT ["/bin/sh", "-c", "java -jar /data/project/dockerfile-springboot-1.0-SNAPSHOT.jar"]

使用docker build构建镜像:

docker build -t docker_cgroup .

05. 容器资源管理,云原生,docker,云原生,linux构建完,便可以看到我们的镜像docker_cgroup。

3.1.2、构建两个容器

# 第一个容器, CPU默认(1024)
docker run -d docker_cgroup --cpu 4 --name=cpu_1024

# 第二个容器, CPU配额权重512
docker run -d  -c 512 docker_cgroup --cpu 4  --name=cpu_512

3.1.3、查看CPU使用率

通过命令:

docker stats

可以看到CPU的占用情况,设置1024权重的CPU占用率比512的高将近一倍。

05. 容器资源管理,云原生,docker,云原生,linux

docker stats 命令可以查看容器的CPU,内存,IO等分配,使用情况。下面的内存验证和IO验证均可以使用该命令查看。

除此以外,还可以设置以下参数,直接绑定CPU核心数:

# 表示使用CPU0,1,2核
--cpuset-cpus=0,1,2

3.2、Docker对内存的限制

同上面CPU的管理,Docker引擎支持通过-m参数来设定容器所使用的内存。

如:

docker run -it xxx -m 256m

-m 256m表示限制容器使用的内存大小为256m。验证方式可以类似上面CPU管理方式,可以直接使用docker stats来查看。这里就不赘述。

3.3、Docker对IO的限制

对I/O的限制,可以使用参数:

# 这里是限制容器写入速度为1MB/s
docker run -it xxx --device-write-bps /dev/sda:1mb

其他参数:

参数名称

说明

--blkio-weight

可以通过--blkio-weight 修改容器 blkio 的权重,权重值为 10~1000

--blkio-weight-device weighted-device

指定某个设备的权重

--device-read-bps throttled-device

按每秒读取块设备的数据量设定上限

--device-read-iops throttled-device

按照每秒读操作的次数设定上限

--device-write-bps throttled-device

按每秒写入块设备的数据量设定上限

--device-write-iops throttled-device

按照每秒写操作的次数设定上限

3.4、查看Docker的资源配置

可以使用:

docker inspect <容器ID或名称>

来查看容器的具体配置情况信息。

 文章来源地址https://www.toymoban.com/news/detail-611662.html

到了这里,关于05. 容器资源管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [云原生] k8s配置资源管理

    1.1 Secret配置的相关说明  Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。 Secret 有三种类型:  ●kubernetes.io/service-account-token:由 Kubernetes 自动创

    2024年03月13日
    浏览(49)
  • 【云原生】k8s配置资源管理

    Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险 Secret 有三种类型:  ● kubernetes.io/service-account-token :由 Kubernetes 自动创建,用来访问 APIServer 的

    2024年02月13日
    浏览(48)
  • 【云原生】k8s声明式资源管理

      kubectl get deployment nginx -o yaml //解释资源配置清单 kubectl explain deployment.metadata 查看deployment资源清单       离线修改 离线修改的过程: (1)首先将配置资源导入通过重定向符号导入到yaml文件中 (2)通过vim编辑器进行yaml配置文件,删除多余的选项,修改配置项,进行保存

    2024年02月12日
    浏览(38)
  • 云原生Kubernetes:K8S配置资源管理

    目录 一、理论 1.Secret 2.Secret创建 3.Secret使用 4.Configmap 5.Configmap创建 6.Configmap使用 二、实验 1.Secret创建 2.Secret使用 3.Configmap创建 4.Configmap使用 三、问题 1.变量引用生成资源报错 2.查看pod日志失败 3.创建configmap报错 4.YAML创建configmap报错 5. 生成资源报错 6.文件挂载pod报错Error 四

    2024年02月07日
    浏览(62)
  • 【云原生】k8s中kubectl陈述式资源管理

    陈述式资源管理方法 --主要依赖命令行工具kubectl进行管理 优点 可以满足90%以上的使用场景 对资源的增、删、查操作比较容易 缺点 命令冗长,复杂,难以记忆 特定场景下,无法实现管理需求 对资源的修改麻烦,需要patch来使用json串更改。 声明式资源管理方法 主要依赖统一

    2024年02月12日
    浏览(58)
  • 云原生(第三篇)-k8s资源管理的两种方式

    1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 2.kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径 3.kubectl 的命令大全 kubectl

    2024年02月13日
    浏览(58)
  • 在CSDN学Golang云原生(Kubernetes声明式资源管理Kustomize)

    在 Kubernetes 中,我们可以通过 YAML 或 JSON 文件来定义和创建各种资源对象,例如 Pod、Service、Deployment 等。下面是一个简单的 YAML 文件示例,用于创建一个 Nginx Pod: 该文件包含了以下信息: apiVersion :指定 Kubernetes API 的版本。 kind :指定资源类型,这里为 Pod。 metadata :定义

    2024年02月15日
    浏览(34)
  • 【基于容器的部署、扩展和管理】3.7 资源调度和优化

    往期回顾: 第一章:【云原生概念和技术】 第二章:【容器化应用程序设计和开发】 第三章:【3.1 容器编排系统和Kubernetes集群的构建】 第三章:【3.2 基于容器的应用程序部署和升级】 第三章:【3.3 自动化扩展和负载均衡】 第三章:【3.4 灰度发布和A/B测试】 第三章:【

    2024年02月08日
    浏览(46)
  • [docker] Docker资源管理

    Docker通过Cgroup 来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。Caroup 是ControlGroups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、内存、磁盘,io等等)的机制,被LXC、docker等很多项

    2024年01月25日
    浏览(34)
  • Docker资源管理

    Docker 通过 Cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面, 基本覆盖了常见的资源配额和使用量控制。 Cgroup 是 ControlGroups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 CPU、内存、磁盘 IO 等等) 的机制,被 LXC、docker 等

    2024年02月20日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包