内存管理-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)    收藏  举报

导航