性能相关,内存
内存架构
32 位架构的机器上,Linux 内核只能直接映射第一个 GB 的的物理内存(896M,因为还要考虑 到保留的空间)。在此上的内存被称作 ZONENORMAL,这部分空间必须映射到最下面的 1GB。这种映射对应用程序是完全透明的,但是分配内存页到 ZONEHIGHMEM 会造成一点 点性能损耗。
虚拟内存寻址布局
虚拟内存管理器
kswapd 是用于回收内存页面的,之前一直误解是用于交换分区的
虚拟内存管理器默认配置把所有的可用空闲内存空间作为磁盘缓存
伙伴系统(Buddy system)
Linux 内核使用名为伙伴系统(Buddy system)的机制维护空闲页,伙伴系统维护空闲页面, 并且尝试给发来页面申请的进程分配页面,它还努力保持内存区域是连续的。
可以在/proc/buddyinfo 文件看到伙伴系统的信息。
页帧回收
kswapd 内核线程和 trytofree_page()内核函数负责页面回收
kswapd 通常在 task interruptible 状态下休眠,当一个区域中的空闲页低于阈值的时候,它就会 被伙伴系统唤醒。它基于最近最少使用原则(LRU,Least Recently Used)在活动页中寻找 可回收的页面。
。它使用活动列表和非活动列表来维护候选 页面。kswapd 扫描活动列表,检查页面的近期使用情况,近期没有使用的页面被放入非活动 列表中
kswapd 还要遵循另外一个原则。页面主要有两种用途:页面缓存(page cahe)和进程地址空间 (process address space)。页面缓存是指映射到磁盘文件的页面;进程地址空间的页面(又 叫做匿名内存,因为不是任何文件的映射,也没有名字)使用来做堆栈使用
在回收内存时,kswapd 更偏向于回收页面缓存
Page out 和 swap out:“page out”和“swap out”很容易混淆。“page out”意思是把一些页面 (整个地址空间的一部分)交换到 swap;"swap out"意味着把所有的地址空间交换到 swap
swap
在发生页面回收时,属于进程地址空间的处于非活动列表的候选页面会发生 page out
在 Linux 中,如果虚拟内存管理器意识到内存页已 经分配了,但是已经很久没有使用,它就把内存页移动到 swap 空间
评论