lsmid, /proc/modules和slabinfo, /proc/meminfo没有给出我的内核模块使用了多少内存
有办法找出这个吗?
顺便说一句,我基本上写了一个小测试程序,一个设备驱动程序,它将ioctl调用到alloc 1MB,我每秒从我的应用程序发送这个ioctl消息,所以我的驱动器每秒都在kmalloc。我看不到“cat /proc/meminfo|grep Slab”的增加
--剪断---
int device_ioctl(
struct file *file,
unsigned int ioctl_num,
unsigned long ioctl_param)
{
/*
* Switch according to the ioctl called
*/
printk ( "<l> inside ioctl %d IOCTL_ALLOC_MSG = %d\n", ioctl_num,IOCTL_ALLOC_MSG );
switch (ioctl_num) {
case IOCTL_ALLOC_MSG:
allocfunc(); // kmalloc 1MB // printk in this function is OK
break;
case IOCTL_DEALLOC_MSG:
deallocfunc();
break;
}
return 0;
}
应用程序/用户空间
while ( !stop )
{
ret_val = ioctl(memfile, IOCTL_ALLOC_MSG);
if (ret_val < 0) {
printf("ioctl failed. Return code: %d, meaning: %s\n", ret_val, strerror(errno));
return -1;
}
sleep ( 10 );
}
我在slabinfo中没有看到内存的增长。我知道linux确实缓存-
谢谢,
我不确定它是否适合您,但是您可以使用cat /proc/modules
获取模块占用的内存量,第二列是第一列中的模块正在使用的字节大小。
显示drm模块使用多少内存的示例输出:
cat /proc/modules |grep ^drm|awk '{print $1 " " $2}'
示例答案:
drm_kms_helper 49394
drm 286028
希望有帮助。
假设没有办法直接做到这一点(据我所知,可能有)……
您可以使用LTTng来跟踪您的内核事件。如果那里没有方便的事件,即使每次模块分配内存时,您也应该创建一个新的跟踪。
然后,您可以分析跟踪并绘制内存使用随时间增长和收缩的图表。