系统主存存储应用程序和内核指令,包括它们的工作数据,以及文件系统缓存。其他需要考察的影响系统性能的因素包括分配和释放内存,复制内存,以及管理
内存地址空间映射的cpu开销。
7.1 术语
1.主存,物理内存
2.虚拟内存,一个抽象的主存概念,它几乎是无限和非竞争的。虚拟内存不是真实的内存。
3.常驻内存,当前处于主存中的内存
4.匿名内存,无文件系统位置或者路径名的内存。它包括进程地址空间的工作数据,称作堆。
5.地址空间,内存上下文。每个进程和内核都有对应的虚拟地址空间。
6.段,标记为特殊用途的一块内存区域,例如用来存储可执行或者可写的页。
7.OOM,内存耗尽,内核检测到可用内存低。
8.页,称作系统和cpu使用的内存单位。它一直以来是4kb或者8kb。
9.缺页,无效的内存访问。使用按需虚拟内存时,这是正常事件。
10.换页,在主存与存储设备间交换页
11.交换,源自unix,指将整个进程从主存转移到交换设备。Linux中交换指页面转移到交换设备。
12.交换空间,存放换页的匿名数据和交换进程的磁盘空间。它可以是存储设备的一块空间,也称为物理交换设备,或者是文件系统文件,称作交换文件。部分工具用交换
这个术语特指虚拟内存。
7.2 概念
7.2.1 虚拟内存
虚拟内存是一个抽象概念,它向每个进程和内核提供巨大的,线性的并且私有的地址空间。它简化了软件开发,把物理内存的分配交给操作系统管理。
进程的地址空间由虚拟内存子系统映射到主内存和物理内存交换设备。内核会按需在它们之间移动内存页,这个过程称作交换。
7.2.2 换页
换页是将页面换入和调出主存,它们分别称为页面换入和页面换出。他允许:
1.运行部分载入的程序
2.运行大于主存的程序
3.高效的在主存和设备间迁移
两种类型的换页:
1.文件系统换页
文件系统换页由读写位于内存中的映射文件印发。对于使用文件内存映射(mmap())的应用程序和使用了页缓存的文件系统,这是正常行为,也是好的换页。
2.匿名换页
匿名换页牵涉进程的私有数据:进程堆和栈。被称为匿名换页是由于它在操作系统中缺乏有名字的地址(例如,没有文件系统路径)。匿名换页换出要求迁移
数据到物理交换设备或者交换文件。linux 用交换(swapping)来命名这种类型的换页。
匿名换页拖累性能,因此被称为是坏的换页。当应用程序访问被调出的页时,会被读页的磁盘IO阻塞。这就是匿名换页,它给应用程序带来同步延时。
7.2.3 按需换页
支持按需换页的系统(必须支持)将虚拟内存按需映射到物理内存。当访问一个尚未从虚拟映射到物理内存的页时,会发生缺页。
如果整个映射可以由内存中的其他的页满足,这就被称作轻微缺页。
虚拟内存和按需换页的结果是任何虚拟内存可能出入如下的一个状态:
A.未分配
B.已分配,未映射(未填充并且未缺页)
C.已分配,已映射到主存(RAM)
D.已分配,已映射到物理交换空间(磁盘)
如果因为系统内存压力而换出页就会达到D状态。状态B到C的转换就是缺页。如果需要磁盘读写,就是严重缺页,否则就是轻微缺页。
从这几种状态出发,可以定义另外两种内存使用术语:
1.常驻集合大小(RSS):已分配的主存页(C)大小
2.虚拟内存大小:所有已分配的区域(B+C+D)
7.2.4 过度提交
linux支持过度提交这个概念,允许分配超过系统可以存储的内存---超过物理内存与交换的设备的总和。有了过度提交,应用程序提交的内存请求(如 malloc())会成功,
否则就失败。
7.2.5 交换
交换是主存与物理交换设备或交换文件之间移动整个进程。交换严重影响性能,因为已经换出的进程需要许多磁盘IO才能重新运行。
7.2.6 文件系统缓存占用
系统启动后内存的占用增加是正常的,因为操作系统会将可用内存用于文件系统缓存以提高性能。
7.2.7 使用率和饱和度
主内存的使用率可由已占用的内存除以总内存得出。
7.2.8 分配器
当虚拟内存处理多任务物理内存时,在虚拟地址空间中实际分配和内存对方通常由分配器来处理。用户态或者内核程序向程序员提高简单的内存使用接口(如 malloc(),free())。
7.2.9 字长
7.3 架构
7.3.1 硬件
内存硬件包括主存,总线,cpu缓存和MMU(内存管理单元)。
1.主存
目前常见的主存类型是动态随机存取内存(DRAM)。
2.延时
主内存的访问时间可以用CAS(列地址控制器)计量。
MMU:
负责虚拟到物理地址的转换。
7.3.2 软件
内测管理软件包括虚拟内存系统,地址转换,交换,换页和分配。
7.3.3 进程地址空间
内核级分配器---slab和 SLUB, 用户级分配器----libmalloc,libumem,mtmalloc。
7.4 方法
7.4.1 工具法
对于内存而言,应用工具可以检查如下指标:
1.页扫描
2.换页
3.vmstat
4.OOM终结者
5.交换
6.top/prstat
7.dtrace/stap/perf
7.4.2 USE 方法
1.使用率
2.饱和度
3.错误
7.4.3 使用特征归纳
7.4.4 周期分析
7.4.5 性能监测
关键的内存指标:
1.使用率,使用百分比,由可用内存推断
2.饱和度,换页,交换,oom终结者
7.4.6 泄漏检测
源自于:
1.内存泄露
2.内存增长
7.4.7 静态性能调优
7.4.8 资源控制
7.4.9 微基准测试
7.5 分析
7.5.1 vmstat
7.5.2 sar
7.5.3 slabtop
7.5.4 ::kmstat
7.5.5 ps
7.5.6 top
7.5.7 prstat
7.5.8 pmap
7.5.9 DTrace
7.5.10 SystemT
7.5.11 其他工具
7.6 调优
7.6.1 可调参数
7.6.2 多个页面大小
7.6.3 分配器
7.6.4 资源控制