CN117931608A - 一种在vmcore中统计文件缓存占用的方法及装置、存储介质 - Google Patents
一种在vmcore中统计文件缓存占用的方法及装置、存储介质 Download PDFInfo
- Publication number
- CN117931608A CN117931608A CN202410288441.XA CN202410288441A CN117931608A CN 117931608 A CN117931608 A CN 117931608A CN 202410288441 A CN202410288441 A CN 202410288441A CN 117931608 A CN117931608 A CN 117931608A
- Authority
- CN
- China
- Prior art keywords
- file
- vmcore
- cache
- list
- command line
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 26
- 230000007246 mechanism Effects 0.000 claims abstract description 13
- 230000000694 effects Effects 0.000 claims abstract description 6
- 238000010191 image analysis Methods 0.000 claims abstract description 6
- 238000013507 mapping Methods 0.000 claims description 12
- 238000004590 computer program Methods 0.000 claims description 3
- 230000006870 function Effects 0.000 description 12
- 238000004519 manufacturing process Methods 0.000 description 10
- 230000002159 abnormal effect Effects 0.000 description 9
- 238000004458 analytical method Methods 0.000 description 7
- 230000009286 beneficial effect Effects 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 230000005856 abnormality Effects 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 2
- 230000015556 catabolic process Effects 0.000 description 2
- 230000008878 coupling Effects 0.000 description 2
- 238000010168 coupling process Methods 0.000 description 2
- 238000005859 coupling reaction Methods 0.000 description 2
- 239000000284 extract Substances 0.000 description 2
- 239000013307 optical fiber Substances 0.000 description 2
- 230000008569 process Effects 0.000 description 2
- 230000000644 propagated effect Effects 0.000 description 2
- 239000011800 void material Substances 0.000 description 2
- 230000006978 adaptation Effects 0.000 description 1
- 230000001808 coupling effect Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 238000012163 sequencing technique Methods 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
- 238000013024 troubleshooting Methods 0.000 description 1
- 238000010200 validation analysis Methods 0.000 description 1
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种在vmcore中统计文件缓存占用的方法及装置、存储介质;在操作系统Linux内核中导出文件系统超级块链表super_blocks,然后重新编译内核并生效;在镜像分析工具crash中定义新命令行插件以及一个二叉平衡树数据结构;当操作系统触发Linux内核的kdump机制生成vmcore镜像,通过crash工具的新命令行插件遍历vmcore镜像中super_blocks所导出的每个文件系统超级块,再遍历每个文件系统超级块的s_inodes链表中的文件inode;根据每个遍历到的文件inode,将文件的缓存占用作为键、其他关键信息作为值添加到二叉平衡树中;根据二叉平衡树中包含的数据统计并输出文件缓存占用情况。
Description
技术领域
本发明属于计算机技术领域,特别是涉及到一种在vmcore中统计文件缓存占用的方法及装置、存储介质。
背景技术
近些年来国产厂商先后发布了多款CPU处理器。然而这些新兴的国产cpu处理器或多或少采用了新的指令集架构和流片工艺,导致与现有的主流Linux操作系统存在一定的兼容性问题,最常见的问题就是各种内存异常,包括内存泄露、内存越界访问、内存践踏、内存重复释放等。目前大多数国产操作系统都是基于开源Linux内核进行二次开发的,因此基于国产操作系统和国产处理器的整机,在面对终端用户的时候就会经常碰到各种莫名其妙的内存使用问题。
Linux内核提供了一种内存转储机制:kdump, 当系统发生内存异常的时候可以触发kdump机制生成vmcore镜像,然后通过crash工具分析vmcore以获得内存异常时的各种信息。crash当前已封装了多种功能插件,可用来方便地分析、统计各个维度数据信息。就内存使用信息而言,crash封装的kmem插件只能查看系统有限的内存统计信息,包括总内存、空闲内存、文件页缓存、共享内存等。
文件页缓存的机制属性决定了在一个Linux系统上随着运行时间越长或访问IO越频繁,就会导致文件页缓存占据大量的物理内存。在现有的crash分析工具中,还没有一种工具或插件能直观的展示vmcore中单个文件占用的页缓存情况。如当前crash 的kmem插件只能统计到文件页缓存占用的总得内存开销。另外如fincore是Linux系统中一个开源的命令行工具,可用于检查运行时系统上文件在缓存中的情况,包括显示指定文件的哪些部分(如果有的话)已经缓存在文件系统页缓存中。但是fincore有几大缺点,首先fincore只能在线查看单个文件在页缓存中的占用情况,不能用于vmcore这种内存镜像分析。其次、fincore需要明确指定文件名作为参数,也就是说只能查看特定的文件页缓存占用情况,不能自动根据文件占用缓存情况按顺序列举出来。
如果有一种方法或工具能够查看具体文件占用的页缓存并且能按从高到低的顺序列举出主要占据页缓存的文件情况,这对于通过vmcore来分析、排查内存异常问题将提供极大的便利。通过具体文件占用页缓存的情况,调试人员可快速锁定文件对应的业务,加快问题定位。
发明内容
本发明的目的在于提供一种在vmcore中统计文件缓存占用的方法及装置、存储介质,可以统计系统崩溃或内存异常时在线系统的内存中有哪些文件被缓存以及每个文件具体占用的内存开销情况,便于通过vmcore来分析、排查内存异常问题。
为了实现上述目的,本发明的技术方案是这样实现的:
一种在vmcore中统计文件缓存占用的方法,包括:
S1、在操作系统Linux内核中导出文件系统超级块链表super_blocks,然后重新编译内核并生效;
S2、在镜像分析工具crash中定义新命令行插件以及一个二叉平衡树数据结构;
S3、当操作系统触发Linux内核的kdump机制生成vmcore镜像,通过crash工具的所述新命令行插件遍历vmcore镜像中文件系统超级块链表super_blocks中的每个文件系统超级块,再遍历每个文件系统超级块的s_inodes链表中的文件inode;根据每个遍历到的文件inode,将文件的缓存占用作为键、其他关键信息作为值添加到二叉平衡树中;
S4、根据二叉平衡树中包含的数据统计并输出文件缓存占用情况。
进一步的,步骤S1中,使用EXPORT_SYMBOL()接口导出文件系统超级块链表super_blocks。
进一步的,步骤S2中,所述新命令行插件的定义方法包括:
S201、在def.h头文件中申明新命令行插件的命令接口;
S202、在linux_command_table[]全局命令数组中添加新命令行插件的对应成员;
S203、定义新命令行插件可接受的参数以及参数的具体作用。
进一步的,步骤S3中,使用readmem()接口读取文件系统超级块链表super_blocks在内存中的值,再根据链表成员偏移,使用list_for_each_entry()接口遍历所有文件系统超级块;再继续使用list_for_each_entry()遍历s_inodes链表中的文件inode。
更进一步的,对每一个遍历访问到的文件inode,其成员inode_i_mapping代表当前文件在page cache中的地址空间,通过get_inode_nrpages()接口获得所述inode_i_mapping的缓存页数量。
本发明另一方面还提出了一种在vmcore中统计文件缓存占用的装置,包括:
导出模块:在操作系统Linux内核中导出文件系统超级块链表super_blocks,然后重新编译内核并生效;
定义模块:在镜像分析工具crash中定义新命令行插件以及一个二叉平衡树数据结构;
遍历模块:当操作系统触发Linux内核的kdump机制生成vmcore镜像,通过crash工具的所述新命令行插件遍历vmcore镜像中文件系统超级块链表super_blocks中的每个文件系统超级块,再遍历每个文件系统超级块的s_inodes链表中的文件inode;根据每个遍历到的文件inode,将文件的缓存占用作为键、其他关键信息作为值添加到二叉平衡树中;
统计输出模块:根据二叉平衡树中包含的数据统计并输出文件缓存占用情况。
进一步的,所述导出模块中,使用EXPORT_SYMBOL()接口导出文件系统超级块链表super_blocks。
进一步的,所述定义模块中,所述新命令行插件包括:在def.h头文件中申明新命令行插件的命令接口;在linux_command_table[]全局命令数组中添加新命令行插件的对应成员;定义新命令行插件可接受的参数以及参数的具体作用。
进一步的,所述遍历模块中,使用readmem()接口读取文件系统超级块链表super_blocks在内存中的值,再根据链表成员偏移,使用list_for_each_entry()接口遍历所有文件系统超级块;再继续使用list_for_each_entry()遍历s_inodes链表中的文件inode;对每一个遍历访问到的文件inode,其成员inode_i_mapping代表当前文件在page cache中的地址空间,通过get_inode_nrpages()接口获得所述inode_i_mapping的缓存页数量。
本发明还提供了一种计算机可读存储介质,所述存储介质存储有计算机程序,所述计算机程序用于执行上述的在vmcore中统计文件缓存占用的方法。
与现有技术相比,本发明具有如下的有益效果:
1、本发明充分利用vmcore中的文件系统超级块及元数据信息,经过多重计算推导来提取系统崩溃或内存异常时各文件在内存中的占用情况,实现了在线系统崩溃或内存异常时内存中哪些文件被缓存以及每个文件具体占用的内存开销情况的直接统计。
2、本发明可用于直观展示线上系统在崩溃时的缓存使用情况,便于开发人员追溯具体内存使用去向并提升问题定位效率,实用性强。
3、本发明充分利用文件系统超级块链表关联性,尽量复用Linux内核和crash现有接口代码,使得代码耦合性相对较低。同时使用了二叉平衡树来做增删查改,操作非常高效。
附图说明
图1是现有技术中crash支持的缓存统计示意图。
图2是本发明实施例的整体流程图。
图3是本发明实施例的ctop核心功能实现的流程图。
具体实施方式
需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
首先对本发明实施例中涉及到的缩略语和关键术语进行说明。
kexec:kexec(kernelexecsystemcall)是Linux内核的一种快速启动机制,允许通过在已经运行的内核上下文加载并启动另一个Linux内核,它的作用类似于reboot,但是不需要经过BIOS枚举,因此在带有众多数量的外设的大型服务器上这种办法可以为经常启动机器的开发者节省很多时间。kdump也利用kexec机制来快速启动捕获内核,然后将生产内核的内存镜像转储到存储介质中。
kdump:kdump(kerneldump)是在Linux系统崩溃或异常时用来转储内存运行镜像的一个服务,kdump使用两个内核:生产内核和捕获内核。生产内核是系统正常运行时的内核,它使用特殊的kdump标志在生产内核启动时保留小部分物理内存,用于加载捕获内核。kdump需要提前通过kexec机制加载捕获内核,因为在崩溃发生的那一刻,由于内核异常,无法从磁盘读取任何数据。捕获内核会在生产内核崩溃时启动起来,与相应的ramdisk一起组建一个微环境,用以对生产内核下的内存进行收集和转存。由于kdump利用kexec启动捕获内核,绕过了BIOS,所以第一个内核的内存得以保留。这是内核崩溃转储得以实现的重要原因。
vmcore:vmcore是Linux系统异常时通过kdump服务收集的生产内核的内存镜像文件,它保留了生产内核异常瞬间时的内存状态。通过crash工具可深度解析vmcore文件中各种数据信息,为还原生产内核的事故原因提供了有利的帮助。
crash:crash是Linux系统中用来分析vmcore转储文件的一种命令行工具,它需要结合vmcore和内核debug符号表一起使用。crash工具功能相当强大,并且内置了各种子功能模块,可以用来查看镜像文件的日志信息、进程信息、内存信息、中断信息等。crash配合kdump和vmcore,为Linux系统下异常崩溃信息收集、问题分析提供了一套强有力的解决方案。
page cache:page cache(文件页缓存)是Linux系统中为加速文件访问而通过内存提前缓存文件数据的一种机制,普通文件读写都先经过page cache,在下次访问该文件时无需从底层存储介质中加载,可以直接从page cache返回文件数据。默认情况下系统会尽可能的使用空闲的物理内存来尽可能多的缓存文件数据,在内存吃紧的时候缓存的pagecache可以被释放掉,优先满足正常的物理内存申请。
ctop:本发明实施例中所述的新开发的一种crash命令行插件,通过该插件可以直观的展示系统中占用页缓存的具体文件信息,并提供排序显示。
本发明的设计思想是基于crash分析工具的。现有技术中的crash分析工具的缓存统计功能例如图1所示,在某一时刻,在线系统的内存中缓存了file 1,file 2和file 3三个文件内容,他们的文件页缓存大小分别为x GB, y GB和z GB。当内存异常发生触发kdump时,会将当时系统的内存全部转储为vmcore镜像,此时通过crash分析工具去分析线上系统的内存占用情况,其kmem插件只能统计文件页缓存占用的内存总量,即x + y + z GB pagecache,但是没有办法知道内存异常时在线系统的内存中有哪些文件被缓存,以及每个文件具体占用的内存开销情况。
因此本发明针对crash分析工具无法统计vmcore中具体文件页缓存占用的内存情况,实现了一种新的分析、统计方法,该方法充分利用vmcore中的文件系统超级块及元数据信息,经过多重计算和推导来提取系统崩溃时各文件在内存中的占用情况。
实施例一:
在实施例一中,本发明提出了一种在vmcore中统计文件缓存占用的方法,如图2所示,包括:
S1: 在Linux内核中导出文件系统超级块链表super_blocks。文件系统超级块作为文件系统的元数据信息,可以提领整个文件系统,通过文件系统超级块可以遍历整个文件系统里的文件及其属性,因此需要在Linux内核中将保存所有文件系统超级块的链表super_blocks导出,使之可以被crash访问到。
1)super_blocks在文件系统定义为:LIST_HEAD(super_blocks),是Linux内核中的一个全局链表,为了在crash中能访问到该全局变量,使用Linux内核支持的EXPORT_SYMBOL(super_blocks)接口将其导出。
2)导出之后还需要重新编译内核生效,包括:重新编译内核源码,生成新的内核包替换线上内核,下次kdump生成vmcore之后即可在crash中访问super_blocks。
S2: 在crash工具中定义一种新的命令行插件ctop,再定义一个二叉平衡树ctop_tree。
1、定义新命令行插件ctop是为了使这个文件页缓冲占用统计插件尽量达到低耦合和可动态加载的目的,定义过程包括:
1)在defs.h头文件的尾部,申请一种的命令行插件并注释该命令行插件的功能:void cmd_ctop(void); /* display file cache info */;
2)在global_data.c文件中的linux_command_table[]全局命令数组中添加cmd_ctop成员:{"ctop",cmd_ctop, help_ctop, 0},其中"ctop"表示新增的命令行插件名称,cmd_ctop即是在defs.h新定义的函数接口,执行该命令行插件时会调用该接口,help_ctop表示用来展示ctop功能的帮助接口;
3)在help.c文件中定义help_ctop接口,包括其具体功能说明、接受的参数等。形式可参考help.c文件中现有的help接口。
新命令行插件ctop的主要功能包括:
使用readmem()接口读取super_blocks链表在内存中的值,再根据链表成员偏移可以使用list_for_each_entry()接口遍历得到所有文件系统超级块;对每一个访问到的文件系统超级块,继续使用list_for_each_entry()接口遍历其s_inodes成员链表获得该超级块对应文件系统上所有被访问过的文件inode。对每一个访问到的inode,通过get_inode_nrpages()接口可获得该inode_i_mapping在page cache中的缓存页数量。将文件对应的缓存页数量连同inode的其他属性以键值对的形式插入到二叉平衡树ctop_tree中。
2、由page cache机制可知,在线系统的内存空间里通常缓存了多个文件的副本,包括业务访问的数据文件以及系统组件的可执行程序等。ctop在遍历缓存在page cache中的文件时需要有一种高效的数据结构能用来保存遍历过的文件关键信息。为此,定义一个二叉平衡树ctop_tree,二叉平衡树具有很好的时空开销比,可实现动态扩容且能基于文件在page cache中的占用量提供快速排序。二叉平衡树用于如果该文件有页缓存占用则以页缓存占用量作为键、以文件基本属性作为值插入到ctop_tree平衡树中。
S3: 在crash中实现ctop命令行插件的功能,其具体流程如图3所示:
1)准备所需的数据结构,包括二叉平衡树ctop_tree、临时中间变量等。
2)help_ctop中申明了ctop支持的命令行参数,在cmd_ctop函数中首先需要使用getopt()接口进行参数解析,ctop支持的参数列如下表所示。
3)基于S1步骤中导出的文件系统超级块链表super_blocks,使用readmem()接口读取super_blocks链表在内存中的值,再根据链表成员偏移可以使用list_for_each_entry()接口遍历得到所有文件系统超级块。
4)对每一个访问到的文件系统超级块,继续使用list_for_each_entry()接口遍历其s_inodes成员链表获得该超级块对应文件系统上所有被访问过的文件inode。inode是保存每个文件元数据的结构体, s_inodes是文件系统超级块结构体的成员,其定义为双向链表,保存了对应文件系统在当前系统上所有已访问过的文件inode。对于Linux内核而言,当前系统上已访问过的文件inode都会挂接在对应的文件系统超级块的s_inodes成员链表中,因此对于第一次遍历获取的每个文件系统超级块,可再次使用list_for_each_entry()接口遍历其s_inodes链表中的文件inode。
5)对每一个访问到的inode,根据inode可索引到每个文件大小、名字、对应设备以及此处重点关注的该文件在页高速缓存中的占用情况,其成员inode_i_mapping代表当前文件在page cache中的地址空间,通过get_inode_nrpages()接口可获得该inode_i_mapping在page cache中的缓存页数量。
6)将上步获取的文件对应的缓存页数量(缓存占用)、连同inode的其他属性(包括文件名、大小、路径等)以键值对的形式(每个文件的缓存占用作为键、其他关键信息作为值)插入到二叉平衡树ctop_tree中。
S4:按需输出具体文件缓存占用信息:遍历完super_blocks和s_inodes之后,ctop_tree平衡树中已经包含了系统page cache中所有的文件缓存信息,ctop_tree平衡树支持快速检索、快速排序等高效操作,因此可按照用户指定的格式输出具体的文件缓存占用情况。如输出缓存占用最高的N个文件、输出某个文件系统的所有缓存文件等。
1)根据 -n VALUE 参数指定输出的条目数,从二叉平衡树ctop_tree中获取VALUE个节点,ctop_tree已按文件缓存页大小排好序。
2)根据其他参数指定的格式输出每个条目信息,包括缓存大小、文件名、文件路径等。
本实施例一可用于直观展示线上系统在崩溃时的缓存使用情况,便于开发人员追溯具体内存使用去向并提升问题定位效率,实用性强,充分利用文件系统超级块链表关联性,尽量复用Linux内核和crash现有接口代码,使得代码耦合性相对较低。同时使用了二叉平衡树来做增删查改,操作非常高效。
实施例二:
本实施例二提出了一种在vmcore中统计文件缓存占用的装置,包括:
导出模块:在操作系统Linux内核中导出文件系统超级块链表super_blocks,然后重新编译内核并生效;
定义模块:在镜像分析工具crash中定义新命令行插件以及一个二叉平衡树数据结构;
遍历模块:当操作系统触发Linux内核的kdump机制生成vmcore镜像,通过crash工具的所述新命令行插件遍历vmcore镜像中文件系统超级块链表super_blocks中的每个文件系统超级块,再遍历每个文件系统超级块的s_inodes链表中的文件inode;根据每个遍历到的文件inode,将文件的缓存占用作为键、其他关键信息作为值添加到二叉平衡树中;
统计输出模块:根据二叉平衡树中包含的数据统计并输出文件缓存占用情况。
在所述导出模块中,使用EXPORT_SYMBOL()接口导出文件系统超级块链表super_blocks。
在所述定义模块中,所述新命令行插件的定义方法包括:在def.h头文件中申明新命令行插件的命令接口;在linux_command_table[]全局命令数组中添加新命令行插件的对应成员;最后定义新命令行插件可接受的参数以及参数的具体作用。
在所述遍历模块中,使用readmem()接口读取文件系统超级块链表super_blocks在内存中的值,再根据链表成员偏移,使用list_for_each_entry()接口遍历所有文件系统超级块;再继续使用list_for_each_entry()遍历s_inodes链表中的文件inode;对每一个遍历访问到的文件inode,其成员inode_i_mapping代表当前文件在page cache中的地址空间,通过get_inode_nrpages()接口获得所述inode_i_mapping的缓存页数量。
本实施例二提出的在vmcore中统计文件缓存占用的装置,可实现实施例一中的在vmcore中统计文件缓存占用的方法,并且具有与实施例一相同的有益效果。
实施例三:
本实施例中提供了一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行如实施例一所述的在vmcore中统计文件缓存占用的方法。
本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如”C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
以上所述实施例仅是本发明的优选实施方式,只是用于帮助理解本申请的方法及其核心思想,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (10)
1.一种在vmcore中统计文件缓存占用的方法,其特征在于,包括:
S1、在操作系统Linux内核中导出文件系统超级块链表super_blocks,然后重新编译内核并生效;
S2、在镜像分析工具crash中定义新命令行插件以及一个二叉平衡树数据结构;
S3、当操作系统触发Linux内核的kdump机制生成vmcore镜像,通过crash工具的所述新命令行插件遍历vmcore镜像中文件系统超级块链表super_blocks中的每个文件系统超级块,再遍历每个文件系统超级块的s_inodes链表中的文件inode;根据每个遍历到的文件inode,将文件的缓存占用作为键、其他关键信息作为值添加到二叉平衡树中;
S4、根据二叉平衡树中包含的数据统计并输出文件缓存占用情况。
2.根据权利要求1所述的在vmcore中统计文件缓存占用的方法,其特征在于,步骤S1中,使用EXPORT_SYMBOL()接口导出文件系统超级块链表super_blocks。
3.根据权利要求1所述的在vmcore中统计文件缓存占用的方法,其特征在于,步骤S2中,所述新命令行插件的定义方法包括:
S201、在def.h头文件中申明新命令行插件的命令接口;
S202、在linux_command_table[]全局命令数组中添加新命令行插件的对应成员;
S203、定义新命令行插件可接受的参数以及参数的具体作用。
4.根据权利要求1所述的在vmcore中统计文件缓存占用的方法,其特征在于,步骤S3中,使用readmem()接口读取文件系统超级块链表super_blocks在内存中的值,再根据链表成员偏移,使用list_for_each_entry()接口遍历所有文件系统超级块;再继续使用list_for_each_entry()遍历s_inodes链表中的文件inode。
5.根据权利要求4所述的在vmcore中统计文件缓存占用的方法,其特征在于,对每一个遍历访问到的文件inode,其成员inode_i_mapping代表当前文件在page cache中的地址空间,通过get_inode_nrpages()接口获得所述inode_i_mapping的缓存页数量。
6.一种在vmcore中统计文件缓存占用的装置,其特征在于,包括:
导出模块:在操作系统Linux内核中导出文件系统超级块链表super_blocks,然后重新编译内核并生效;
定义模块:在镜像分析工具crash中定义新命令行插件以及一个二叉平衡树数据结构;
遍历模块:当操作系统触发Linux内核的kdump机制生成vmcore镜像,通过crash工具的所述新命令行插件遍历vmcore镜像中文件系统超级块链表super_blocks中的每个文件系统超级块,再遍历每个文件系统超级块的s_inodes链表中的文件inode;根据每个遍历到的文件inode,将文件的缓存占用作为键、其他关键信息作为值添加到二叉平衡树中;
统计输出模块:根据二叉平衡树中包含的数据统计并输出文件缓存占用情况。
7.根据权利要求6所述的在vmcore中统计文件缓存占用的装置,其特征在于,所述导出模块中,使用EXPORT_SYMBOL()接口导出文件系统超级块链表super_blocks。
8.根据权利要求6所述的在vmcore中统计文件缓存占用的装置,其特征在于,所述定义模块中,所述新命令行插件包括:在def.h头文件中申明新命令行插件的命令接口;在linux_command_table[]全局命令数组中添加新命令行插件的对应成员;定义新命令行插件可接受的参数以及参数的具体作用。
9.根据权利要求6所述的在vmcore中统计文件缓存占用的装置,其特征在于,所述遍历模块中,使用readmem()接口读取文件系统超级块链表super_blocks在内存中的值,再根据链表成员偏移,使用list_for_each_entry()接口遍历所有文件系统超级块;再继续使用list_for_each_entry()遍历s_inodes链表中的文件inode;对每一个遍历访问到的文件inode,其成员inode_i_mapping代表当前文件在page cache中的地址空间,通过get_inode_nrpages()接口获得所述inode_i_mapping的缓存页数量。
10.一种计算机可读存储介质,所述存储介质存储有计算机程序,其特征在于,所述计算机程序用于执行如权利要求1-5任一项所述的在vmcore中统计文件缓存占用的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410288441.XA CN117931608A (zh) | 2024-03-14 | 2024-03-14 | 一种在vmcore中统计文件缓存占用的方法及装置、存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410288441.XA CN117931608A (zh) | 2024-03-14 | 2024-03-14 | 一种在vmcore中统计文件缓存占用的方法及装置、存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117931608A true CN117931608A (zh) | 2024-04-26 |
Family
ID=90764874
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202410288441.XA Pending CN117931608A (zh) | 2024-03-14 | 2024-03-14 | 一种在vmcore中统计文件缓存占用的方法及装置、存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117931608A (zh) |
-
2024
- 2024-03-14 CN CN202410288441.XA patent/CN117931608A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8196129B2 (en) | Adaptive class loading | |
WO2018072493A1 (zh) | 编译方法和编译系统 | |
US7676508B2 (en) | Method and system for recording and replaying input-output requests issued by a user-mode program | |
US9400733B2 (en) | Pattern matching framework for log analysis | |
US20120278585A1 (en) | Optimizing heap memory usage | |
US20060143596A1 (en) | Program analyzing apparatus and testing apparatus, and analyzing method and program therefor | |
US20090113550A1 (en) | Automatic Filter Generation and Generalization | |
US9104797B1 (en) | Efficient cloud-based annotation of crash reports | |
US8020156B2 (en) | Bulk loading system and method | |
WO2018164975A1 (en) | Indexing a trace by insertion of reverse lookup data structures | |
CN117149658A (zh) | 呈现代码实体调用之间的差异 | |
CN113296786B (zh) | 数据处理方法、装置、电子设备及存储介质 | |
CN112099880B (zh) | 场景驱动的应用程序约减方法和系统 | |
US20230124327A1 (en) | Cross-thread memory indexing in time-travel debugging traces | |
US9477496B2 (en) | Method and apparatus for loading classes and re-organizing class archives | |
CN110334302B (zh) | 复杂Web应用前端运行时分析方法 | |
CN111475150B (zh) | 一种跨语言绑定方法、装置、设备及存储介质 | |
Lee et al. | Toward generating reducible replay logs | |
CN117112522A (zh) | 并发进程日志管理方法、装置、设备和存储介质 | |
CN117931608A (zh) | 一种在vmcore中统计文件缓存占用的方法及装置、存储介质 | |
US8935200B2 (en) | Dynamic database dump | |
CN113590133A (zh) | 安卓系统注入检测方法、装置、设备以及计算机存储介质 | |
CN111722849A (zh) | Java语言虚拟编译实现方法、系统及装置 | |
Omori et al. | Lightweight Operation History Graph for Traceability on Program Elements | |
US11106522B1 (en) | Process memory resurrection: running code in-process after death |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |