Linux性能优化之内存管理基础知识

张开发
2026/4/17 21:29:56 15 分钟阅读

分享文章

Linux性能优化之内存管理基础知识
写在前面本文看下Linux内存管理相关基础内容。1linux是如何管理的内存的我们平时所说的内存多大的内存指的是物理内存物理上就是一个内存条物理内存也叫主存现在的主存一般是动态随机访问内存即DRAM。但物理内存只有内核才有权限访问。为了解决这个问题定义了虚拟内存来给进程使用虚拟内存分为用户空间和内核空间两部分进程处于用户态时可以访问用户空间处于内核态时可以访问内核空间。虚拟空间的大小由字长一次能处理的数据量来决定常见的32和64位操作系统如下前面说了进程只能访问虚拟内存但是最终还是要访问到物理内存的因此在虚拟内存和物理内存之间需要增加一层映射这个映射叫做页表而页表是存储在CPU的内存管理单元MMU中的如下图MMU管理内存的单位是页页的大小是4k所以对于4G内存就会由100w个条目来维护映射关系显然数量还是蛮大的为了解决这个条目过多的问题引入了多级页表和大页多级页表是将内存分成块来处理块还有下级块构成一种树形的结构并且只有真正分配内存的区域才会真的定义块信息这样就解决了普通页表条目过多的问题。大页就是页更大一般是2M和1G一般用在会占用大内存的程序如Oracledpdk等。通过映射进程就可以使用到真正的物理内存了。虚拟内存空间还可以再进行细分其中主要是对于用户空间如下图每个部分存储了不同的内容如下了解即可只读段包括代码和常量等。 数据段包括全局变量等。 堆包括动态分配的内存从低地址开始向上增长。需要动态申请。 文件映射段包括动态库、共享内存等从高地址开始向下增长。需要动态申请。 栈包括局部变量和函数调用的上下文等。栈的大小是固定的一般是 8 MB。接着我们来看下内存的申请和回收。2应用程序如何申请和回收内存内存的申请通过c语言的malloc()函数完成对应到系统调用有brk()和mmap()两种方式其中前者用于申请小于128k的内存后者用于申请大于128k的内存。释放的话执行free(),unmap()即可。系统的物理内存是有限的肯定不能让进程无限制的申请所以当内存紧张时操作系统肯定要做些什么的主要如下几件事1:根据一定的算法回收内存如LRU 2使用swap回收不常使用内存 3使用OOM机制杀死占用了大量内存的进程弃车报帅。其中2swap就是交换分区是一种把磁盘当作内存来使用的机制其中将内存中的数据写到磁盘中叫做换出反之将磁盘中的数据写回到内存中叫做换入。看起来swap将系统的内存变大了但其实这只是一种在内存紧张时才会启用的紧急机制因为磁盘的访问速度远低于内存所以是会带来比较严重的性能问题。对于3linux定义了oom_score来标记一个进程使用内存的量值越大表示使用内存越多内存紧张时越容易被OOM KILL如下参看roothellohp:/proc# cat /proc/582988/oom_score 65即通过proc文件系统来查看内核的信息。命令中间的数字是进程号。另外我们也可以通过oom_adj来调节oom_score的值数值范围[-17,15]数值越小oom_score越低越不容易被OOM,-17代表不允许OOM KILL同样可以通proc文件系统查看进程oom_adj的值roothellohp:/proc# cat /proc/582988/oom_adj -163如何查看内存使用情况free命令查看系统的内存使用情况roothellohp:/proc# free total used free shared buff/cache available Mem: 3961340 1393332 813172 1760 2054468 2568008 Swap: 0 0 0第一行是物理内存的使用信息第二行是交换内存的使用信息每一列的含义如下total:总的内存大小 used:已经使用的内存大小包含共享 free:未使用内存不包含可回收 shared:共享内存 buff/cache:缓存缓冲区大小 available:未使用和可回收top查看进程内存信息roothellohp:/proc# free total used free shared buff/cache available Mem: 3961340 1393332 813172 1760 2054468 2568008 Swap: 0 0 0 roothellohp:/proc# top top - 09:34:28 up 7 days, 7:48, 5 users, load average: 0.42, 0.34, 0.30 Tasks: 255 total, 1 running, 254 sleeping, 0 stopped, 0 zombie %Cpu(s): 2.7 us, 2.4 sy, 0.0 ni, 94.6 id, 0.2 wa, 0.0 hi, 0.2 si, 0.0 st MiB Mem : 3868.5 total, 800.5 free, 1353.7 used, 2006.9 buff/cache MiB Swap: 0.0 total, 0.0 free, 0.0 used. 2514.8 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND 582988 root 20 0 1622064 377028 104812 S 9.3 9.5 202:51.60 kubelite ...相关列含义VIRT虚拟内存大小申请过的就算就算没有真正分配也算 RES常驻内存大小实际使用的物理内存大小但不包括swap和共享内存 SHR共享内存的大小 %MEM使用物理内存占总内存的百分比写在后面参考文章列表多知道一点TLB是什么MMU的高速缓存。什么是缺页异常当通过页表访问内存时不存在对应的物理内存信息时抛出的异常就是缺页异常发生该异常后会申请物理内存并更新页表信息。什么是伙伴系统伙伴系统是用来管理内存分配工作的一个系统。当执行malloc时就需要依赖于伙伴系统来完整真正的内存分配。slab分配器是干嘛用的管理小内存。

更多文章