内存管理
文章平均质量分 81
Blue summer
这个作者很懒,什么都没留下…
展开
-
SLUB缓存管理
注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.21、关于SLUB目前大多数系统都不使用slab作为缓存的管理模式,转而使用slub,比如CentOS 7和8默认都是使用slub管理器。slub是基于slab的进一步优化改进,slub保留了slab的API接口函数,保证了对slab的兼容和无缝迁移。slub与slab的主要差异有以下几点,每CPU变量不再保存对象,而是保存slab缓冲区精简每node结点的三个链表,只保留部分空slab链表取消每原创 2021-06-21 22:57:39 · 271 阅读 · 0 评论 -
物理地址、线性地址、虚拟地址和逻辑地址以及页表
https://www.cnblogs.com/diyingyun/archive/2012/01/03/2311327.html原创 2021-06-04 22:34:00 · 2779 阅读 · 0 评论 -
块缓冲区和缓冲区首部buffer_head
注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.21 buffer_head2 struct buffer_head主要成员变量在这里插入代码片3 创建buffer_head4 删除buffer_head5 结构关系原创 2021-05-20 08:48:19 · 1599 阅读 · 0 评论 -
页缓存page cache和地址空间address_space
注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.21 page cachepage cache用于在内存中缓存磁盘文件,几乎所有文件的读写都依赖于page cache,除非使用直接IO的方式。它是文件系统cache中占比最大的部分,也是对文件系统读写性能提升最大的部分,而地址空间address_space则是page cache的核心管理结构。2 struct address_space主要成员变量struct address_space { s原创 2021-05-03 18:19:03 · 1666 阅读 · 0 评论 -
vm内核参数之swap分区使用控制swappiness
注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.2原创 2021-03-07 22:43:01 · 1328 阅读 · 1 评论 -
kswapd进程工作原理(四)——总结
注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.2kswapd进程工作原理(一)——初始化及触发kswapd进程工作原理(二)——回收内存上半部kswapd进程工作原理(三)——回收LRU链表关于kswapd进程,我们通过之前这三篇文章分析了它的具体工作原理,现在就做一个简单的梳理,从大框架去回顾下。kswapd_init---------------------------------kswapd进程初始化 kswapd_run------原创 2021-03-06 22:07:47 · 1335 阅读 · 0 评论 -
kswapd进程工作原理(三)——回收LRU链表
注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.2在上篇文章——kswapd进程工作原理(二)——回收内存上半部中,我们分析了kswapd进程的具体回收过程,今天我们再继续往下,看看kswapd是如何回收LRU链表。1 shrink_list主要流程:如果操作的是活动LRU链表,需要满足非活动LRU链表中页面过少,才会回收活动链表如果操作的是活动LRU链表,直接开始回收static unsigned long shrink_list(enu原创 2021-03-06 20:42:47 · 895 阅读 · 0 评论 -
kswapd进程工作原理(二)——回收内存上半部
注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.2在上篇文章——kswapd进程工作原理(一)中,我们分析了kswapd进程的初始化以及触发场景,那kswap到底是怎么回收内存,回收哪些内存呢,我们来看下kswap进程实体。1 kswapd主要流程:标识自己为kswap进程,并进行一些初始化尝试睡眠,有可能kswap是被意外唤醒如果kswap确实需要工作,调用balance_pgdat开始回收内存static int kswapd(voi原创 2021-03-02 23:05:14 · 2676 阅读 · 2 评论 -
kswapd进程工作原理(一)——初始化及触发
[root@localhost ~]# numactl -Havailable: 2 nodes (0-1)node 0 cpus: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23node 0 size: 32689 MBnode 0 free: 593 MBnode 1 cpus: 8 9 10 11 12 13 14 15 24 25 26 27 28...原创 2021-02-28 21:16:36 · 5400 阅读 · 0 评论 -
LRU链表及LRU缓存
注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.21、 关于LRU2、系统存在的LRU链表#define LRU_BASE 0#define LRU_ACTIVE 1#define LRU_FILE 2enum lru_list { LRU_INACTIVE_ANON = LRU_BASE, LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE, LRU_INACTIVE_FILE = LRU_BASE + L原创 2021-01-11 22:07:02 · 2441 阅读 · 0 评论 -
内存管理之内存节点Node、Zone、Page
注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.21、NodeNode是内存管理最顶层的结构,在NUMA架构下,CPU平均划分为多个Node,每个Node有自己的内存控制器及内存插槽。CPU访问自己Node上的内存时速度快,而访问其他CPU所关联Node的内存的速度比较慢。而UMA则被当做只有一个Node的NUMA系统。内核中使用struct pglist_data来描述一个Node节点,我们看下主要的一些变量,/* * On NUMA mach原创 2020-11-28 18:58:23 · 1915 阅读 · 0 评论 -
SLAB缓存管理之缓存回收cache_reap
注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.21、背景slab缓存使用需要从buddy system中获取页框并初始化为slab对象提供给进程使用,进程使用结束后,这些对象就会堆积在每个CPU和Node节点上,虽然没有进程在使用,但是其他进程也无法使用,因此需要有进程去回收这些不再使用的slab缓存。回收可分为被动回收和主动回收,被动回收指系统内存不足时,触发当前需要使用内存的进程阻塞的去释放空闲内存;而主动回收是有进程每个一段时间就去回收,今天原创 2020-10-05 19:59:05 · 1439 阅读 · 0 评论 -
vm内核参数之缓存回收vfs_cache_pressure
注:本文分析基于3.10.0-693.el7内核版本,即CentOS 7.41、背景在上篇文章中,我们知道在使用drop_caches接口释放内存时,drop_slab中会调用各个slab管理区的shrink函数释放空闲内存。在实际释放前会先计算可释放的空闲slab缓存数量,这个计算在针对超级块以及mbcache时会受vfs_cache_pressure参数控制。2、super block shrink文件系统在初始化时会调用alloc_super分配超级块,此时就会设置超级块的shrink函数,为原创 2020-10-05 17:39:45 · 7716 阅读 · 0 评论 -
SLAB缓存管理之创建使用
注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.21、关于slabslab本身就是缓存,伙伴系统以页作为管理单位,对小内存块不友好,浪费严重,从而出现slab,将不规则的各个内存块分门别类,进程需要使用时直接在对应slab管理区获取,不用再从伙伴系统中获取和初始化,提高效率的同时也减少内存碎片。2、创建slab管理结构只要是有经常申请释放相同大小内存的场景小,都可以创建自己的slab管理区,slab的创建通过kmem_cache_create_us原创 2020-10-04 22:55:41 · 1061 阅读 · 0 评论 -
SLAB缓存管理各结构关系
注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.21、SLAB管理结构kmem_cache每个slab缓存由kmem_cache结构的一个实例表示,我们对它常用的成员,以及各个成员的关系做一个说明和梳理。struct kmem_cache { //本地高速缓存,每CPU结构,对象释放时,优先放入这个本地CPU高速缓存中 struct array_cache __percpu *cpu_cache; //本地高速缓存预留数量,控制一原创 2020-10-04 22:48:45 · 1185 阅读 · 0 评论 -
vm内核参数之缓存回收drop_caches
https://www.cnblogs.com/10087622blog/p/8919384.html原创 2020-09-22 19:57:02 · 11792 阅读 · 0 评论 -
BDI各个结构体关系
BDI各个结构体关系每块磁盘对应着一个BDI设备,用struct backing_dev_info表示系统上所有BDI设备通过struct list_head bdi_list;链表串在一起一个BDI设备对应一个struct bdi_writeback结构,存放该设备需要处理的脏页及脏页回写函数struct delayed_work定义了一个延迟任务,其处理函数也就是脏页回写函数,bdi_writeback_workfnstruct list_head b_dirty存放该BDI所有dirty原创 2020-08-16 17:15:14 · 1210 阅读 · 3 评论 -
vm内核参数之内存脏页dirty_background_bytes和dirty_bytes
内存脏页dirty_background_bytes和dirty_bytes原创 2020-08-13 23:01:00 · 4649 阅读 · 2 评论 -
vm内核参数之内存脏页dirty_writeback_centisecs和dirty_expire_centisecs
注:本文分析基于3.10.0-693.el7内核版本,即CentOS 7.41、背景在《BDI writeback脏页回写》中我们了解了BDI的一些基本结构以及初始化和一些触发路径,现在我们要更深入了解下脏页的writeback,一个是脏页什么时候会被处理,另一个是多久会触发脏页的writeback。2、脏页形成路径脏页由写操作引入,毕竟读操作不会引起数据的不一致性。不管应用层以什么方式将数据变脏,最终都会调用__mark_inode_dirty将inode标记dirty。而调用__mark_ino原创 2020-08-08 16:41:46 · 8114 阅读 · 0 评论 -
BDI writeback脏页回写
http://blog.chinaunix.net/uid-9543173-id-3568434.html原创 2020-07-21 22:40:57 · 1816 阅读 · 0 评论 -
vm内核参数之内存水位min_free_kbytes和保留内存lowmem_reserve_ratio
1、zone内存水位值系统内存的每个node上都有不同的zone,每个zone的内存都有对应的水位线,当内存使用达到某个阈值时就会触发相应动作,比如直接回收内存,或者启动kswap进行回收内存。我们可以通过查看/proc/zoneinfo来确认每个zone的min、low、high水位值。[root@centos7 ~]# cat /proc/zoneinfo | grep -E "Node|...原创 2020-04-06 11:41:32 · 6435 阅读 · 0 评论 -
vm内核参数之内存整理compact_memory和extfrag_threshold
只有在启用了CONFIG_COMPACTION选项才有效。当向该文件(/proc/sys/vm/compact_memory)写入1时,所有的内存域都会被压缩,使空闲的内存尽可能形成连续的内存块。...原创 2020-04-01 21:39:00 · 5143 阅读 · 0 评论 -
vm内核参数之虚拟内存申请overcommit
1、涉及参数/proc/sys/vm/下admin_reserve_kbytesuser_reserve_kbytesovercommit_memoryovercommit_kbytesovercommit_ratio2、具体作用首先是admin_reserve_kbytes,内核里涉及该参数的地方有三个函数,一个是__vm_enough_memory(),在内存分配路径上...原创 2020-03-07 22:45:48 · 995 阅读 · 0 评论 -
内存页类型
文件页内存回收,也就是系统释放掉可以回收的内存,比如缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File-backed Page)。大部分文件页,都可以直接回收,以后有需要时,再从磁盘重新读取就可以了。脏页那些被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页),就得先写入磁盘,然后才能进行内存释放。这些脏页,一般可以通过两种方式写入磁盘。可以在应用程序中,通...原创 2020-02-10 23:21:59 · 747 阅读 · 0 评论 -
Linux各层级内存管理
1、NUMA(Non-Uniform Memory Access) 非一致内存访问该模型假定给定CPU对不同内存的单元访问时间不一样。NUMA架构下,CPU平均划分为多个Node,每个Node有自己的内存控制器及内存插槽。CPU访问自己Node上的内存时速度快,而访问其他CPU所关联Node的内存的速度比较慢。通过以下方式查看NUMA系统信息,[root@localhost ~]# numa...转载 2019-12-25 14:15:07 · 644 阅读 · 0 评论