Linux内核内存分配:深入解析与优化策略
1. 内存分配中的浪费问题
在使用 kmalloc() 进行内存分配时,会出现内存浪费的情况。例如,当请求1,638,500字节(略超过1.5 MB)时,实际获得2,097,152字节(恰好2 MB),浪费率达27%。随着请求接近分配“边界”或阈值,浪费率会逐渐降低,如降至13%,再降至2%。但当跨越阈值,请求略超过2 MB(2,252,900字节)时,会获得4 MB,浪费率高达86%。
这是因为当请求的内存量超过slab层所能提供的最大尺寸(通常为8 KB)时,slab层会调用页面分配器,而页面分配器存在常见的浪费问题,会分配远超所需的内存。
为避免这种情况,需要反复检查使用slab API进行内存分配的代码,并使用 ksize() 进行测试,以确定实际分配的内存量。
如果需要超过1页的内存,可以考虑使用 alloc_pages_exact()/free_pages_exact() API,这有助于减少浪费。
2. 绘制内存分配浪费图
可以使用 gnuplot 工具根据之前收集的数据绘制图表。具体步骤如下:
1. 对内核模块进行最小修改,使其仅输出要绘制图表的数据,即所需(或请求)的内存分配量(x轴)和运行时的浪费百分比(y轴)。修改后的内核模块代码可在相关GitHub仓库中找到:
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



