当前位置: 首页 > Linux

大白话Linux容器资源隔离与限制原理

时间:2023-04-06 02:15:07 Linux

作者:烤鸡太子大师来源:恒生LIGHT云社区背景最近在群里给新人讲解一些docker容器化。大家可以理解docker容器其实就是一个运行的进程,但是因为docker帮我们封装了这个进程,给这个进程添加了一个可以运行的micro-linux环境,让我们感觉“像”一个虚拟机。那么他是如何实现资源控制的呢?大家都知道用到namespace和cgroup。我也很好奇,所以我花了一点时间研究和做笔记。我可以和你一起了解Linux命名空间。Linux命名空间是一种内核级的资源隔离机制,用于使运行在同一操作系统上的资源进程互不干扰。命名空间的目的是隔离,要达到的效果是:如果有进程运行在某个命名空间中,则只能看到命名空间的信息,看不到命名空间之外的东西。我们想一想:一个进程在运行的时候,它知道什么信息?查看系统的主机名(网桥、接口、网口...)可用的网络资源、进程关系(存在哪些进程、进程之间的父子关系等)、系统用户信息(有哪些用户、组、是什么它们的权限)文件系统(可用的文件系统有哪些,用途)IPC(如何实现进程间通信)...也就是说,如果要实现隔离,必须保证不同命名空间的进程看到上面这些东西是不一样的。如果让我来做,第一个想法是每个命名空间实现对上述资源的一套完整的隔离,但实际上在Linux的实现中,可以将上述所有资源单独隔离。目前linux内核主要实现了几种不同的资源命名空间。官网有如下介绍:namemacrodefinitionmacrodefinitionIPCCLONE_NEWIPCSystemVIPC,POSIXmessagequeues(sinceLinux2.6.19)NetworkCLONE_NEWNET网络设备接口,IPv4和IPv6协议栈,IP路由表,防火墙规则,/proc/net和/sys/class/net目录树、套接字等(自Linux2.6.24起)MountCLONE_NEWNS挂载点(自Linux2.4.19起)PIDCLONE_NEWPID进程ID(自Linux2.6.24起)UserCLONE_NEWUSER用户和组ID(自Linux2.6.23起并完成inLinux3.8)UTSCLONE_NEWUSERHostnameandNISdomainname(sinceLinux2.6.19)CgroupCLONE_NEWCGROUPCgrouprootdirectory(sinceLinux4.6)这些命名空间基本覆盖了一个程序运行所需要的环境,保证运行在一个隔离的命名空间中,程序不会受到干扰由接收命名空间的其他程序。但并不是所有的系统资源都可以隔离,时间是个例外,没有对应的namespace,所以同一个linux启动的容器时间是一样的。但是Namespace解决的问题主要是环境隔离的问题,这只是虚拟化中最基本的一步。我们还需要解决计算机资源使用的隔离。也就是说,虽然你通过Namespace把我加入了一个特定的环境,但是我的进程使用的CPU、内存、磁盘等计算资源其实可以是我想要的任何东西。因此,我们希望限制或控制进程的资源利用率。这就是LinuxCGroup出现的原因。LinuxcgroupLinuxCGroup全称LinuxControlGroup,是Linux内核的一项功能,用于限制、控制和隔离一个进程组的资源(如CPU、内存、磁盘输入输出等)。LinuxCGroupCgroup允许您将资源(例如CPU时间、系统内存、网络带宽或这些资源的组合)分配给系统上运行的用户定义的任务(进程)组。您可以监控已配置的cgroup,拒绝cgroup访问某些资源,甚至可以在运行的系统中动态配置您的cgroup。主要提供以下功能:资源限制:限制资源使用,如内存使用上限、文件系统缓存限制等。Prioritization:优先级控制,如:CPU利用率和磁盘IO吞吐量。Accounting:一些审计或者一些统计,主要目的是为了记账。控制:暂停进程,恢复执行进程。使用cgroups,系统管理员可以更精细地控制系统资源的分配、优先级、拒绝、管理和监控。可以根据任务和用户更好地分配硬件资源,提高整体效率。cgroups的作用:资源限制cgroups可以限制任务使用的资源总量(内存、CPU、磁盘等)。比如你设置了应用运行时使用内存的上限,一旦超过配额,就会出现OOM提示。优先级分配通过分配的CPU时间片的数量和磁盘IO带宽的大小,实际上相当于控制了任务运行的优先级。资源统计cgroups可以统计系统资源使用情况,比如CPU使用时间,内存使用等。这个功能很适合计费任务控制cgroups可以挂起和恢复任务。总结Docker容器的本质是宿主机上的一个进程。Docker通过命名空间实现资源隔离,通过cgroups实现资源限制。命名空间技术实际上修改了应用进程看到的整个计算机的“视图”,即它的“视图”受限于操作系统,只能“看到”听写指定的内容,以及资源的多少进程能不能使用是由Cgroup配置限制决定的,但对于宿主机来说,这些隔离和受限的进程与其他进程没有太大区别。另外,namespace和cgroup虽然做的不错,但是还是有很多不完善的地方,比如不能隔离时间,比如/proc文件系统的问题。以后有时间我可以和你讨论这些,本章不作具体介绍。