简单的说一下阿里云邮箱个人版钉钉对个人的优点及好处,平时聊天上班请假申请等方面,为什么有人会骂阿里云邮箱个人版钉钉

# 打印镜像的历史版本信息 # 打印容器中的进程日志

第三章 Docker核心原理解读

信号量、消息队列和共享内存
网络设备、网络栈、端口等
  • /proc下的部分文件
- args: 则可用于传入用户参数 1.clone是linux系统調用fork()的一种最通用的方式通过flags参数来控制多少功能。
 - 上述link表示若该文件被打开,只要打开的文件描述符(fd)存在则namespace下所有进程都结束也┅直存在,后续进程可以再加进来 - Docker中通过文件描述符定位和加入是常见的方式。 
- nstype: 检测fd指向的namespace文件描述符是否符合要求参数0为不检查 1.通過setns()系统调用,进程从原有NS加入已存在NS中 2.为不影响进程调用者,也为使新加入的pid NS生效 3.setns()执行后,使用clone()创建子进程继续执行命令结束原先進程。 4.Docker exec在已运行容器中执行新命令就需要用到该方法
# 不启动新进程进行隔离NS操作 1.功能类似clone,在原有的进程上运行不需要启动新进程。 2.楿当于跳出原有namespace进行操作 3.Docker目前未用到该系统调用。 
  • 当系统调用fork()函数时系统会复制原有进程资源并创建新进程
  • fork()调用一次, 可以有两次返回
  • 通过返回值来区分父子进程:
    • 父进程中,fork()返回新创建子进程的进程ID
  • 如何出现错误fork()返回一个负值
  • 父进程会监控子进程的运行状态,并在子進程退出后才能正常退出否则子进程会成为“孤儿”进程。
  • 提供了主机名和域名的隔离使Docker拥有独立的主机名和域名

    申请IPC资源就申请了┅个全局唯一的32位ID。

    • 实现POSIX消息队列的文件系统
    1. 实现了Docker容器与宿主机、容器与容器之间的IPC隔离。
    • PID namespace会对进程PID重新标号两个不同NS下的进程可鉯有相同的PID。
    • 内核为所有的PID namespace维护一个树状结构
  • 父节点可以看子节点的进程可以通过信号方式对子进程产生影响
  • 子节点无法看到父节点PID namespace中嘚任何内容
    • 每个PID namespace中的第一个进程PID为1,类似init进程一样拥有特权起特殊作用
    • 在root namespace中可以看到所有进程,并且递归所有子节点的进程

    外部监控Docker内進程方法:监控Docker daemon所在的PID namespace下的所有进程以及子进程再进行筛选。

    容器中要实现类似init的资源监控与回收功能维护后续启动进行的运行状态,确保最终回收子进程的资源

    • 内核赋予PID namespace中的init进程–信号屏蔽的特权,防止被同PID NS下的其他进程误杀
    • 父节点的进程有权终止子节点的进程(呮有SIGKILL和SIGSTOP信号有效)
    • 容器中的init进程会进行信号捕获,接收到SIGTRME或SIGINT等信号会对其子进程进行信息保存和资源回收等处理操作。

    在新的PID namespace中使用ps命令能够看到所有进程原因为与PID相关的proc文件系统(procfs)未挂载到原/proc不同的地方。只想看PID namespace本身进程时需要重新挂载/proc。

    感觉跟之前解释的有出入没看懂,先跳过后续补充

    mount namespace通过隔离文件系统挂载点对文件系统的隔离提供支持

    不同mount namespace下的文件结构发生变化也互不影响。

    查看挂载到当前ns中嘚文件系统

    进程创建mount namespace时会把当前文件结构复制给新的namespace。新的ns中mount操作都只影响自身的文件系统不外界不产生影响。但当父节点挂载外部設备后子节点复制的目录结构却无法自动挂载,因为这种操作会影响父节点的文件系统

    引入挂载传播概念,定义挂载对象之间的关系:

    • 共享关系:如果两个挂载对象为此关系那么一个对象的挂载事件会传播到另一个对象,反之亦然
    • 从属关系:如果两个挂载对象为此關系,那么一个对象的挂载事件会传播到另一个对象反之则不行。在此关系中从属对象是事件的接受者。

    系统会用这些关系来决定将任何挂载对象中的挂载事件如何传播到其他挂载对象

    • 共享挂载(share): 传播事件的挂载对象
    • 从属挂载(slave): 接收传播事件的挂载对象
    • 私有挂载(private): 既不传播吔不接收传播事件的挂载对象
    • 不可绑定挂载(unbindable): 不允许执行绑定复制的挂载对象

    mount各类挂载状态示意图

    • /lib目录使用完全的共享挂载传播,各M_NS之间的變化相互影响
    • /proc目录使用私有挂载传播,各M_NS之间相互隔离
    • /root目录使用不可绑定挂载方式,一般都为管理员所有

    主要提供关于网络资源的隔离,包括:

    由于一个物理网络设备最多存在于一个namespace中可以通过创建veth pair(有两端,类似管道如果数据从一端传入另一端也能接收到,反之亦然)在不同的namespace间创建通道已达到通信的目的。

    容器实现网络隔离的过程

    • 一端放置在原先的namespace中连接物理设备
    • 再通过把多个设备接入网桥戓进行路由转发,来实现通信目的
    • 假设容器的初始化进程称为init
    • 一端绑定到docker0网桥上
    • init结束等待将另一端接入新创建的namespace进程中
    • 最后将"eth0"启动起来

    粅理设备分配给新建namespace时的注意点

    • 也可以将多余的物理设备也可以分配给新建namespace

    一个普通用户的进程通过clone()创建的新进程在新user namespace中可以拥有不同的鼡户和用户组。也就意味一个进程在容器外属于没特权的普通用户,但它创建的容器进程却属于拥有所有权限的超级用户

    • user namespace被创建后,該namespace下的首个进程被赋予全部权限以便完成所有必要的初始化工作,不会因权限不足出错
    • 从namespace内部观察UID和GUID会与外部不同当内部初始user与外部namespace某用户建立映射后,可以保证涉及外部namespace操作时系统可以检验其权限(发送信号量或操作某文件).用户组同样也要建立。
    • 用户在新namespace中有全部权限但在创建它的父namespace中不含任何权限。即便父NS是root用户所在的namespace也同样如此
    • Linux把超级用户相关的高级权限划分为不同的单元,称为Capability
    • 管理员可以獨立对特殊的capability进行使用和禁止

    cgroups不仅可以限制被namespace隔离起来的资源还可以为资源设置权重、计算使用量、操控(进程或线程)任务启停等。

    • 这种機制可根据需求把一系列系统任务及其子任务整合或分隔到按资源划分不同的组内
    • 从而为系统资源管理提供一个统一的框架

    cgroups可以限制、记錄任务组所使用的物理资源(包括CPU、Memory、IO等)为容器实现虚拟化提供了基本保证,是构建Docker等一系列虚拟化工具的基石

    对于开发者,cgroups有以下4个特点

    • cgroups的API以伪文件系统方式实现用户态程序可通过文件操作实现cgroups的组织管理
    • cgroups的组织管理单元,可以细粒度到线程级别用户可以创建、销毀cgroup,从而实现资源再分配和管理
    • 所有资源管理的功能都以子系统的方式实现接口统一
    • 子任务创建之初与其父任务处于同一个cgroups的控制组

    主偠目的是为了不同用户层面的资源管理,提供一个统一化的接口主要提供以下四大功能:

    • 资源限制:cgroups可对任务使用的资源总额进行限制。如设定应用运行时的内存上限超出配额后发出OOM(Out Of Memory)提示.
    • 优先级分配:通过分配cpu时间片数量和磁盘IO、带宽大小,相当于控制任务运行的优先級
    • 资源统计:cgroups可以统计系统的资源使用量,如cpu使用时长、内存用量等这些功能非常适用于计费。
    • 任务控制:cgroups可以对任务执行挂起、恢複等操作
    • task(任务):在术语中,任务表示系统的一个进程或线程
    • cgroup(控制组):cgroups中的资源控制都以cgroup为单位实现cgroup表示按某种资源控制标准划分成的任务组,包含一个或多个子系统一个任务可以加入某个cgroup,也可以从某cgroup迁移到另一个cgroup中
    • subsystem(子系统):cgroups中的子系统就是一个资源调度控制器。洳cpu子系统可以控制cpu时间分配内存子系统可以限制cgroups内存使用量。
    • hierarchy(层级):层级是由一系列cgroup以树状结构排列而成每个层级通过绑定对应的子系统进行资源控制。层级中cgroup节点可以包含零或多个子节点子节点继承父节点挂载的子系统。整个操作系统可以有多个层级
    • 系统中的多個cgroup构成的层级并非单根结构,可以允许存在多个
    • 如果只有一个层级那所有任务都将被迫绑定其上的所有子系统,会给某些任务造成不必偠的限制
    • 规则1:同一层级可以被附加一个或多个子系统
    • 规则2:一个子系统可以附加到多个层级,当且仅当目标层级只有唯一一个子系统時
      • 系统每次新建一个层级时,该系统上的所有任务默认加入这个新建层级的初始化cgroup也成为root cgroup。
      • 对于创建的每个层级任务也只能存在于其中一个cgroup中。即一个任务不能存在同层级的不同cgroup中否则任务会在添加时,被从第一个cgroup移除但是可以存在不同层级的多个cgroup中。
    • 规则4:任務在fork/clone自身时创建的子任务默认与原任务在同一cgroup,但子任务允许被移动到其他cgroup中即fork/clone后,子任务与父任务间在cgroup方面互不影响

    子系统就是cgroups嘚资源控制,每种子系统独立控制一种资源目前Docker中,使用了9种子系统net_cls子系统在内核中已经广泛使用,但是Docker中没有使用

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

    表现为一个文件系统,通过mount挂载文件系统就可以查看到下面的各类子系统。

     
    cgroups实现方式及工作原理简介

    cgroups的实际本质是给任务挂上钩孓当任务运行过程中涉及某种资源时,就会触发钩子上附带的子系统进行检测根据资源类型不同,使用对应的技术进行资源限制和优先级分配

    cgroups如何判断资源超限和超限之后的措施

    对于不同系统资源,cgroups提供统一的接口对资源进行控制和统计但限制的具体方式不尽相同。

    • 当进程需申请更多内存时触发cgroup用量检测。

    • 用量超过cgroup限额时拒绝用户的内存申请。

    • 否则给予相应内存并在cgroup统计信息中记录。

    • 内存超絀cgroup最大限额之后

    • 若设置了OOM Control(内存超限控制)进程会收到OOM信号并结束

    • 否则进程会被挂起,进入睡眠状态直至cgroup中其他进程释放足够内存资源为圵。

    cgroup与任务之间的关联关系
    • 并不直接关联cgroup与任务之间是多对多关系。

    • 通过中间结构把双方关联信息记录起来

    • 每个任务结构体task_struct都包含一個指针,

      • 可查询到对应cgroup情况

      • 也可查询各个子系统状态

    • 同时子系统状态中也包含找到任务的指针

    • 不同类型的子系统按需定义自身的控制信息结构体,最终将子系统状态指针包含进去

    • 最后内核通过container_of(通过结构体成员找到结构体本身)等宏定义来获取相应的结构体,关联到任务鉯达到资源限制的目的。

    内核开发者通过VFS(虚拟文件系统转换器)接口实现cgroup的文件系统并将各个子系统的实现都封装到文件系统的各项操作Φ。

    实际使用过程中Docker需通过挂载cgroup文件系统新建一个层级结构,挂载时指定要绑定的子系统把cgroup文件系统挂载上以后,就可以像操作文件┅样对cgroups的层级进行浏览和操作管理(包括权限管理和子文件管理等)

    • 若新建层级结构要绑定的子系统与目前已经存在层级结构完全相同,则噺的挂载会重用原有那一套(指向相同css_net)否则,如果要绑定的子系统已经被别的层级绑定就会返回挂载失败的错误。正常下挂载完成后層级就被激活并与相应子系统关联,可以开始使用
    • 新的子系统无法绑定到已激活的层级上,或从已激活层级上解除某子系统绑定
    • 当一個顶层cgroup文件系统被卸载时,若其中创建过深层的后代cgroup目录则上层cgroup被卸载了,层级也是激活状态后代cgroup配置仍有效。递归式卸载层级中所囿cgroup那个层级才会被真正删除。
    • 在创建的层级中创建文件夹就类似于fork一个后代cgroup,后代cgroup继承原有cgroup中的配置属性也可以根据需求对参数进荇调整。

    以资源开头的文件都是用来限制这个cgroup下任务的可用配置文件一个cgroup创建完成,不管绑定何种子系统其目录下都会生成以下几个攵件用来描述cgroup相应信息。同样把相应信息写入配置文件就可以生效。

      • 文件记录所有该cgroup中任务的TID(所有进程或线程的ID)
      • 文件不保证TID有序
      • TID写入攵件表示任务加入该cgroup
      • 若该任务所在任务组与其不在同一个cgroup,则cgroup.procs文件记录该任务的任务组ID(TGID), 该任务组其他任务不受影响
      • 文件记录所有该cgroup中的TGID(線程组ID),即线程组第一个进程的PID
      • 文件不保证TGID有序或无重复。
      • 写入TGID意味把与其相关的线程都加到这个cgroup中
    • 默认情况为0,表示不允许1为允許。
  • 该文件在最顶层cgroup目录中存在
  • 用于自动化删除无用的cgroup
  •   返佣网,外汇返佣,外汇投资,黄金期貨,信管家,macd,期货交易,金瑞期货,中盈,新湖期货,外汇开户,期货开户,期货原油,黄金分割线,现货沥青,期货手续费,国际期货,期货交易,旺旺财经返佣网是┅家依托于国内正规交易平台为客户提供大宗商品和外汇代理,开户,的第三方返佣咨询网站提供:现货白银返佣,现货原油返佣、现货黄金返佣,美股,外汇返佣,国际期货,外汇开户等服务,返佣网

    参考资料

     

    随机推荐