首页 > 系统相关 >内存管理-34-内存回收-shrinker的注册和调用

内存管理-34-内存回收-shrinker的注册和调用

时间:2024-09-06 21:39:03浏览次数:3  
标签:memcontrol vmscan shrinker mem 34 charge 内存 cgroup

基于msm-5.4


一、简介

当存在内存压力时,会调用 shrinker 的 count_objects() 和 scan_objects() 进程内存回收操作。


二、注册逻辑

1. 注册

ashmem_init //ashmem.c
    register_shrinker(&ashmem_shrinker) //vmscan.c
        register_shrinker_prepared(shrinker)
            list_add_tail(&shrinker->list, &shrinker_list);


2. 取消注册

unregister_shrinker(struct shrinker *shrinker)
    if (shrinker->flags & SHRINKER_MEMCG_AWARE)
        unregister_memcg_shrinker(shrinker)
            idr_remove(&shrinker_idr, shrinker->id); //memcg的使用的是idr
    list_del(&shrinker->list); //直接从链表上删除

注册就是挂入到全局 shrinker_list 链表上。


三、shrinker回调调用路径

1. 调用路径梳理

                                /proc/sys/vm/drop_caches //sysctl.c 【】用户接口
                                    drop_caches_sysctl_handler //drop_caches.c 参数bit1=1为1才执行
                                        drop_slab //vmscan.c
                                            drop_slab_node //vmscan.c TODO
                    __alloc_pages_slowpath //page_alloc.c 【】内存分配慢速路径
                        __alloc_pages_direct_reclaim //page_alloc.c
                            __perform_reclaim //page_alloc.c
                                try_to_free_pages //vmscan.c
                    try_charge //memcontrol.c 路径见下面
                        high_work_func //memcontrol.c 作为 memcg->high_work 的回调
        ret_to_user //entry.S 【】返回用户空间
            work_pending //entry.S
                do_notify_resume
                    tracehook_notify_resume //tracehook.h
                        mem_cgroup_handle_over_high //memcontrol.c
                            reclaim_high //memcontrol.c
    alloc_slab_page //slub.c 【】slab分配页面路径
    kmem_getpages //slab.c
        charge_slab_page //slab.h
            memcg_charge_slab //slab.h
                memcg_kmem_charge_memcg //memcontrol.c
                    __memcg_kmem_charge //memcontrol.c
                        __memcg_kmem_charge_memcg //memcontrol.c
            memory_cgrp_subsys.can_attach //memcontrol.c 【】 cgroup内存接口
                mem_cgroup_can_attach //memcontrol.c
                    mem_cgroup_precharge_mc //memcontrol.c
            mem_cgroup_count_precharge //memcontrol.c 【】应该是内存占用统计相关逻辑
                charge_walk_ops.pmd_entry //memcontrol.c
                    mem_cgroup_move_charge_pte_range //memcontrol.c
                        mem_cgroup_do_precharge //memcontrol.c
                    collapse_huge_page //khugepaged.c
                    collapse_file //khugepaged.c
                    migrate_vma_insert_page //migrate.c
                    unuse_pte //swapfile.c
                    mcopy_atomic_pte //userfaultfd.c
                    __add_to_page_cache_locked //filemap.c
                    __replace_page //uprobes.c
                        mem_cgroup_try_charge
                    sk_forced_mem_schedule //tcp_output.c
                    inet_csk_accept //inet_connection_sock.c
                    __sk_mem_raise_allocated //sock.c
                        mem_cgroup_charge_skmem
                            try_charge //memcontrol.c
                    limit_in_bytes/soft_limit_in_bytes/kmem.limit_in_bytes/kmem.tcp.limit_in_bytes/memsw.limit_in_bytes 的write回调。//【】cgroup的文件节点
                        mem_cgroup_write //memcontrol.c
                            mem_cgroup_resize_max //memcontrol.c
                    force_empty 文件的write回调 //【】cgroup的文件节点
                        mem_cgroup_force_empty_write //memcontrol.c
                            mem_cgroup_force_empty //memcontrol.c
                        high 文件的write回调 //【】cgroup的文件节点
                            memory_high_write //memcontrol.c
                        max 文件的write回调 //【】cgroup的文件节点
                            memory_max_write //memcontrol.c
                                try_to_free_mem_cgroup_pages //vmscan.c
                            hibernate_preallocate_memory //power/snapshot.c 【】系统休眠前会执行一次
                                shrink_all_memory //vmscan.c
                                    do_try_to_free_pages //vmscan.c
                                        shrink_zones //vmscan.c
                        update_kswapd_threads_node //vmscan.c
                        multi_kswapd_run //vmscan.c
                        kswapd_run //vmscan.c
                            kthread_run(kswapd, pgdat, "kswapd%d:%d", nid, hid); 【】kswapd内核线程
                                kswapd //vmscan.c
                                    balance_pgdat //vmscan.c
                                        kswapd_shrink_node //vmscan.c
                                get_page_from_freelist //page_alloc.c【】buddy页面分配路径
                                    node_reclaim //vmscan.c
                                        __node_reclaim //vmscan.c
                                            shrink_node //vmscan.c
                                                shrink_slab //vmscan.c
                                                    list_for_each_entry(shrinker, &shrinker_list, list)
                                                        do_shrink_slab
                                                            shrinker->count_objects(shrinker, sc) //回调
                                                            shrinker->scan_objects(shrinker, shrinkctl) //回调

注:charge是占用的意思。

 

标签:memcontrol,vmscan,shrinker,mem,34,charge,内存,cgroup
From: https://www.cnblogs.com/hellokitty2/p/18401043

相关文章

  • 【操作系统】进程同步之共享内存
    进程的线程共享进程资源,而进程共享计算机资源。在某种程度上,多进程是共享物理内存的。由于操作系统的进程管理,不同的进程有自己独立的内存空间,互不干扰。但是共享内存可以打破这个限制。共享内存允许不相关的进程访问同一片物理内存。共享内存是两个进程之间共享和传递数......
  • CF1534(模拟赛记录)
    比赛页面ABCD都打的可以,然而E的+10直接葬送了大概率过的F1……先猜了个\(n-k+1\)的结论,但是没有写搜索查正确性(事实上确实不正确),于是两次罚时,第一次是交互格式错了。然后又猜了个\(\min(n-k+1,(n-1)/(k-1))\)的结论,过了几个小的搜索数据(\(n\le6\))的,大一点的没跑,于......
  • C语言-第七章:字符和字符串函数、动态内存分配
    传送门:C语言-第六章-加餐:其他自定义类型目录第一节:字符和字符串函数    1-1.strlen函数和sizeof关键字    1-2.memcpy内存拷贝函数    1-3.memmove内存拷贝函数    1-4.memset内存设置函数    1-5.strtok字符串切割函数......
  • linux如何查看内存条是ddr几代
    在Linux系统中,可以通过以下几种方法查看内存条的类型和代数(如DDR3、DDR4等):1.使用dmidecode命令dmidecode是一个工具,它可以从系统的DMI表(也称为SMBIOS表)中提取硬件信息,包括内存的信息。查看内存信息sudodmidecode--typememory这个命令会输出关于系统内......
  • 文心一言 VS 讯飞星火 VS chatgpt (341)-- 算法导论23.1 10题
    十、给定图GGG和GGG的一棵最小生成树......
  • 文心一言 VS 讯飞星火 VS chatgpt (341)-- 算法导论23.1 10题
    十、给定图和的一棵最小生成树,假设减小了中一条边的权重。证明:仍然是的一棵最小生成树。更形式化地,设为的一棵最小生成树,的边权重由权重函数给出。选择一条边和一个正数,并定义下述的权重函数:证明:仍然是的一棵最小生成树,这里的边权重由函数给出。如果要写代码,请用go语言。文心一言:首......
  • QT5 掌握debug调试的方法(简要内容:Memory查看内存地址的数值 和 查看变量值)(图文并茂)
    A1——选择构建模式(选项:debug调试、release发行、profile不知道…)A2——开始运行A3——开始调试(仅在debug调试模式下,断点调试助手才有效)A4——执行构建(生成输出目录及相应的文件,路径要求与工程的路径同级)A1——鼠标悬停变量名弹出,可固定窗口,Qt查看变量值的......
  • k8s中什么是内存请求,什么是内存限制,及其与QoS的关系
    在Kubernetes中,内存请求(MemoryRequest)和内存限制(MemoryLimit)是资源管理的两个关键概念,它们帮助确保Pod能够获得所需的资源,同时防止资源过度使用。以下是它们的定义和作用:内存请求(MemoryRequest)定义:内存请求是Pod启动时向Kubernetes集群请求的最小内存量。这是Pod......
  • 从内存层面分析Java 参数传递机制
    在Java中,理解参数传递机制对于编写高效和可维护的代码至关重要。本文将探讨基本数据类型和引用数据类型的参数传递方式,并介绍System.identityHashCode方法及其作用。我们将结合栈帧的概念,通过示例代码来详细解释这些机制。System.identityHashCode的作用System.ident......
  • C语言之动态内存分配与释放
    C语言之动态内存分配与释放通用指针类型void通用类型指针具有以下特点:类型无关,赋值灵活:由于指针本质上是一个存储内存地址的变量,而内存地址是没有类型的,所以void指针可以存储任意类型数据的地址,指向任意类型对象。无论是整数、浮点数、字符或数组、结构体等类型都可以用void指......