linux内存管理
文章平均质量分 65
kaka__55
这个作者很懒,什么都没留下…
展开
-
page owner特性浅析
linux内核的page owner特性,参考文档,主要是用来Tracking about who allocated each page,方便定位内存泄漏、内存占用问题。原创 2022-07-02 21:55:41 · 1812 阅读 · 0 评论 -
hugetlbfs的写时复制
本文分析基于linux内核4.19.195最近想到了一个以前没有考虑过的问题:hugetlbfs大页遇到cow时,是怎么处理的?最开始的想法是,按照cow的原理,内核会重新申请一个大页,供父进程或子进程中第一个触发写操作的进程进行使用,但事实真的是如此吗?这么做的话,如果我们一开始往/sys/kernel/mm/hugepages/hugepages-xxxkB/nr_hugepages里写的值不够会怎么样?...原创 2022-06-26 18:06:18 · 169 阅读 · 0 评论 -
/proc/vmstat输出含义
/proc/vmstat输出含义原创 2022-06-11 17:27:30 · 3229 阅读 · 1 评论 -
ZONE_MOVABLE的理解
https://blog.csdn.net/rikeyone/article/details/86498298原创 2022-05-15 15:16:07 · 185 阅读 · 0 评论 -
linux上构建GFP_ZONE_TABLE
https://blog.csdn.net/qqqqqq999999/article/details/90045500转载 2022-05-09 17:10:47 · 162 阅读 · 0 评论 -
一个疑似percpu内存泄漏问题排查
本文代码基于linux 4.19.195继之前出现了业务运行一段时间后,从meminfo中看到slab占用的内存增加的问题后,最近同事又发现了业务运行一段时间,percpu这一项占用的内存增多的问题。根据同事提供的数据,未运行业务时,percpu占用140M内存,运行一段时间业务然后终止业务,从meminfo中看到percpu占用了460M的内存。percpu原理可以参考文献。因为是系统启动后运行一段时间业务,导致的percpu内存占用增加,我们重点关注动态percpu变量的申请和释放的过程。动态原创 2022-04-15 21:14:38 · 1500 阅读 · 0 评论 -
一个疑似slab泄漏问题排查
本文代码基于linux内核4.19.195.这周同事反馈一个疑似slab内存泄漏的问题,问题是这样的。同事在做业务升级测试,不断的升级24小时后发现,通过/proc/meminfo看到的slab内存占用比不跑升级测试的机器多了3.5G(整个系统只有8G内存),怀疑是slab内存泄漏了。找他要了一台不跑升级的机器和一台跑升级测试的机器对比着看,有如下发现:通过free命令查看,available确实少了2.6G通过/proc/meminfo对比查看,确实是slab相关的几行有着较大的变化,其他条目原创 2022-04-09 17:59:02 · 2992 阅读 · 0 评论 -
从hugetlbfs看NUMA mempolicy是如何影响内存分配的
周末在家闲来无事,研究一下mempolicy对内存页分配的影响。分析基于linux内核4.19.195.先看看内核里面支持什么内存分配策略:enum { MPOL_DEFAULT, //默认使用进程的policy;如果进程也设置了MPOL_DEFAULT,则使用系统默认policy(在CPU本地节点分配内存) MPOL_PREFERRED, //在内存分配时优先指定的节点,失败时从附近的内存节点上分配内存 MPOL_BIND, //强制在指定的节点上分配内存,即只能在nodemask指定的内存节点原创 2022-03-20 12:21:20 · 447 阅读 · 0 评论 -
逆向映射的使用场景
linux逆向映射使用场景原创 2022-01-03 17:36:50 · 252 阅读 · 0 评论 -
gfp_mask是0代表什么?
之前写的博客有一个遗留问题,find_get_page函数里指定了gfp_mask是0,这个0代表什么含义呢?内核的gfp.h文件里其实已经给出了答案:/* * GFP_ZONE_TABLE is a word size bitstring that is used for looking up the * zone to use given the lowest 4 bits of gfp_t. Entries are GFP_ZONES_SHIFT * bits long and there原创 2021-12-14 21:12:47 · 425 阅读 · 0 评论 -
linux页面迁移与用户态访问的并发处理
解决完上篇博客的问题后,随之而来的,又是一堆因好奇心引发的问题,其中,最让我好奇的是这个问题:内核的kcompactd线程在做页面迁移,刚好用户态的进程也在对该页面进行读写操作,这两个步骤是并行的,那么,内核是如何做好并发保护工作的?具体一点的说,就是内核如何保证,迁移前,用户态对该内存的读写是在迁移前的页,迁移后,用户态对该内存的读写是在迁移后的页,不会发生交叉的情况,也就是不会发生一部分写入的内容遗留在迁移前的页,而没有同步到迁移后的页。此问题可以扩展为一般类问题:内核线程对用户task的内存进行迁原创 2021-12-12 18:00:50 · 426 阅读 · 0 评论 -
谈谈对内存管理子系统的理解
内存管理子系统主要做两件事:管理虚拟地址和物理地址的映射;2. 管理物理内存的分配内存管理,可以分为两个阶段,启动阶段和启动完成后。在启动阶段,使用的是启动内存分配器,这个分配器功能有限,只能做一些简单的分配、回收任务。启动完成后,内存子系统的各个模块就启动起来了,包括伙伴系统、slab分配器、kswapd等等子模块都起来了,这些模块组成了整个内存管理子系统。上面是从阶段来看内存管理,从被管理的内存角度来看,内存管理还能够被分为虚拟内存管理以及物理内存管理。在有MMU的soc里,我们的代码一原创 2021-04-26 23:48:58 · 492 阅读 · 0 评论 -
Linux内存回收之LRU链表和第二次机会法
一 LRU回收算法LRU算法,假定最近最少使用的页,在较短的时间内页不会使用,所以这些页成为回收的候选者.内存回收的核心是围绕LRU链表来进行操作,Linux内核实现了5种LRU链表类型不活跃匿名页表链表(LRU_INACTIVE_ANON)//shmem活跃匿名页表链表(LRU_ACTIVE_ANON)//不活跃文件映射页表链表(LRU_INACTIVE_FILE)活跃文件映射页表链表(LRU_ACTIVE_FILE)不可回收页表链表(LRU_UNEVICTA转载 2021-04-24 22:40:24 · 711 阅读 · 0 评论 -
谈谈自己对内存回收的理解
内存回收,是内核在内存不足的情况下,一种释放内存的方法,在4.4.198内核里,主要有两个函数涉及内存回收,一个是kswapd,一个是drop_cache;先说说kswapd,这是一个内核线程,每个内存节点都有一个这样的内核线程,名字是kswapd%d;在alloc_page函数中用低水位分配内存失败后,进入慢速路径的第一件事情static inline struct page *__alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,原创 2021-04-24 11:42:03 · 616 阅读 · 0 评论 -
linux内存管理子系统里的各种算法设计的初衷是什么?
首先说一下写这篇博文的初衷:我对linux的学习,是不是都过度的专注于各个模块的实现,而忘记了其背后的设计初衷呢?以下观点纯属作者个人观点,如果有写的不对的地方请指出。**伙伴算法的初衷:**为了兼顾内存分配效率以及减少外部碎片而设计出来的一种分配算法。百度百科对伙伴算法的定义:计算机算法的一种,是为了核心内存管理能够快速响应请求,尽可能地在提高内存利用率的同时减少内存碎片的一种算法。**slab算法的初衷:**为了不同大小的对象而设计的一个分配算法,并兼顾效率以及碎片化程度。另外,SLUB分配器原创 2021-04-11 18:35:57 · 135 阅读 · 0 评论 -
linux内核page结构体的PG_referenced和PG_active标志
linux内核使用了lru算法来置换内存页面,但是实际上并不是纯的lru算法,里面掺杂了很多别的思想,比如第二次机会,比如双时钟指针等等。这里着重说一下第二次机会的体现。在内核中有一个mark_page_accessed函数,它实际上体现一个状态机,这是它的实现:if (!PageActive(page) && PageReferenced(page) && PageLRU(page)) { activate_page(pa转载 2021-04-03 10:10:49 · 413 阅读 · 0 评论 -
低版本内核与高版本内核__zone_watermark_ok函数的变化
机缘巧合,最近研究了一下linux内核__zone_watermark_ok函数,发现高版本(4.4)和低版本3.14之前有所区别,特此记录一下。先上3.14版本的代码/* * Return true if free pages are above 'mark'. This takes into account the order * of the allocation. */static bool __zone_watermark_ok(struct zone *z, unsigned int原创 2020-11-22 16:58:37 · 438 阅读 · 2 评论