获取docker容器资源信息的方法与流程

文档序号:23818164发布日期:2021-02-03 14:12阅读:162来源:国知局
[0001]本发明涉及计算机
技术领域
:,特别是一种获取docker容器资源信息的方法。
背景技术
::[0002]docker是目前主流的虚拟化容器技术,通过将程序放入docker容器内运行,可以非常快捷的分发部署等。但是当docker容器内运行的程序需要获取容器的内存等资源信息时,是无法获得正确的资源信息。因为docker容器内的程序获取容器资源信息的本质是从容器内的procfs文件系统读取资源信息,但是docker容器的隔离是不彻底的隔离,容器的procfs文件系统与宿主机的procfs文件系统实际上为同一个文件系统,所以程序会获取到宿主机的资源信息而不是容器的资源信息。技术实现要素:[0003]为解决现有技术中存在的问题,本发明的目的是提供一种获取docker容器资源信息的方法;本发明通过修改资源信息的请求逻辑和重新实现docker容器的procfs文件系统中的/proc/meminfo文件,从而使得容器内的程序能够获取正确资源信息的目的。[0004]为实现上述目的,本发明采用的技术方案是:一种获取docker容器资源信息的方法,包括:[0005]修改系统调用表sys_call_table中sys_read函数,将所述sys_read函数替换为docker_read函数,所述docker_read函数的逻辑流程具体包括以下步骤:[0006](1)判断发起的请求是否是一个资源获取的请求,具体根据请求的路径是否是/proc/meminfo来判定发起的请求是否是资源获取请求,如果是,则继续步骤(2);如果不是,则调用所述sys_read函数;[0007](2)通过查看task_struct中的css_set指针是否指向cgroup来判断发起资源请求的进程是否是否存在cgroups资源限制,如果有,则cgroups在内核中提供的资源信息获取接口task_struct,得到发起资源请求的进程所在控制组的资源信息结构体mem_cgroup;如果没有,则去调用所述sys_read函数;[0008]将所述资源信息结构体mem_cgroup返回给callback函数,并让callback函数重新调用注册函数进行注册,在callback函数注册完成后,重新生成/proc/meminfo文件,此时,docker容器内的程序可获得容器正确的资源信息。[0009]作为本发明的进一步改进,修改系统调用表sys_call_table中sys_read函数,将所述sys_read函数替换为docker_read函数具体包括:[0010]从/boot/system.map中读取系统调用表sys_call_table的内存地址,找到内存地址后,即可将系统调用表sys_call_table中的sys_read替换为所述docker_read函数。[0011]本发明的有益效果是:[0012]本发明通过修改资源信息的请求逻辑和重新实现docker容器的procfs文件系统中的/proc/meminfo文件,从而使得容器内的程序能够获取正确资源信息的目的。附图说明[0013]图1为本发明实施例中docker_read函数的逻辑流程框图。具体实施方式[0014]下面结合附图对本发明的实施例进行详细说明。[0015]实施例1[0016]一种获取docker容器资源信息的方法,包括以下步骤:[0017]步骤一、首先,无论上层应用是通过系统命令还是函数接口的方式来获取资源信息,其最终都会通过glibc库最终到达内核,调用内核中的sys_read函数来获取资源数据。所以为了修改系统的调用逻辑,那么就需要修改系统调用表sys_call_table中sys_read函数,替换为本实施例的docker_read函数。修改系统调用表sys_call_table的方法为从/boot/system.map中读取系统调用表sys_call_table的内存地址,找到内存地址后,便可以将系统调用表sys_call_table中的sys_read替换为本实施例所设计的docker_read函数,docker_read函数逻辑如下,流程如图1所示:[0018](1)判断发起的请求是否是一个资源获取的请求,用户可能只是访问一个普通的文件或者一个设备而已,因此需要根据请求的路径是否是/proc/meminfo来判定是否是资源获取请求,如果是,则继续步骤(2);如果不是,那么去调用原有的sys_read函数。[0019](2)通过查看task_struct中的css_set指针是否指向cgroup来判断发起资源请求的进程是否使用了cgroups限制其资源,如果有,则cgroups在内核中提供的资源信息获取接口task_struct,得到发起资源请求的进程所在控制组的资源信息结构体mem_cgroup,该结构体中包含了该进程所在控制组中的资源信息;如果没有,则去调用原有的sys_read函数。[0020]步骤二、为了重新实现procfs文件系统,首先应该了解到procfs本身是一种内存文件系统,linux内核通过seq_file机制给procfs中的文件设置了callback函数,当开始读取procfs文件中的内容时会自动触发callback函数填充文件内容。因此,需要把上述中的mem_cgroup结构体返回给callback函数,并让callback函数重新调用注册函数进行注册,在callback函数注册完成后,就会重新生成/proc/meminfo文件。此时,docker容器内的程序已经可以获得容器正确的资源信息了。[0021]实施例2[0022]本实施例通过lkm程序导入内核的方法为例进行说明,首先介绍下lkm程序:[0023]lkm技术是动态扩充内核功能的一项技术。它使得linux操作系统内核可以在运行状态就能对功能进行扩充。当编写完一个lkm程序,用编译器将其编译为目标文件,然后就可以根据需要动态地进行加载和卸载。并且在lkm程序编写和编译的过程中无须对内核进行重新编译。[0024]按照如下逻辑编写lkm程序代码:[0025](1)应用程序发起资源信息获取的请求,通过glibc库最终到达内核,调用sys_read函数;[0026](2)系统调用截获层接受并处理资源信息请求:请求未到达前修改内核系统调用表sys_call_table,替换sys_read函数;[0027](3)判定资源请求是否是对/proc/meninfo的访问,如果是,继续按照步骤(4)的逻辑;如果不是,那么直接调用sys_read函数;[0028](4)获取当前进程的cgroups信息,判断是否存在cgroups资源限制,如果是,继续按照步骤(5)的逻辑;如果不是那么直接调用sys_read函数;[0029](5)调用cgroups在内核中提供的资源信息获取接口,通过task_struct获取当前进程的mem_cgroup结构体;[0030](6)根据获取到mem_cgroup结构体,从中读取出资源信息生成meminfo文件内容;[0031](7)将生成的meminfo内容写入到/proc/meminfo文件中。[0032]将以上所编写的lkm程序代码进行编译,编写makefile文件,使用make命令编译以程序为可执行文件。[0033]将编译好的可执行文件上传至服务器的任一位置,执行insmod命令,将程序载入内核,在docker容器中运行的程序即可获取到正确的容器资源信息。[0034]以上所述实施例仅表达了本发明的具体实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1