
本发明涉及计算机内存分配领域,更具体地,涉及一种面向容器场景的内存卸载方法、系统及设备。
背景技术:
1、在算力需求急剧增长的背景下,云计算逐渐成为了算力供应的主流方式。容器技术则是云计算领域的重要基石,它以轻量级、高可移植性和高度隔离的特性,成为了现代云计算程序开发和部署的核心组件。如今流行的微服务架构与函数式计算方式更是完全以容器技术作为基础的云计算资源使用和供应方式。在微服务架构和函数式计算领域中,资源有限是容器服务部署的重大约束。高效利用资源意味着能够在有限的云计算资源下部署更多云服务,产生更多经济效益,或者在提供相同服务能力的情况下降低能耗,提供更多环境效益。即便资源利用率只提高了千分之一,在庞大的云计算资源数量倍乘下都能产生巨大的经济效益与环境效益。在云计算环境中常常部署着相当可观数量的空闲容器实例,这类容器在当前时刻并不被使用,但却占据着大量云计算资源。因此,如何在保证服务质量的前提下高效利用空闲容器所占用的资源就成了亟待讨论的问题。
2、考虑到空闲容器占据的云计算资源主要为内存资源,面向容器空闲场景的云计算资源节约问题则可以很大一部分转化为面向容器空闲场景的内存压缩问题,其主要目标为在保证服务质量的前提下高效利用空闲容器所占用的内存。目前,对于空闲容器的处理方式主要有不做额外处理、删除回收、替换为合子容器三种方式,但这三种方式依旧存在以下不足:
3、第一,不对空闲容器实例做额外处理的方式虽然保障了服务能力,但也意味着放弃了对其所占用的内存进行高效利用的可能。大量的空闲容器实例会导致机器的内存占用率高而cpu使用率低,浪费了大量云计算资源,显著降低了机器所能产生的经济效益,违背了资源高效利用的理念。
4、第二,空闲容器实例的删除回收操作会显著降低容器服务的服务能力,超出服务能力的请求数会导致容器实例重新创建,并使得部分服务承受容器实例创建所带来的时间开销,这极易导致服务时间违反服务品质保障协议(service-level agreement,sla)。并且频繁重复创建删除容器实例过程中的镜像拉取、实例容器创建、实例应用初始化等过程也将带来额外的带宽、cpu等开销。
5、第三,近年的研究(li z,guo l,chen q,et al.help rather than recycle:alleviating coldstartup in serverless computing through inter-functioncontainer sharing[c]//2022usenixannual technical conference(usenix atc 22).2022:69-84.)还提出可以使用合子容器替代空闲容器的理念,即先将多个空闲容器实例所需的运行环境打包到一个合子容器镜像中,提前创建该合子容器镜像,在请求到达时只需将对应的实例应用导入到合子容器中即可运行,降低了容器实例冷启动时间。但该方法需要耗费大量cpu用于合子容器镜像的组合以及打包,并且合子容器镜像同样占用了不少内存,对内存资源的利用效率有待提升。
技术实现思路
1、本发明旨在克服上述现有技术的至少一种缺陷,提供一种面向容器场景的内存卸载方法,能够在保证服务质量的前提下高效利用空闲容器所占用的内存。
2、本发明采取的技术方案为:
3、本发明提供一种面向容器场景的内存卸载方法,应用于基于linux操作系统和kubernetes容器编排平台的机器集群,所述方法包括:
4、开启所述机器集群的交换内存功能;具体的,通过修改linux的配置和kubernetes的kubelet组件的配置实现;
5、在所述机器集群的控制节点中装载策略代理组件,在计算节点中装载交换代理组件和交换指标组件;
6、通过所述机器集群的容器实例数量预测算法,获得当前所述容器服务需要的容器实例的数量;
7、根据当前所述容器服务需要的容器实例的数量,按照预先配置在所述策略代理组件中的选择策略选择所述容器实例的操作,并调整所述容器实例的标签;
8、通过所述交换代理组件监听所述容器实例的标签的变化,获取发生预设变化的所述容器实例并通过所述交换指标组件对所述容器实例进行处理;
9、当所述交换指标组件完成所述容器实例的处理,通过所述交换代理组件将所述容器实例的对应标签恢复为调整前的状态。
10、通过在所述机器集群的控制节点装载策略代理组件,在计算节点中装载交换代理组件和交换指标组件,三个自定义的组件能够基于当前容器服务所需要的容器实例的数量来主动的获取需要调整的所述容器实例,并生成调整参数来对所述容器实例的占用内存进行调整,极大的扩展了所述kubernetes容器编排平台对交换内存的使用能力,使所述kubernetes容器编排平台由被动应用内存交换来避免内存超限变成了能够主动利用交换内存机制节约内存并提高性能;同时,为所述容器实例引入了标签来表示所述容器实例的状态,所述标签能够作为所述容器实例的信息进行传递,能够方便组件通过容器实例的标签来主动获取容器的状态并对应的进行调整。
11、进一步的,所述标签包括状态标签、交换指示标签和存储占用标签;
12、所述状态标签对应表示所述容器实例当前的运行状态;
13、所述交换指示标签包括第一标签值和第二标签值,所述交换指示标签设置为所述第一标签值表示所述容器实例当前具有未被执行的内存调整请求,设置为所述第二标签值表示所述容器实例当前不具有未被执行的内存调整请求;
14、所述存储占用标签表示所述容器实例需要占用的内存大小。
15、进一步的,所述容器实例的运行状态包括创建态、运行态、睡眠态和终止态;
16、所述创建态为所述容器实例被创建后至被用于提供容器服务之前的状态;
17、所述运行态为所述容器实例等待或正在响应所述容器服务请求的状态;
18、所述睡眠态为所述容器实例被挂起后的状态;
19、所述终止态为所述容器实例被删除后的状态。
20、所述创建态是指容器被创建后、可用于提供服务前的一种状态,所述容器实例创建后进入初始化过程,初始化完毕后容器实例将进入所述运行态,可正常响应各种请求;在所述容器服务的服务能力大于请求负载时,对应的所述容器实例会被检测算法标记为需挂起,系统将通过挂起动作将所述容器实例由所述运行态转化为所述睡眠态,此时所述容器实例的绝大部分内存被交换到硬盘中,进入所述睡眠态。进入所述睡眠态后该所述容器实例不会再收到任何请求,也无法响应任何请求,在服务能力上可视为已被删除。在所述容器服务的服务能力小于请求负载时,对应的所述容器实例会被检测算法标记为需激活,系统将通过激活操作将所述容器实例由所述睡眠态转变为所述运行态,此时所述容器实例的内存可以部分或全部交换到硬盘中,进入所述运行态。进入所述运行态后的容器实例可以正常响应各种请求,在服务能力上等同于创建了一个新的容器实例。
21、进一步的,所述按照预先配置在所述策略代理组件中的选择策略选择对所述容器实例的操作,根据选择的操作生成所述容器实例的调整参数,根据所述调整参数调整所述容器实例的标签,具体包括:
22、按照预先配置在所述策略代理组件中的选择策略决定创建/删除或装载/卸载所述容器实例;
23、若选择创建/删除所述容器实例,则按照所述机器集群中的创建/删除逻辑对所述容器实例进行操作;
24、若选择装载/卸载所述容器实例,则生成需要调整的所述容器实例的名称、调整后的所述运行状态以及调整后的需要占用的内存大小;
25、通过所述策略代理组件根据所述需要调整的所述容器实例的名称获取对应的所述容器实例,将所述容器实例的所述状态标签设置为调整后的所述运行状态,将所述存储占用标签设置为调整后的需要占用的内存大小,并将所述交换指示标签设置为第一标签值。
26、通过所述策略代理组件来选择所述容器实例的操作,当选择创建/删除所述容器实例时,可以依托所述机器集群上的kubenetes容器编排平台本身的选择策略来选择所述容器实例,与kubernetes本身的系统并不冲突;在此基础上,本发明加入了对所述容器实例的装载/卸载的操作,所述装载/卸载操作比创建/删除操作更加轻量级,能够有效的利用所述容器实例的资源,通过合理的使用所述装载/卸载操作可以降低频繁创建/删除容器带来的资源消耗与冷启动开销。
27、进一步的,所述获取需要调整的所述容器实例,具体包括:
28、基于所述机器集群的选择策略,选择所述状态标签对应表示所述运行态且所述交换指示标签设置为第二标签值的所述容器实例。
29、通过所述状态标签和交换指示标签的两层选择机制,确保了所述容器实例处于正常的工作状态;当所述容器实例处于所述创建态、睡眠态、终止态或者需要执行内存交换操作时,该所述容器实例会从所述kubernetes容器编排平台的service的列表中被剔除,对该所述容器服务的请求将被分派到处于所述运行态的所述容器实例执行。若当前无可用的处于所述运行态容器实例,则会优先激活一个所述睡眠态的所述容器实例来响应该请求,激活所述容器实例的开销远小于创建并初始化一个新的所述容器实例。若无处于所述运行态与所述睡眠态的容器实例可用,则只能重新创建并初始化一个新的所述容器实例。
30、进一步的,所述通过所述交换代理组件监听所述容器实例的所述标签的变化,获取发生预设变化的所述容器实例,并通过所述交换指标组件根据变化后的所述标签对所述容器实例的占用内存进行调整,具体包括:
31、通过每个所述计算节点上的所述交换代理组件监听对应所述容器实例的标签变化;
32、当监听到所述容器实例的所述交换指示标签值由所述第二标签值变化为第一标签值后,通过所述交换代理组件获取所述容器实例的pid,并将所述pid和所述存储占用标签发送给所述交换指标组件;
33、所述交换指标组件根据所述pid获取所述计算节点上对应的所述容器实例的数据结构,并根据所述容器实例的所述存储占用标签设置所述数据结构中的占用内存字段。
34、由所述交换代理组件监听容器实例的标签变化,当监听到对应变化后,通过所述交换代理组件来调整所述数据结构中的占用内存字段,实现主动的实现所述容器实例的交换内存操作。
35、进一步的,当所述数据结构中的占用内存字段设置完成后,若需要主动将所述容器实例的内存占用页装载到内存中,则通过所述交换代理组件主动依次访问所述容器实例的内存占用页。通过所述交换代理组件主动访问所述容器实例的内存占用页,达到提前换入部分或全部内存占用页的效果。
36、进一步的,所述通过所述交换代理组件将所述容器实例的对应标签恢复为调整前的状态,具体包括:
37、通过所述交换代理组件将所述容器实例的所述交换指示标签设置为第二标签。
38、将所述交换指示标签设置为第二标签,保证所述容器实例的后续操作的正常运行。
39、本发明还提供一种面向容器场景的内存卸载系统,应用于基于linux操作系统和kubernetes容器编排平台的机器集群,所述系统包括:
40、组件装载模块,用于在所述机器集群的控制节点中装载策略代理组件,在计算节点中装载交换代理组件和交换指标组件;
41、数量预测模块,用于通过所述机器集群的容器实例数量预测算法,获得当前所述容器服务需要的容器实例的数量;
42、容器调整模块,用于根据当前所述容器服务需要的容器实例的数量,按照预先配置在所述策略代理组件中的选择策略选择所述容器实例的操作,并调整所述容器实例的标签;
43、监听处理模块,用于通过所述交换代理组件监听所述容器实例的标签的变化,获取发生预设变化的所述容器实例并通过所述交换指标组件对所述容器实例进行处理;
44、所述容器调整模块还用于当所述交换指标组件完成所述容器实例的处理,通过所述交换代理组件将所述容器实例的对应标签恢复为调整前的状态。
45、本发明还提供一种计算机设备,包括存储器和处理器,其特征在于,所述存储器中存储有计算机可读指令,所述处理器执行所述计算机可读指令,实现上述所述的一种面向容器场景的内存卸载方法。
46、与现有技术相比,本发明的有益效果为:
47、1.本发明通过在所述机器集群的对应节点中设置三个自定义的组件:策略代理组件、交换代理组件和交换指标组件,三个自定义的组件能够基于当前容器服务所需要的容器实例的数量来主动的获取需要调整的所述容器实例,并生成调整参数来对所述容器实例的占用内存进行调整,极大的扩展了所述kubernetes容器编排平台对交换内存的使用能力,使所述kubernetes容器编排平台由被动应用内存交换来避免内存超限变成了能够主动利用交换内存机制节约内存并提高性能;
48、2.本发明为所述容器实例添加了标签,所述标签包括状态标签、交换指示标签和存储占用标签,能够分别通过所述状态标签、交换指示标签和存储占用标签来在自定义组件之间传递信息,表示所述容器实例的状态,方便设置的所述自定义组件根据所述标签来实现交换内存操作。