获取docker容器资源信息的方法技术

技术编号:27255954 阅读:27 留言:0更新日期:2021-02-04 12:35
本发明专利技术公开了一种获取docker容器资源信息的方法,包括将sys_read函数替换为docker_read函数,docker_read函数的逻辑包括:(1)判断发起的请求是否是一个资源获取的请求,如果是,则继续步骤(2);(2)判断发起资源请求的进程是否是否存在cgroups资源限制,如果有,则获取当前进程的mem_cgroup结构体;将结构体mem_cgroup返回给callback函数,并让callback函数重新调用注册函数进行注册,重新生成/proc/meminfo文件;本发明专利技术达到了docker容器内的程序正确地获取了docker容器资源信息的目的。序正确地获取了docker容器资源信息的目的。序正确地获取了docker容器资源信息的目的。

【技术实现步骤摘要】
获取docker容器资源信息的方法


[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)调用Cg本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种获取docker容器资源信息的方法,其特征在于,包括:修改系统调用表sys_call_table中sys_read函数,将所述sys_read函数替换为docker_read函数,所述docker_read函数的逻辑流程具体包括以下步骤:(1)判断发起的请求是否是一个资源获取的请求,具体根据请求的路径是否是/proc/meminfo来判定发起的请求是否是资源获取请求,如果是,则继续步骤(2);如果不是,则调用所述sys_read函数;(2)通过查看task_struct中的css_set指针是否指向Cgroup来判断发起资源请求的进程是否存在cgroups资源限制,如果有,则Cgroups在内核中提供的资源信息获取接口task_struct,得到发起资源请求的进程所在控制组的资源信息结构体mem_cgrou...

【专利技术属性】
技术研发人员:严松龚致肖建
申请(专利权)人:四川长虹电器股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1