内存管理-48-内存相关trace汇总
基于msm-5.4
一、kmem 中slub的trace
trace方法: P=/sys/kernel/tracing; echo kmem > $P/set_event; > $P/trace; echo 1 > $P/tracing_on; cat $P/trace_pipe | tee trace_kmem.txt
1. kmalloc
1.1 调用位置
trace_kmalloc() 调用位置:
kmalloc(size, flags) //slab.h __kmalloc //slub.c __kmalloc_track_caller //slub.c kmalloc_large //slab.h kmalloc_order_trace //slab_common.c trace_kmalloc(_RET_IP_, ret, size, PAGE_SIZE << order, flags) kmem_cache_alloc_node_trace //slab.h slob用,没有使能的调用位置 kmem_cache_alloc_trace //slub.c trace_kmalloc(_RET_IP_, ret, size, s->size, gfpflags) kmalloc //slab.h __kmalloc_node //slab.h __kmalloc //slub.c trace_kmalloc(_RET_IP_, ret, size, s->size, flags); kmalloc_track_caller //slab.h 外部有多处调用位置 __kmalloc_track_caller //slub.c trace_kmalloc(caller, ret, size, s->size, gfpflags);
1.2 打印内容
sh-20822 [000] .... 16083.074094: kmalloc: call_site=kcalloc+0x24/0x38 ptr=ffffff82f2603c80 bytes_req=32 bytes_alloc=640 gfp_flags=GFP_KERNEL|__GFP_NOFAIL|__GFP_ZERO surfaceflinger-590 [002] .... 16083.075588: kmalloc: call_site=sync_file_ioctl+0x1d4/0x454 ptr=ffffff82ed3d1700 bytes_req=80 bytes_alloc=640 gfp_flags=GFP_KERNEL|__GFP_ZERO
1.3 说明
这个接口是slub机制使用的trace.
2. kfree
2.1 调用路径
2.2 打印内容
surfaceflinger-590 [002] .... 16083.075591: kfree: call_site=sync_file_ioctl+0x3b4/0x454 ptr=ffffff82ed3d1700 UnityChoreograp-6498 [005] .... 16083.075702: kfree: call_site=skb_release_data+0x178/0x210 ptr=ffffff828c718200
2.3 说明
3. kmalloc_node
3.1 调用路径
3.2 打印内容
一次都没打印出来
3.3 说明
4. kmem_cache_alloc
4.1 调用路径
4.2 打印内容
sh-20822 [000] .... 16083.074289: kmem_cache_alloc: call_site=__pte_alloc+0x54/0x184 ptr=ffffff8336433250 bytes_req=24 bytes_alloc=360 gfp_flags=GFP_KERNEL sh-20822 [000] .... 16083.074294: kmem_cache_alloc: call_site=dup_mmap+0x184/0x4e8 ptr=ffffff833dd7fbf0 bytes_req=232 bytes_alloc=568 gfp_flags=GFP_KERNEL
4.3 说明
5. kmem_cache_alloc_node
5.1 调用路径
5.2 打印内容
一次都没打印出来.
5.3 说明
6. kmem_cache_free
6.1 调用路径
6.2 打印内容
surfaceflinger-590 [002] .... 16083.075652: kmem_cache_free: call_site=dentry_free+0x64/0xd4 ptr=ffffff8333d85638 surfaceflinger-590 [002] .... 16083.075655: kmem_cache_free: call_site=security_file_free+0xa4/0xbc ptr=ffffff82dce36dc8
6.3 说明
二、kmem中page alloc的trace
1. mm_page_alloc
1.1 调用路径
__alloc_pages_nodemask //page_alloc.c 分配到物理页退出时调用 trace_mm_page_alloc(page, order, alloc_mask, ac.migratetype)
1.2 打印内容
sh-20822 [000] .... 16083.075661: mm_page_alloc: page=ffffffff0543d1c0 pfn=1937223 order=0 migratetype=1 gfp_flags=GFP_HIGHUSER_MOVABLE sh-20822 [000] .... 16083.075857: mm_page_alloc: page=ffffffff0a8c5980 pfn=3322214 order=0 migratetype=0 gfp_flags=GFP_HIGHUSER|__GFP_NOWARN|__GFP_ZERO shell svc 20822-20823 [002] .... 16084.235811: mm_page_alloc: page=ffffffff0bc87200 pfn=3645896 order=3 migratetype=0 gfp_flags=__GFP_IO|__GFP_FS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC|__GFP_HARDWALL
1.3 说明
从伙伴系统中分配物理页使用,打印分配出来的物理页的信息。
2. mm_page_alloc_extfrag
2.1 调用路径
rmqueue //page_alloc.c 从伙伴系统分配物理页 __rmqueue_pcplist //page_alloc.c rmqueue(order=0) 时优先从pcplist中分配物理页 get_populated_pcp_list //page_alloc.c rmqueue_bulk __rmqueue //page_alloc.c __rmqueue_smallest()没有分配到物理页时调用 __rmqueue_fallback //page_alloc.c trace_mm_page_alloc_extfrag(page, order, current_order, start_migratetype, fallback_mt)
2.2 打印内容
一次都没打印出来, 可能常态下不容易触发。
打印格式: "page=%p pfn=%lu alloc_order=%d fallback_order=%d pageblock_order=%d alloc_migratetype=%d fallback_migratetype=%d fragmenting=%d change_ownership=%d"
2.3 说明
应该是本迁移类型中没分配到页面,fallback从其它迁移类型挪页面时调用。
3. mm_page_alloc_zone_locked
3.1 调用路径
3.2 打印内容
cat-23288 [001] d..1 16083.076267: mm_page_alloc_zone_locked: page=0000000000000000 pfn=0 order=0 migratetype=3 percpu_refill=1 <...>-23288 [001] d..1 16083.077671: mm_page_alloc_zone_locked: page=0000000000000000 pfn=0 order=0 migratetype=3 percpu_refill=1
3.3 说明
4. mm_page_free
4.1 调用路径
free_unref_page //page_alloc.c free order-0 page free_unref_page_list //page_alloc.c free order-0 pagelist free_unref_page_prepare free_pcp_prepare free_compound_page //page_alloc.c free_the_page //page_alloc.c __free_pages_ok free_pages_prepare trace_mm_page_free(page, order);
4.2 打印内容
<...>-23288 [001] ...2 16083.078149: mm_page_free: page=ffffffff07ddd840 pfn=2619233 order=0 <...>-23288 [001] ...2 16083.078150: mm_page_free: page=ffffffff04ffd4c0 pfn=1867603 order=0
4.3 说明
释放物理页时进行打印。
5. mm_page_free_batched
5.1 调用路径
shrink_page_list //vmscan.c 内存回收 shrink_inactive_list //vmscan.c shrink_active_list //vmscan.c release_pages //swap.c free_unref_page_list trace_mm_page_free_batched(page);
5.2 打印内容
<...>-23288 [001] d..2 16083.078157: mm_page_free_batched: page=ffffffff07ddd840 pfn=2619233 order=0 <...>-23288 [001] d... 16083.082596: mm_page_free_batched: page=ffffffff0569b880 pfn=1976034 order=0
5.3 说明
主要是在内存回收路径中一次性批量释放多个物理页(释放一个pagelist)时调用。
6. mm_page_pcpu_drain
6.1 调用路径
online_pages //memory_hotplug.c __offline_pages //memory_hotplug.c zone_pcp_reset ////page_alloc.c 【3】内存热插拔路径 drain_local_pages page_alloc_cpu_dead //【2】CPU died drain_pages __alloc_pages_direct_reclaim //page_alloc.c 【1】内存不足回收pcp pages drain_all_pages drain_local_pages_wq drain_local_pages drain_pages_zone //page_alloc.c free_unref_page_commit free_pcppages_bulk //page_alloc.c trace_mm_page_pcpu_drain(page, 0, mt);
6.2 打印内容
rcuop/4-40 [002] d..1 16083.116227: mm_page_pcpu_drain: page=ffffffff069d8c00 pfn=2291248 order=0 migratetype=1 rcuop/4-40 [002] d..1 16083.116228: mm_page_pcpu_drain: page=ffffffff0bb92900 pfn=3630244 order=0 migratetype=0
6.3 说明
由于内存不足、CPU online/offline 时,回收每CPU的pcp pages的时候,进行打印。
7. rss_stat
7.1 调用路径
add_mm_counter //mm.h &mm->rss_stat.count[member] 加value inc_mm_counter //mm.h 加1 dec_mm_counter //mm.h 减1 mm_trace_rss_stat //memory.c trace_rss_stat(mm, member, count);
7.2 打印内容
AdrenoOsLib-4691 [001] ...1 16083.148926: rss_stat: mm_id=2703925280 curr=1 member=0 size=-448188416B UsbFfs-worker-20641 [001] ...1 16084.286847: rss_stat: mm_id=2016617079 curr=1 member=1 size=2347008B
7.3 说明
看来是对RSS内存的计数统计。
三、oom 的trace
1. finish_task_reaping
2. mark_victim
3. oom_score_adj_update
4. reclaim_retry_zone
5. skip_task_reaping
6. start_task_reaping
7. wake_reaper
四、vmscan 的trace
1. mm_shrink_slab_end
2. mm_shrink_slab_start
3. mm_vmscan_direct_reclaim_begin
4. mm_vmscan_direct_reclaim_end
5. mm_vmscan_inactive_list_is_low
6. mm_vmscan_kswapd_sleep
7. mm_vmscan_kswapd_wake
8. mm_vmscan_lru_isolate
9. mm_vmscan_lru_shrink_active
10. mm_vmscan_lru_shrink_inactive
11. mm_vmscan_memcg_reclaim_begin
12. mm_vmscan_memcg_reclaim_end
13. mm_vmscan_memcg_softlimit_reclaim_begin
14. mm_vmscan_memcg_softlimit_reclaim_end
15. mm_vmscan_node_reclaim_begin
16. mm_vmscan_node_reclaim_end
17. mm_vmscan_wakeup_kswapd
18. mm_vmscan_writepage
五、filemap 的trace
1. file_check_and_advance_wb_err
2. filemap_set_wb_err
3. mm_filemap_add_to_page_cache
4. mm_filemap_delete_from_page_cache
六、cma 的trace
1. cma_alloc
2. cma_alloc_busy_retry
3. cma_alloc_start
4. cma_release
七、pagemap 的trace
1. mm_lru_activate
2. mm_lru_insertion
注: 这两个trace是在swap.c中导出来的。
八、migrate 的trace
由 mm/migrate.c 导出。
1. mm_migrate_pages
2. mm_migrate_pages_start
3. mm_numa_migrate_ratelimit
九、compaction 的trace
1. mm_compaction_begin
2. mm_compaction_defer_compaction
3. mm_compaction_defer_reset
4. mm_compaction_deferred
5. mm_compaction_end
6. mm_compaction_finished
7. mm_compaction_isolate_freepages
8. mm_compaction_isolate_migratepages
9. mm_compaction_kcompactd_sleep
10. mm_compaction_kcompactd_wake
11. mm_compaction_migratepages
12. mm_compaction_suitable
13. mm_compaction_try_to_compact_pages
14. mm_compaction_wakeup_kcompactd
十、writeback 的trace
1. balance_dirty_pages
2. bdi_dirty_ratelimit
3. flush_foreign
4. global_dirty_state
5. inode_foreign_history
6. inode_switch_wbs
7. sb_clear_inode_writeback
8. sb_mark_inode_writeback
9. track_foreign_dirty
10. wait_on_page_writeback
11. wbc_writepage
12. writeback_bdi_register
13. writeback_congestion_wait
14. writeback_dirty_inode
15. writeback_dirty_inode_enqueue
16. writeback_dirty_inode_start
17. writeback_dirty_page
18. writeback_exec
19. writeback_lazytime
20. writeback_lazytime_iput
21. writeback_mark_inode_dirty
22. writeback_pages_written
23. writeback_queue
24. writeback_queue_io
25. writeback_sb_inodes_requeue
26. writeback_single_inode
27. writeback_single_inode_start
28. writeback_start
29. writeback_wait
30. writeback_wait_iff_congested
31. writeback_wake_background
32. writeback_write_inode
33. writeback_write_inode_start
34. writeback_written
十一、percpu 的trace
1. percpu_alloc_percpu
2. percpu_alloc_percpu_fail
3. percpu_create_chunk
4. percpu_destroy_chunk
5. percpu_free_percpu
posted on 2025-06-14 17:29 Hello-World3 阅读(61) 评论(0) 收藏 举报