标签:str overlayfs pac containe nfs ppi lib ons 自动生成
原文链接:http://maoqide.live/post/cloud/docker-%E5%8E%9F%E7%90%86/
docker 的实现,主要依赖 linux 的 namespace、cgroup 和 unionFS 三种技术实现,达到容器的环境隔离、资源控制和镜像打包。
Namespace | 隔离内容 |
---|---|
UTS | 主机名与域名 |
IPC | 信号量、消息队列和共享内存 |
PID | 进程编号 |
Network | 网络设备、网络栈、端口等 |
Mount | 挂载点(文件系统) |
User | 用户和用户组 |
cpu子系统根据进程设置的调度属性,选择对应的CPU资源调度方法。
CFS 用于处理以下几种进程调度策略:
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
RT用于处理以下几种进程调度策略
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
shell cpuacct.usage #所有cpu核的累加使用时间(nanoseconds) cpuacct.usage_percpu #针对多核,输出的是每个CPU的使用时间(nanoseconds) cpuacct.stat #输出系统(system/kernel mode)耗时和用户(user mode)耗时 , 单位为USER_HZ。
读写:写时复制
删除: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>
文件中。文件中从上至下依次记录了容器使用的各镜像层。
device mapper工作在块层次上而不是文件层次上,这意味着它的写时复制策略不需要拷贝整个文件。
在device mapper中,对容器的写操作由需要时分配策略完成。更新已有数据由写时复制策略完成,这些操作都在块的层次上完成,每个块的大小为64KB。
每当容器中的进程需要向容器写入数据时,device mapper就从资源池中分配一些数据块并将其映射到容器。当容器频繁进行小数据的写操作时,这种机制非常影响影响性能。
device mapper的写时复制策略以64KB作为粒度,意味着无论是对32KB的文件还是对1GB大小的文件的修改都仅复制64KB大小的文件。这相对于在文件层面进行的读操作具有很明显的性能优势。但是,如果容器频繁对小于64KB的文件进行改写,device mapper的性能是低于aufs的。
OverlayFS与AUFS相似,也是一种联合文件系统(union filesystem),与AUFS相比,OverlayFS:
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
中进行https://yq.aliyun.com/articles/54483
https://segmentfault.com/a/1190000008323952
https://blog.csdn.net/vchy_zhao/article/details/70238690
标签:str overlayfs pac containe nfs ppi lib ons 自动生成
原文地址:https://www.cnblogs.com/maoqide/p/11259092.html