欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 统计内存外碎片事件

统计内存外碎片事件

2025/2/25 7:33:22 来源:https://blog.csdn.net/pengdonglin137/article/details/140867862  浏览:    关键词:统计内存外碎片事件

参考

  • https://blog.csdn.net/qq_43573047/article/details/140734352
  • https://zhuanlan.zhihu.com/p/479922331

在内存分配的时候,当指定的迁移类型的内存不足时,会向其他迁移类型借,内核通过下面的数组定义了迁移类型的借用顺序:

/** This array describes the order lists are fallen back to when* the free lists for the desirable migrate type are depleted** The other migratetypes do not have fallbacks.*/
static int fallbacks[MIGRATE_TYPES][3] = {[MIGRATE_UNMOVABLE]   = { MIGRATE_RECLAIMABLE, MIGRATE_MOVABLE,   MIGRATE_TYPES },[MIGRATE_MOVABLE]     = { MIGRATE_RECLAIMABLE, MIGRATE_UNMOVABLE, MIGRATE_TYPES },[MIGRATE_RECLAIMABLE] = { MIGRATE_UNMOVABLE,   MIGRATE_MOVABLE,   MIGRATE_TYPES },
};

这部分的代码如下:

/** Try finding a free buddy page on the fallback list and put it on the free* list of requested migratetype, possibly along with other pages from the same* block, depending on fragmentation avoidance heuristics. Returns true if* fallback was found so that __rmqueue_smallest() can grab it.** The use of signed ints for order and current_order is a deliberate* deviation from the rest of this file, to make the for loop* condition simpler.*/
static __always_inline bool
__rmqueue_fallback(struct zone *zone, int order, int start_migratetype,unsigned int alloc_flags)
{struct free_area *area;int current_order;int min_order = order;struct page *page;int fallback_mt;bool can_steal;/** Do not steal pages from freelists belonging to other pageblocks* i.e. orders < pageblock_order. If there are no local zones free,* the zonelists will be reiterated without ALLOC_NOFRAGMENT.*/if (order < pageblock_order && alloc_flags & ALLOC_NOFRAGMENT)min_order = pageblock_order;/** Find the largest available free page in the other list. This roughly* approximates finding the pageblock with the most free pages, which* would be too costly to do exactly.*/for (current_order = MAX_ORDER - 1; current_order >= min_order;--current_order) {area = &(zone->free_area[current_order]);// 如果可以借用,那么会返回目标迁移类型fallback_mt = find_suitable_fallback(area, current_order,start_migratetype, false, &can_steal);if (fallback_mt == -1)continue;/** We cannot steal all free pages from the pageblock and the* requested migratetype is movable. In that case it's better to* steal and split the smallest available page instead of the* largest available page, because even if the next movable* allocation falls back into a different pageblock than this* one, it won't cause permanent fragmentation.*/if (!can_steal && start_migratetype == MIGRATE_MOVABLE&& current_order > order)goto find_smallest;goto do_steal;}return false;find_smallest:for (current_order = order; current_order < MAX_ORDER;current_order++) {area = &(zone->free_area[current_order]);fallback_mt = find_suitable_fallback(area, current_order,start_migratetype, false, &can_steal);if (fallback_mt != -1)break;}/** This should not happen - we already found a suitable fallback* when looking for the largest page.*/VM_BUG_ON(current_order == MAX_ORDER);do_steal:// 从目标迁移类型申请内存page = get_page_from_free_area(area, fallback_mt);// 修改内存的迁移类型steal_suitable_fallback(zone, page, alloc_flags, start_migratetype,can_steal);// 记录tracetrace_mm_page_alloc_extfrag(page, order, current_order,start_migratetype, fallback_mt);return true;
}

上面将借用成功的信息通过trace输出了出来,这样我们就可以在上层利用各种监控机制统计。

这个trace_event的路径是:/sys/kernel/tracing/events/kmem/mm_page_alloc_extfrag

定义如下:include\trace\events\kmem.h

TRACE_EVENT(mm_page_alloc_extfrag,TP_PROTO(struct page *page,int alloc_order, int fallback_order,int alloc_migratetype, int fallback_migratetype),TP_ARGS(page,alloc_order, fallback_order,alloc_migratetype, fallback_migratetype),TP_STRUCT__entry(__field(	unsigned long,	pfn			)__field(	int,		alloc_order		)__field(	int,		fallback_order		)__field(	int,		alloc_migratetype	)__field(	int,		fallback_migratetype	)__field(	int,		change_ownership	)),TP_fast_assign(__entry->pfn			= page_to_pfn(page);__entry->alloc_order		= alloc_order;__entry->fallback_order		= fallback_order;__entry->alloc_migratetype	= alloc_migratetype;__entry->fallback_migratetype	= fallback_migratetype;__entry->change_ownership	= (alloc_migratetype ==get_pageblock_migratetype(page));),TP_printk("page=%p pfn=0x%lx alloc_order=%d fallback_order=%d pageblock_order=%d alloc_migratetype=%d fallback_migratetype=%d fragmenting=%d change_ownership=%d",pfn_to_page(__entry->pfn),__entry->pfn,__entry->alloc_order,__entry->fallback_order,pageblock_order,__entry->alloc_migratetype,__entry->fallback_migratetype,__entry->fallback_order < pageblock_order,__entry->change_ownership)
);

完。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词