了解Docker 依赖的linux内核技术

news2024/12/25 10:28:13

深入理解SR-IOV和IO虚拟化 

一文了解Linux上TCP的几个内核参数调优

一文剖析Linux内核中内存管理

分析linux启动内核源码

一文剖析Linux内核中内存管理

  • Namespace
  • Cgroup
  • UnionFS

docker 的实现,主要依赖 linux 的 namespace、cgroup 和 unionFS 三种技术实现,达到容器的环境隔离、资源控制和镜像打包。

Namespace

Namespace隔离内容
UTS主机名与域名
IPC信号量、消息队列和共享内存
PID进程编号
Network网络设备、网络栈、端口等
Mount挂载点(文件系统)
User用户和用户组

Cgroup

  • blkio: 为块设备设定输入输出/限制,比如物理驱动设备(包括磁盘、固态硬盘、USB等)
  • cpu: 使用调度程序控制任务对 CPU 的使用
  • cpuacct: 自动生成 cgroup 中任务对 CPU 资源使用情况的报告
  • cpuset: 为 cgroup 中的任务分配独立的 CPU 和内存
  • devices: 可以开启或关闭 cgroup 中任务对设备的访问
  • freezer: 可以挂起或恢复 cgroup 中的任务
  • memory: 可以设定 cgroup 中任务对内存使用量的限定,并且自动生成这些任务对内存资源使用情况的报告
  • perf_event: 使用后使 cgroup 中的任务可以进行统一的性能测试
  • net_cls: Docker 没有直接使用它,它通过使用等级识别符(classid)标记网络数据包,从而允许 Linux 流量控制程序识别从具体 cgroup 中生成的数据包

子系统文件

公共

  • tasks: 这个文件罗列所有该 cgroup 中任务的 TID,即所有线程或进程的 ID
  • cgroup.procs: 这个文件罗列所有该 cgroup 中的线程组ID(TGID), 及线程组中第一个进程的ID
  • notify_on_release: 0或1,表示是否在 cgroup 中最后一个任务退出时通知运行 release agent, 默认0, 表示不运行
  • release_agent: 指定 release agent 执行脚本的文件路径,这个脚本通常用于自动化卸载无用的 cgroup

cpu

cpu子系统根据进程设置的调度属性,选择对应的CPU资源调度方法。
1. 完全公平调度 Completely Fair Scheduler (CFS)
限上限,cpu.cfs_period_us, cpu.cfs_quota_us
cpu.cfs_period_us = 统计CPU使用时间的周期
cpu.cfs_quota_us = 周期内允许占用的CPU时间(指单核的时间, 多核则需要在设置时累加)

CFS 用于处理以下几种进程调度策略:
- SCHED_OTHER
- SCHED_BATCH
- SCHED_IDLE

cfs_period_us用来配置时间周期长度, cfs_quota_us用来配置当前 cgroup 在设置的周期长度内所能使用的 CPU 时间数,两个文件配合起来设置 CPU 的使用上限。两个文件的单位都是微秒(us),cfs_period_us的取值范围为1毫秒(ms)到1秒(s),cfs_quota_us的取值大于 1ms 即可,如果 cfs_quota_us 的值为 -1(默认值),表示不受 cpu 时间的限制。
例:

#设置只能使用1个cpu的20%的时间
echo 50000 > cpu.cfs_period_us
echo 10000 > cpu.cfs_quota_us
#设置完全使用4个cpu的时间
echo 1000000 > cpu.cfs_period_us
echo 4000000 > cpu.cfs_quota_us
  1. 实时调度 Real-Time scheduler (RT)
    限实时任务上限,cpu.rt_period_us,cpu.rt_runtime_us
    cpu.rt_period_us = 统计CPU使用时间的周期
    cpu.rt_runtime_us = 周期内允许任务使用单个CPU核的时间,如果系统中有多个核,则可以使用核倍数的时间 (计算方法与cfs不一样,需要注意)

RT用于处理以下几种进程调度策略
- SCHED_FIFO
- SCHED_RR

  1. cpu.shares
    shares用来设置CPU的相对值,并且是针对所有的CPU(内核),默认值是1024。
    假如系统中有两个cgroup,分别是A和B,A的shares值是1024,B的shares值是512,那么A将获得1024/(1204+512)=66%的CPU资源,而B将获得33%的CPU资源。 shares有两个特点:
  2. 如果A不忙,没有使用到66%的CPU时间,那么剩余的CPU时间将会被系统分配给B,即B的CPU使用率可以超过33%
  3. 如果添加了一个新的cgroup C,且它的shares值是1024,那么A的限额变成了1024/(1204+512+1024)=40%,B的变成了20%
  4. cpu.stat
    包含了下面三项统计结果:
    nr_periods: 表示过去了多少个cpu.cfs_period_us里面配置的时间周期
    nr_throttled: 在上面的这些周期中,有多少次是受到了限制(即cgroup中的进程在指定的时间周期中用光了它的配额)
    throttled_time: cgroup中的进程被限制使用CPU持续了多长时间(纳秒)

memory

cgroup.event_control       #用于eventfd的接口
 memory.usage_in_bytes      #显示当前已用的内存
 memory.limit_in_bytes      #设置/显示当前限制的内存额度
 memory.failcnt             #显示内存使用量达到限制值的次数
 memory.max_usage_in_bytes  #历史内存最大使用量
 memory.soft_limit_in_bytes #设置/显示当前限制的内存软额度
 memory.stat                #显示当前cgroup的内存使用情况
 memory.use_hierarchy       #设置/显示是否将子cgroup的内存使用情况统计到当前cgroup里面
 memory.force_empty         #触发系统立即尽可能的回收当前cgroup中可以回收的内存
 memory.pressure_level      #设置内存压力的通知事件,配合cgroup.event_control一起使用
 memory.swappiness          #设置和显示当前的swappiness
 memory.move_charge_at_immigrate #设置当进程移动到其他cgroup中时,它所占用的内存是否也随着移动过去
 memory.oom_control         #设置/显示oom controls相关的配置
 memory.numa_stat           #显示numa相关的内存

#### cpuacct

cpuacct.usage      			#所有cpu核的累加使用时间(nanoseconds)  
cpuacct.usage_percpu 	    #针对多核,输出的是每个CPU的使用时间(nanoseconds)  
cpuacct.stat       			#输出系统(system/kernel mode)耗时和用户(user mode)耗时 , 单位为USER_HZ。

Storage Driver

aufs(UnionFS)

  • 容器启动速度很快
  • 存储空间利用很高效
  • 内存的利用很高效

读写:写时复制
删除:whiteout 屏蔽

Docker 镜像的各层的全部内容都存储在/var/lib/docker/aufs/diff/<image-id>文件夹下,每个文件夹下包含了该镜像层的全部文件和目录,文件以各层的 UUID 命名。
正在运行的容器的文件系统被挂载在/var/lib/docker/aufs/mnt/<container-id>文件夹下,这就是 AUFS 的联合挂载点,在这里的文件夹下,你可以看到容器文件系统的所有文件。如果容器没有在运行,它的挂载目录仍然存在,不过是个空文件夹。
容器的元数据各种配置文件被放在/var/lib/docker/containers/<container-id>文件夹下,无论容器是运行还是停止都会有一个文件夹。如果容器正在运行,其对应的文件夹下会有一个 log 文件。
容器的只读层存储在/var/lib/docker/aufs/diff/<container-id>目录下,对容器的所有修改都会保存在这个文件夹下,即便容器停止,这个文件夹也不会删除。也就是说,容器重启后并不会丢失原先的更改。
容器中镜像层的信息存储在/var/lib/docker/aufs/layers/<container-id>文件中。文件中从上至下依次记录了容器使用的各镜像层。

性能表现

  • 在容器密度比较告的场景下,AUFS 是非常好的选择,因为AUFS的容器间共享镜像层的特性使其磁盘利用率很高,容器的启动时间很短
  • AUFS 中容器之间的共享使对系统页缓存的利用率很高
  • AUFS 的写时复制策略会带来很高的性能开销,因为 AUFS 对文件的第一次更改需要将整个文件复制带读写层,当容器层数很多或文件所在目录很深时尤其明显

device mapper

device mapper工作在块层次上而不是文件层次上,这意味着它的写时复制策略不需要拷贝整个文件。
在device mapper中,对容器的写操作由需要时分配策略完成。更新已有数据由写时复制策略完成,这些操作都在块的层次上完成,每个块的大小为64KB。

需要时分配(allocate-on-demand)

每当容器中的进程需要向容器写入数据时,device mapper就从资源池中分配一些数据块并将其映射到容器。当容器频繁进行小数据的写操作时,这种机制非常影响影响性能。

写时复制(copy-on-write)

device mapper的写时复制策略以64KB作为粒度,意味着无论是对32KB的文件还是对1GB大小的文件的修改都仅复制64KB大小的文件。这相对于在文件层面进行的读操作具有很明显的性能优势。但是,如果容器频繁对小于64KB的文件进行改写,device mapper的性能是低于aufs的。

overlayfs(UnionFS)

OverlayFS与AUFS相似,也是一种联合文件系统(union filesystem),与AUFS相比,OverlayFS:
- 设计更简单
- 被加入Linux3.18版本内核
- 可能更快

OverlayFS 将一个 Linux 主机中的两个目录组合起来,一个在上,一个在下,对外提供统一的视图。这两个目录就是层layer,将两个层组合在一起的技术被成为联合挂载union mount。在OverlayFS中,上层的目录被称作upperdir,下层的目录被称作lowerdir,对外提供的统一视图被称作merged

OverlayFS 仅有两层,也就是说镜像中的每一层并不对应 OverlayFS 中的层,而是镜像中的每一层对应/var/lib/docker/overlay中的一个文件夹,文件夹以该层的 UUID 命名。然后使用硬连接将下面层的文件引用到上层。这在一定程度上节省了磁盘空间。这样 OverlayFS中 的lowerdir就对应镜像层的最上层,并且是只读的。在创建镜像时,Docker 会新建一个文件夹作为OverlayFS的upperdir,它是可写的。

读写:第一次修改时,文件不在container layer(upperdir)中,overlay driver 调用copy-up操作将文件从lowerdir读到upperdir中,然后对文件的副本做出修改。
overlay的copy-up操作工作在文件层面, 对文件的修改需要将整个文件拷贝到upperdir中。
copy-up操作仅发生在文件第一次被修改时,此后对文件的读写都直接在upperdir中进行
- overlayfs中仅有两层,这使得文件的查找效率很高(相对于aufs)。
删除:whiteout 覆盖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/66122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学习笔记】Python+request+Unittest接口测试入门

PythonrequestUnittest接口测试入门 接口测试流程 1.需求分析&#xff08;产品经理的需求文档&#xff09; 2.接口文档解析&#xff08;开发编写的接口API文档&#xff09; 3.设计接口测试用例&#xff08;编写Excel表格形式的用例&#xff09; 4.准备接口测试脚本&#xff1…

使用react-grid-layout和react-full-screen实现一个可自定义和全屏展示的dashboard页面

文章目录使用react-grid-layout和react-full-screen实现一个可自定义和全屏展示的dashboard页面具体实现代码展示主展示页面懒加载组件组件加载时展示的组件dashboard菜单组件具体的图表组件Demo演示使用react-grid-layout和react-full-screen实现一个可自定义和全屏展示的dash…

线段树模板(Java)

线段树一、线段树概念二、线段树模板1.建树2. 单点修改3.区间查询4.完整代码及测试一、线段树概念 线段树是一种二叉搜索树&#xff0c;与区间树相似&#xff0c;它将一个区间划分成一些单元区间&#xff0c;每个单元区间对应线段树中的一个叶结点。它的主要优势是对于区间求和…

PacBio HiFi 测序动植物基因组项目真实案例测评

HiFi Reads全称High fidelity reads, 是PacBio公司基于Sequel II平台产出的兼具长读长和高准确度的测序序列&#xff0c;该测序模式&#xff08;CCS测序模式&#xff09;一经问世&#xff0c;备受广大组学科研用户关注——其超长读长完美规避了二代测序short reads的天生不足&a…

【密码加密原则三】

目录 1 密码加密原则&#xff08;续&#xff09; 1.1 盐值的优化 1.2 Mybatis中的占位符 1 密码加密原则&#xff08;续&#xff09; 1.1 盐值的优化 为了进一步保障密码安全&#xff0c;可以考虑使用随机的盐值&#xff0c;但是&#xff0c;需要注意&#xff0c;随机的盐…

Java高效率复习-MySQL下篇[MySQL]

前言 本文章的语言描述会比上篇多一些 数据库的创建修改与删除 标识符命名规则 数据库名、表名不得超过30个字符&#xff0c;变量限制为29个必须只能包含A-Z&#xff0c;a-z&#xff0c;0-9&#xff0c;_等63个字符数据库名、表名、字段名等对象名中间不要包含空格同一个My…

生产环境 Nginx后端服务大量TIME-WAIT的解决

netstat -n | awk /^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]} ss -s netstat -nat |awk {print $6}|sort|uniq -c|sort -rn 统计TIME_WAIT 连接的本地地址 netstat -an | grep TIME_WAIT | awk {print $4} | sort | uniq -c | sort -n -k1 尝试抓取 tcp 包 tcpd…

工业CT之三维重建技术

目前&#xff0c;国内现有的工业CT设备绝大多数是基于线阵探测器的断层扫描技术。 该技术主要是通过观察二维图像去发现单层断面上的损伤部位&#xff0c;至于能准确地确定损伤部位的空间位置、大小、几何形状等&#xff0c;仅通过观察二维切片图像是很难实现的。 这个时候就需…

Flink系列之Flink中Checkpoint容错机制

title: Flink系列 三、Flink Checkpoint 容错机制原理概述 ​ Flink 提供了 Exactly once 特性&#xff0c;是依赖于带有 barrier 的分布式快照 可部分重发的数据源功能实现的。而分布式快照中&#xff0c;就保存了 operator 的状态信息。 ​ Flink 的失败恢复依赖于 检查点…

Zabbix技术分享——如何使用zabbix监控华为云RDS

在数字化大背景下&#xff0c;数据是重要的生产资料&#xff0c;这些数据存放在哪里&#xff0c;如何保障数据安全是所有企业都要考虑的事情。华为云RDS凭借安全可靠&#xff0c;可根据业务规模动态扩容的特性&#xff0c;受到越来越多中小企业的青睐&#xff0c;对华为云RDS监…

NR PUSCH power control(一)

这篇看下NR PUSCH power control的相关内容&#xff0c;主要内容集中在38.213 7.1章节&#xff0c;功率计算无非就是一个长公式&#xff0c;根据RRC配置的参数及后续DCI field 的内容作出功率的调整&#xff1b;最初这部分看的就云里雾里的&#xff0c;最近再看&#xff0c;相比…

upload-labs通关

upload-labs通关 shell &#x1f349; 目录upload-labs通关PASS-01、PASS-02PASS-03PASS-04PASS-05PASS-06PASS-07PASS-08PASS-09PASS-10PASS-11PASS-12PASS-13PASS-14PASS-15PASS-16PASS-17PASS-18PASS-19PASS-20PASS-21shell能上传并能解析就算成功 PASS-01、PASS-02 图片…

最近要考pmp,哪个培训机构比较好?

你说的几个都是我着重了解过的&#xff0c;作为过来人&#xff0c;把我做的各大机构的优缺点给你参考吧~ PMP 机构排名的话&#xff0c;没有官方数据&#xff0c;网上数据仅供参考。这篇机构对比的文章&#xff0c;主流机构都有&#xff0c;你可以看看 下面说下我收集的每个机…

【数据库数据恢复】无法启动MongoDB服务的数据恢复案例

关于MongoDB数据库&#xff1a; MongoDB数据库存储方式是将文档存储在集合之中&#xff0c;而不是像Oracle、MySQL一样的关系型数据库。 MongoDB数据库是开源数据库&#xff0c;也提供具有附加功能的商业版本。 MongoDB中的数据是以键值对(key-value pairs)的形式显示的&…

[附源码]Python计算机毕业设计Django校友社交系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

“云办公”如何用任务协同工具搞定项目和团队管理?

导语&#xff1a;远程参加会议、团队协同作业、项目负责人进行任务分配、团队成员多人协同编辑文件及同时推进项目、人力部门在线进行审批报销……&#xff0c;随着“云办公”的加速普及&#xff0c;人们只需一台电脑、一部手机、一根网线&#xff0c;就能随时进入办公状态&…

云服务器及域名到期后,公安联网注销指南

云服务器及域名到期后&#xff0c;公安联网注销指南 公安联网备案及注销的操作流程都写在了官方文档中&#xff0c;可以进入全国互联网安全管理服务平台&#xff0c;在下载中心找到并下载 《互联网站安全服务平台操作指南》&#xff0c;按照操作指南进行备案及撤销。 以下图…

JS实现关闭图片窗口

JS实现关闭图片窗口 有趣的小案例池子&#xff1a; JS实现定时器 JS实现关闭图片窗口 JS实现输入检验 获取焦点后隐藏提示内容的输入框 JS实现获取鼠标在画布中的位置 聊天信息框显示消息 JS点击切换背景图 自动切换背景的登录页面 JS制作跟随鼠标移动的图片 JS实现记住用…

K8S Pod控制器详细讲解

文章目录一、Pod控制器介绍二、ReplicaSet(RS)三、Deployment(Deploy)1.镜像更新&#xff1a;2.版本回退3.金丝雀发布/灰度发布四、Horizontal Pod Autoscaler(HPA)五、DaemonSet(DS)六、Job七、CronJob(CJ)结尾一、Pod控制器介绍 Pod是kubernetes的最小管理单元&#xff0c;在…

ArcGIS矢量化并进行拓扑检查

土地利用数据每年都在发生变化&#xff0c;故每年都要根据去年的数据进行修改。请根据以下要求&#xff0c;修改A区域的数据并对B区域已做好的数据进行拓扑检查。 01 数据说明 1. 地类图斑A.shp&#xff1a;A区域需要编辑修改的图斑数据。 2. 影像.tif&#xff1a;编辑A区域…