在 start_kernel 函数中,linux 内核的初始化会通过调用 proc_caches_init 函数来为内核对象分配和初始化 slab 缓存描述符。这个函数主要在 fork.c 文件中定义。初始化过程中,会使用 kmem_cache_create 函数来为不同类型的 SLAB 缓存区域进行分配,包括 sighand_cachep、signal_cachep、files_cachep、fs_cachep、mm_cachep 和 vm_area_cachep。对于 mm_cachep 缓存空间,会在 mm_struct 结构上进行分配。对于 vm_area_struct 结构,会为其分配 vm_area_cachep 缓存空间。在初始化过程中,还涉及了 mmap_init 和 nsproxy_cache_init 函数的调用,分别用于初始化虚拟内存区域的 Slab 和名称空间的 slab。
slab 是 linux 内核中的小内存分配器,它用于分配小内存,主要使用在 linux 内核的对象不需要使用内存页面分配方式的情况。在 slab 中分配内存的第一步是创建 slab 描述符,proc_caches_init 函数的目的是创建这些描述符。关于 slab 分配器的详细内容将在后续的 linux 内核内存管理文章中进行深入探讨。
往期文章精选:
‘贰’ Linux buff/cache占用大量内存分析
一、问题由来:在使用Linux系统时,我们常会发现缓存(cache)占用大量内存。例如,通过`free`命令查询内存情况时,会发现`buff/cache`已经占据了2.1G的内存。自Linux 2.4版本开始,"buffer"和"cache"被统一为页缓存,整体内存使用量较高,但实际上已使用的内存(used)只有282M。这表明大量内存被缓存占用,而非实际使用。
二、Linux缓存内容:缓存是文件数据的页缓存,主要用于加速文件的读写操作。在使用如MMap、缓冲I/O(Buffered I/O)和预读取(Read-Ahead)等技术时,内核会产生页缓存。然而,如果使用裸I/O(Raw I/O)或直接I/O(Direct I/O),则可以绕过缓存,直接在磁盘或分区上进行I/O操作,避免缓存的使用。
三、查看Linux缓存工具:要了解哪些文件被缓存,可以使用如`fincore`、`pcstat`、`hcache`、`vmtouch`等工具。其中,`fincore`已不再维护,这里主要介绍`pcstat`、`hcache`和`vmtouch`。这些工具可以帮助分析缓存使用情况,以找出问题所在。
四、使用`pcstat`:`pcstat`是一个用于分析缓存的工具,其安装和使用方法如下。首先,需要安装`go`语言包,然后克隆源码,编译工具,并运行以验证其功能。值得注意的是,不同操作系统和CPU架构需要编译对应版本的`pcstat`可执行文件,以确保兼容性和最佳性能。
五、`hcache`工具:`hcache`也是一个用于缓存分析的工具,其安装方法类似`pcstat`。`hcache`提供了一些额外的功能,如总和计算和`--top`选项,用于展示最高占用缓存的文件或进程,但该功能的准确性可能有限。
六、`vmtouch`工具:`vmtouch`是一个用C语言编写的工具,用于理解和控制Unix和类Unix系统的文件系统缓存。它提供了一系列功能,包括查询缓存中的文件、预热加载文件、清除缓存、锁定文件页以防止被换出到磁盘等。
七、总结:通过上述工具,我们能够有效地分析和管理Linux系统的缓存占用情况,从而优化内存使用和提高系统性能。通过结合使用这些工具,可以更直观地解决问题,例如找出占用大量缓存的文件和进程,并采取相应措施减少缓存占用,提升系统效率。