在Linux内核中,自2.6.23版本起,SLUB(Small/fast Local Buffer)分配器取代SLAB,成为默认的内核对象层分配器。尽管两者共享“slab”名称,但在实践中有所区分。默认情况下,"CONFIG_SLUB_DEBUG"选项在"make defconfig"中开启,而"CONFIG_SLUB_DEBUG_ON"通常关闭(如RedHat 4.18.0-80.el8.x86_64的debug版本)。
要启用SLUB调试,有两种方法:一是重新编译内核并添加"slub_debug"参数,如"grubby --args='slub_debug' --update-kernel /boot/vmlinuz-4.18.0-80.el8.x86_64";二是直接在内核启动时加入。SLUB的设计考虑了调试需求,使得调试相对容易。
开启所有SLUB的debug信息会占用大量内存,调试时通常针对特定可疑的SLUB开启。比如,要检查"numa_policy"的调试信息,使用"Z"参数。开启debug后,对象会包含额外的调试信息,有助于检测内存错误,如越界访问和未初始化或已释放内存的访问。
在运行时开启debug,模块供应商可以自行设置SLUB的debug开关,而无需重启内核。但仅设置"SLAB_RED_ZONE"可能不足以检测buffer overflow,还需配合"SLAB_CONSISTENCY_CHECKS"。除了"slabtop"和"/proc/slabinfo",SLUB的sysfs接口提供了更全面的调试信息,通过"/sys/kernel/slab"可以动态修改debug属性。
slabinfo工具,作为查看slab信息的实用工具,能提供详细统计和排序功能,包括追踪对象的分配和释放。即使不开启"slub_debug",slabinfo也能提供基本信息。但在加上debug信息后,slabinfo的追踪功能会更加强大,显示调用次数、调用路径和进程信息,有助于问题定位。
在SLUB快速增长导致难以确定具体问题时,可能需要结合systemtap等工具进行更深入的分析。所有信息都应遵循原文的版权声明。
温馨提示:答案为网友推荐,仅供参考