容器资源限制

简介: 容器资源限制

资源限制

在我们使用docker跑容器的时候,但从理论上来说,只要不对容器做限制,那么他是有可能把你的物理机的计算资源给占满的,为了避免这种情况发生,所以我们可以对容器做一定的限制

内存限制

我们先通过命令查看容器占用的资源

[root@docker ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:          3.8Gi       724Mi       859Mi        59Mi       2.3Gi       2.8Gi
Swap:         3.9Gi        10Mi       3.9Gi
[root@docker ~]# docker stats
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O         BLOCK I/O    PIDS
9a7eace0b2a4   nginx     0.00%     6.609MiB / 3.798GiB   0.17%     162MB / 163MB   1.7MB / 0B   3

在这里我们可以看见 cpu占用率目前是0 内存使用了6.6M,没有对内存做限制,我们物理机的内存也就是3.8G,也就是说,只要这个容器里面跑的任务足够吃内存,那么他是会将我们物理机的内存给用光的

所以我们现在来看看如何限制容器的资源

我现在启动一个centos的容器,限制他的内存最多可以使用500M

如果不知道使用什么参数可以使用 docker help run 去查看帮助

[root@docker ~]# docker run -itd --name os1 -m 500m centos:7
[root@docker ~]# docker stats os1
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
af387346eb9c   os1       0.00%     1.395MiB / 500MiB   0.28%     946B / 0B   0B / 0B     1

现在我们可以看见他的内存的LIMIT变成了500m,那么如果容器的内存用超了会发生什么呢?

是会直接被停止还是不让这个容器运行其他的任务了呢,我们可以来看看

# 我们将内存限制到6M,然后我们在容器内运行一些任务来看看
[root@docker ~]# docker run -itd --name os2 -m 6m centos:7
63187fd92ff985c7ca0f531b69a4d86bb29efecb260aeba7e058846ee65a6878
[root@docker ~]# docker stats os2
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
63187fd92ff9   os2       0.00%     1.398MiB / 6MiB     23.31%    656B / 0B   0B / 0B     1
# 我们现在可以看见,他的内存被限制到了6m,那么我们进入容器执行一些命令
# 我们使用dd命令,dd命令不指定direct的话他是会先将内容读到内存然后再下盘的
# 这条命令的意思是写一个5M的文件,写到/tmp/test1 然后这5M是会先读到内存里的
[root@63187fd92ff9 /]# dd if=/dev/zero of=/tmp/test1 bs=5M count=1 
1+0 records in
1+0 records out
5242880 bytes (5.2 MB) copied, 0.136385 s, 38.4 MB/s
# 我们可以发现,他是可以成功的
# 我们再来写1个10M的文件
[root@63187fd92ff9 /]# dd if=/dev/zero of=/tmp/test2 bs=10M count=1 
Killed
[root@63187fd92ff9 /]# yum install vim
Killed

我们可以发现,当他内存不够的时候,他是会直接kill掉这个任务的,并不会执行,这个容器也没有被docekr停止掉

所以结论就是当容器的内存不够的时候,那么这个容器暂时是起不了新的任务的

cpu限制

# 我们首先来使用lscpu看看cpu的信息
[root@docker ~]# lscpu 
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              2
On-line CPU(s) list: 0,1
# 我们可以看见CPU(s)这里写的是2,那么说明我们的物理机是有2个cpu核心的
# 下一行的在线cpu编号是0和1
# 我们首先限制这个容器的所有任务都必须跑在cpu0上,这样可以避免频繁的cpu上下文切换
[root@docker ~]# docker run -itd --name os4 --cpuset-cpus 0 centos:7
8474df87ae10bb638712a3913cea2733ae2556f3bf3253ba47f888b7811bee52
# 我们现在进入这个容器,执行命令,然后再退出来查看
[root@docker ~]# docker exec -it os4 /bin/bash
# 这条命令并不会发生什么,但是会一直持续跑
[root@8474df87ae10 /]# cat /dev/zero > /dev/null &
[1] 28
[root@8474df87ae10 /]# cat /dev/zero > /dev/null &
[2] 29
[root@8474df87ae10 /]# cat /dev/zero > /dev/null &
[3] 30
[root@8474df87ae10 /]# cat /dev/zero > /dev/null &
[4] 31
[root@8474df87ae10 /]# jobs
[1]   Running                 cat /dev/zero > /dev/null &
[2]   Running                 cat /dev/zero > /dev/null &
[3]-  Running                 cat /dev/zero > /dev/null &
[4]+  Running                 cat /dev/zero > /dev/null &
# 我们现在使用快捷键 Ctrl+p+q退出容器,在物理机上查看这个任务是否跑在了0号cpu上
[root@docker ~]# ps mo pid,comm,psr `pgrep cat`
    PID COMMAND         PSR
 151675 cat               -
      - -                 0
 151693 cat               -
      - -                 0
 151777 cat               -
      - -                 0
 151778 cat               -
      - -                 0
# 这里显示的psr就是这个任务跑在哪个cpu上,这里全都是0,所以这个限制是生效的

本文来自博客园,作者:FuShudi,转载请注明原文链接:https://www.cnblogs.com/fsdstudy/p/17949513

分类: CKA

目录
相关文章
|
6月前
|
Serverless API 容器
函数计算容器模式如何设置多久释放资源啊?
函数计算容器模式如何设置多久释放资源啊?
407 0
|
Cloud Native Linux 虚拟化
【云原生】Docker容器资源限制(CPU/内存/磁盘)
【云原生】Docker容器资源限制(CPU/内存/磁盘)
2049 0
|
3月前
|
存储 消息中间件 容器
当一个 Pod 中包含多个容器时,容器间共享一些重要的资源和环境,这使得它们能够更有效地协同工作和交互。
当一个 Pod 中包含多个容器时,容器间共享一些重要的资源和环境,这使得它们能够更有效地协同工作和交互。
|
3月前
|
存储 资源调度 运维
【容器化运维的艺术】揭秘镜像仓库与资源调度的完美协同!
【8月更文挑战第25天】随着容器技术的发展,企业日益倾向于采用容器化方式部署应用,以提升部署效率及资源管理灵活性。其中,镜像仓库和资源调度成为核心组件。镜像仓库实现容器镜像的集中存储与管理,确保版本一致性和安全性;资源调度则依据实际需求优化容器运行位置与资源配置,提高资源利用率和应用性能。二者协同作用,显著简化应用部署流程,为企业创造更大价值。
72 3
|
3月前
|
存储 Kubernetes 数据中心
在K8S中,同⼀个Pod内不同容器哪些资源是共用的,哪些资源是隔离的?
在K8S中,同⼀个Pod内不同容器哪些资源是共用的,哪些资源是隔离的?
|
3月前
|
缓存 Kubernetes 数据中心
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
|
3月前
|
弹性计算 Kubernetes 开发者
利用容器化服务实现游戏服务器的动态资源配置
【8月更文第12天】在游戏行业中,用户基数的变化往往呈现出明显的波动性,特别是在推广活动期间,用户基数会显著增加,而在非推广期则会有所下降。为了应对这种变化,游戏开发者需要一种能够根据用户基数动态调整服务器资源的解决方案,以确保用户体验的同时最大限度地节省成本。容器化服务因其灵活的资源管理和成本控制能力,成为了理想的解决方案。
61 2
|
3月前
|
存储 缓存 监控
在Linux中,如何优化虚拟机和容器的性能和资源使用?
在Linux中,如何优化虚拟机和容器的性能和资源使用?
|
6月前
|
存储 安全 数据中心
【Docker 专栏】Docker 容器与宿主机的资源隔离机制
【5月更文挑战第8天】Docker容器利用Namespace和Cgroups实现资源隔离,保证CPU、内存、网络和存储的独立,提升资源利用率和系统安全性。资源隔离有助于简化应用部署与管理,但也带来资源竞争、监控管理及安全挑战。理解并善用资源隔离机制能实现更高效、安全的容器运行。随着技术进步,Docker容器资源隔离将持续优化。
535 2
【Docker 专栏】Docker 容器与宿主机的资源隔离机制
|
5月前
|
Kubernetes 安全 测试技术
超大规模商用 K8s 场景下,阿里巴巴如何动态解决容器资源的按需分配问题?
超大规模商用 K8s 场景下,阿里巴巴如何动态解决容器资源的按需分配问题?