性能之巅:洞悉系统、企业与云计算——内存


系统主存存储应用程序和内核指令,包括它们的工作数据,以及文件系统缓存。许多系统中,存放这些数据的二级存储是的主要的存储设备——磁盘——它的处理速度比内存低几个数量级。一旦主存填满,系统可能会在主存和这些存储设备间交互数据。这是一个缓慢的过程,它常常成为系统瓶颈,严重影响性能。系统也有可能终止内存占用量最多的进程。

其他需要考察的影响系统性能的因素包括分配和释放内存、复制内存,已经管理内存地址空间映射的CPU开销。对于多路处理器架构的系统,由于连接到本地CPU的内存相对于远程CPU访问延时更低,内存本地性也是一个影响因素。

术语

  • 主存:也称为物理内存,描述了计算机的高速数据存储区域,通常是动态随机访问内存(DRAM)
  • 虚拟内存:一个抽象的主存概念,它(几乎是)无限的和非竞争性的。虚拟内存不是真实的内存。
  • 常驻内存:当前处于主存中的内存。
  • 匿名内存:无文件系统位置或者路径名的内存。它包括进程地址空间的工作数据,称作堆。
  • 地址空间:内存上下文。每个进程和内核都有对应的虚拟地址空间。
  • :标记为特殊用途的一块内存区域,例如用来存储可执行或者可写的页。
  • OOM:内存耗尽,内核检测到可用内存低。
  • :操作系统和CPU使用的内存单位。它一直以来是4KB或者8KB。现代的处理器允许多种页大小以支持更大的页面尺寸。
  • 缺页:无效的内存访问。使用虚拟内存时,正是正常事件。
  • 换页:在主存与存储设备间交换页。
  • 交换:源自UNIX,指将整个进程从主存转移到交换设备。Linux中交换指页面转移到交换设备(迁移交换页)。即转移整个进程。
  • 交换(空间):存放换页的匿名数据和交换进程的磁盘空间。它可以是存储设备的一块空间,也称为物理交换设备,或者是文件系统文件,称作是交换文件。部分工作用交换这个术语特指虚拟内存(这其实是不正确的)。

概念

虚拟内存

虚拟内存是一个抽象概念,它向每个进程和内核提供巨大的、线性的并且私有的地址空间。它简化了软件开发,把物理内存的分配交给操作系统管理。它也支持多任务,因为虚拟地址空间被设计成分离的,并且可以超额订购,即使用中的内存可以超出主内存的容量。

下图揭示了虚拟内存在一个进程中扮演的角色,该系统带有交换设备(二级存储)。这里描绘了其中一个内存页,因为大多数虚拟内存是以页的方式实现的。
在这里插入图片描述
进程的地址空间由虚拟内存子系统映射到主内存和物理交换设备。内核会按需在它们之间移动内存页,这个过程称作交换。它允许内核超额订购主内存。

Linux可以配置成同样的行为模式,也可以是其他的行为,包括不对内存分配做限制。该行为被称作过度提交,它们是实现过渡提交的必要条件。

换页

换页是将页面换入和调出主存,它们分别被称为页面换入和页面换出。它允许:

  • 运行部分载入的程序
  • 运行大于主存的程序
  • 高效地在主存和存储设备间迁移

这些功能今天仍然有效。与交换出整个程序不同,由于页的尺寸相对较小(如4B),换页是精确管理和释放主存的手段。

虚拟内存换页(交换虚拟内存),并从此成为标准。

加上后来的共享文件系统页的页缓存,产生了两种类型的换页:文件系统换页和匿名页。

文件系统换页

文件系统换页由读写位于内存中的映射文件页引发。对于使用文件内存映射(mmap())的应用程序和使用了页缓存的文件系统,这是正常的行为。这也被称作“好的”换页。

有需要时,内核可以调出一下页释放内存。这时说法变得有些复杂:如果一个文件系统页在主存中修改过(“脏的”),页面换出要求将该页写回磁盘。相反,如果文件系统页没有修改过(“干净的”),因为磁盘已经存在一份副本,页面换出仅仅释放这些内存以便立即重用。因为术语页面换出指一个页被移除内存——这可能包括或者不包括写入一个存储设备。

匿名换页

匿名换页牵涉进程的私有数据:进程堆和栈。被称为匿名是由于它在操作系统中缺乏有名字的地址。匿名页面换出要求迁移数据到物理交换设备或者交换文件。Linux用交换(swapping)来命令这种类型的换页。

匿名换页拖累性能,因此被称为“坏的”换页。当应用程序访问被调出的页时,会被读页的磁盘I/O 阻塞。这就是匿名页面换入,它给应用程序带来同步延时。匿名页面换出可能不会直接影响应用程序性能,因为它由内核异步执行。

性能在没有匿名换页(或者交换)的情况下处于最佳状态。要做到这一点,可以通过配置应用程序常驻于内存并且监控页面扫描、内存使用率和匿名换页,来确保不存在内存短缺的迹象。

按需换页

如下图所示,支持按需换页的操作系统(必须支持)将虚拟内存按需映射到物理内存。这会把CPU创建映射的开销推迟到实际需要或访问时,而不是在初次分配这部分内存时。

下图展示的序列从写入一个新分配的虚拟内存页开发,这导致对物理内存的按需映射。当访问一个尚未从虚拟映射到物理内存页时,会发送缺页。
在这里插入图片描述
如果是一个包含数据但尚未映射到这个进程地址空间的映射文件时,第一步有可能是读。

如果这个映射可以由内存中其他的页满足,这被称作轻微缺页。它可能在进程内存增长过程中发生,从可用内存中映射一个新的页(如上图所示);它也可能在映射到另一个存在的页时发生,例如从共享库中读一个页。

需要访问存储设备的缺页,例如访问未缓存映射到内存的文件(未在图中显示),被称作严重缺页。

虚拟内存和按需换页的结果是任何虚拟内存页可能处于如下的一个状态:

  • A. 未分配
  • B. 已分配,未映射(未填充并且缺页)
  • C. 已分配,已映射到主存(RAM)
  • D. 已分配,已映射到物理交换空间(磁盘)

如果因为系统内存压力而换出页就会到底D状态。状态B到C的转变就是缺页。如果需要磁盘读写,就是严重缺页,否则就是轻微缺页。

从这几种状态出发,可以定义另外两种内存使用术语:

  • 常驻集合大小(RSS):已分配的主存页(C)大小
  • 虚拟内存大小:所有已分配的区域(B+C+D)

按需换页与虚拟内存换页一起由BSD引入UNIX。

过度提交

Linux 支持过度提交这个概念,允许分配超过系统可以存储的内存——超过物理内存与交换的设备总和。它依赖于按需换页以及应用程序通常不会使用分配给它们的大部分内存。

有了过度提交,应用程序提交的内存请求(例如 malloc())会成功,否则会失败。应用程序开发人员能够慷慨地分配内存并按需稀疏使用,而不是谨慎地分配内存以控制在虚拟内存的限额内。

交换

交换是在主存与物理交换设备或者交换文件之间移动整个进程。这是UNIX独创的管理主存的技术,并且是交互这个术语的词源。

交换出一个进程,要求进程的所有私有数据必须被写入交换设备,包括线程结构和进程堆(匿名数据)。源于文件系统而且没有修改的数据可以被丢弃,需要的时候再从原来的位置读取。

因为进程的一小部分员数据总是常驻于内核内存总,内核扔能知道已交换出的进程。至于要将哪个进程交换回来,内核会考虑线程优先级、磁盘等待时间以及进程的大小。长期等待和较小的进程享有更高的优先级。

交换严重影响性能,因为已经交换出的进程需要许多磁盘I/O才能重新运行。

文件系统缓存占用

系统启动之后内存的占用增加是正常的,因为操作系统会将可用内存用于文件系统缓存以提高性能。该原则是:如果有可用的主内存,就有效地使用它。初级用户有时看到启动后可用内存减少到接近零,可能会感到苦恼,但这不会对应用程序造成影响,因为在应用程序需要的时候,内核应该能够很快从文件系统缓存中释放内存。

使用率饱和度

主内存的使用率可由已占用的内存除以总内存得出。文件系统缓存占用的内存可当作未使用,因为它可以被应用程序重用。

对内存的需求超过了主存的情况被称作主存饱和。这时操作系统会使用换页、交换或者在Linux中用OOM终结者来释放内存。

如果系统对允许分配的最大虚拟内存做了限制(Linux过度提交不做限制),可以研究容量使用率。这种情况下,一旦虚拟内存耗尽,内核内存分配就会失败。

分配器

当虚拟内存处理多任务物理内存时,在虚拟地址空间中实际分配和内存堆放通常由分配器来处理。用户态库或者内核程序向程序员提供简单的内存使用接口。

分配器对性能有显著的影响,一个系统通常会提供多个可选择的用户态分配器库。分配器可以利用包括线程级别对象缓存在内的技术以提高性能,但是如果分配变碎并且损耗变高,它们也会损害性能。

字长

处理器可能会支持多种字长,例如32位和64位,这样两种应用程序可以运行。地址空间受限于字长的寻找空间,因此32位的地址空间放不下需要 4GB以上的应用程序,必须用64位或者更大的字长来编译。

利用更大的字长有可能提升内存性能,具体取决于CPU架构。当一个数据类型在更长的字长下有未使用的位时,可能会浪费一小部分内存。

架构

硬件

内存硬件包括主存、总线、CPU缓存和MMU(内存管理单元)

主存

常见的主存类型是动态随机存取内存(DRAM)。这是一种易失性的内存——它存储的内容在断电时会丢失。由于每个比特仅由两个逻辑零件组成:一个电容和一个晶体管,DRAM能提供高容量的存储。其中电容需要定期更新以保持其电荷。

按不同用途,企业服务器会配置不同容量的DRAM。典型为1GB ~ 1TB甚至更大。相比下,云计算中的个体机器的内存就显得小得多,它们的内存通常介于512MB ~ 64GB。然而云计算设计的初衷在于在实例池中分散其负载,作为整体它们可以向一个分布式的应用程序提供更多的在线内存,即便保持一致性的代价是否高昂。

延时

主内存的访问时间可以用CAS(列地址控制器)计量:从发送需要读取的地址(列)给一个内存模块,到数据可以被读取之间的时间。这个数组取决于内存的类型(DDR3大约是10ns)。对于内存 I/O 传输,内存总线为了传输一个缓存行会发生多次此类延时。CPU和MMU读取新数据时也可能涉及其他延时。

主存架构

下图展示了一个普通双处理器均匀仿存模型(UMA)系统的主存架构。
在这里插入图片描述
通过共享系统总线,每个CPU访问所有内存都有均匀的访存延时。如果上面运行的是单个操作系统实例并可以在所有处理器上统一运行时,又称为对称多处理器架构(SMP)。

作为对照,下图展示了一个双处理器非均匀访存模型(NUMA)系统,其中使用的一个CPU互联是内存架构的一部分。在这种架构中,对主存的访问时间随着相对CPU的位置不同而变化。
在这里插入图片描述
CPU1 可以通过它的内存总线直接对DRAM A发起 I/O 操作,这被称为本地内存。CPU1 通过 CPU2 以及CPU互联(两跳)对DRAM B发起 I/O操作,这被称为远程内存而访问延时更高。

连接到每个CPU的内存组被称为内存节点,或者仅仅是节点。基于处理器提供的信息,操作系统能了解内存节点的拓补。这使得它可以根据内存本地性分配和调度线程,尽可能倾向于本地内存以提高性能。

总线

物理上主存如何连接系统取决于主存架构。实际的实现可能会涉及额外的CPU与内存之间的控制器和总线。可能访问的方式如下:

  • 共享系统总线:单个或多个处理器,通过一个共享的系统总线、一个内存桥控制器以及内存总线。
  • 直连:单个处理器通过内存总线直接连接内存。
  • 互联:多处理器中的每一个通过一条内存总线与各自的内存直连,并且处理器之间通过一个CPU互联起来。

多通道

系统架构可能支持并行使用多个内存总线来增加宽度。常见的倍数为双、三或者四通道。

CPU缓存

处理器通常会在芯片中包含硬件缓存以提高内存访问性能。这些缓存可能包括如下级别,速度递减和大小递增:

  • L1:通常分为指令缓存和数据缓存
  • L2:同时缓存指令和数据
  • L3:更大一级的缓存

一级缓存通常按虚拟内存地址空间寻址,二级以上按物理内存地址寻址,具体取决于处理器。

MMU

内存管理单元(MMU)负责虚拟到物理地址的转换,而页内的偏移量则直接映射。下图描绘了通用的MMU,以及各级CPU缓存和主内存。
在这里插入图片描述

多种页大小

现代处理器支持多种页大小,允许操作系统和MMU使用不同的页大小,如4KB、2MB、1GB。Linux支持超大页。为特别的大页尺寸,如2MB,留出部分物理内存。

TLB

MMU使用TLB作为第一级地址转换成,紧随其后的是主存中的页表。TBL可以被进一步分为指令和数据页缓存。

由于TLB映射记录数量有限制,使用更大的页可以增加从其缓存转换的内存范围(它的触及范围),从而减少了TLB未命中而提高系统性能。TLB能进一步按每个不同页大小分设单独的缓存,以提高在缓存中保留更大范围映射的可能性。

TLB的实际构成取决于处理器类型。

软件

内存管理软件包括虚拟内存系统、地址转换、交换、换页和分配。与性能密切相关的内存包括这些部分:内存释放、空闲链表、页扫描、交换、进程地址空间和内存分配器。

内存释放

系统中的可用内存过低时,内核有多种方法释放内存,并添加到页空闲链表中。下图描绘了可用内存降低时这些方法通常的调用次序。
在这里插入图片描述
这些方法如下:

  • 空闲链表:一个未使用的页列表(也称为空闲内存),它能立刻用于分配。通常的实现是多个空闲页链表,每个本地组(NUMA)一个。
  • 回收:内存低于某个阀值,内核模块和内核分配器会立刻释放任何可以轻易释放的内存。这也称为收缩。

Linux中,具体的方法如下:

  • 页缓存:文件系统缓存。一个称作交换倾向的可调参数能调节系统倾向性,决定是通过换页还是交换来释放内存。
  • 交换:页面换出守护进程(kswapd)执行的换页。它找出最近不使用的页并加入到空闲链表,其中包括应用程序内存。页面换出涉及写入文件系统或者一个交换设备,仅在配置了交换文件或设备时才可用。
  • OOM 终结者:内存耗尽终结者搜索并杀死可牺牲的进程以释放内存,采用select_band_process() 搜索而后用oom_kill_process() 杀死进程。在系统日志(/var/log/messages)中以”Out of memory:Kill process“ 表现。

假设应用程序故障导致内存无限增长。如果使用交换,这很可能会由于换页首先成为一个性能问题,同时这也是在线排查问题的机会。不存在交换的话,就不存在换页的宽限期。结果是应用程序遇到”Out of memory“ 错误,或者OOM终结者结束这个应用程序。如果它允许数小时后才观察到,这可能会耽误问题的排错。

空闲链表

最初的UNIX内存分配器使用内存映射和首次匹配扫码。BSD引入虚拟内存换页时,空闲链表和页面换出守护进程也被同时引入。如下图所示,空闲链表能立刻定位可用内存。
在这里插入图片描述
释放的内存添加到表头以变将来分配。通过页面换出守护进程释放的内存——它可能包含有价值的文件系统页缓存——被加到表尾。如果未被重用前有对任一页的请求,它能被取回并从空闲链表中移除。

Linux用伙伴分配器管理页。它以 2 的幂的方式向不同尺寸的内存分配器提供多个空闲链表。术语伙伴指找到相邻的空闲内存页以被同时分配。

伙伴空闲链表处于如下等级结构的底端。起始于每个内存节点pg_data_t。

  • 节点:内存库,支持NUMA。
  • 区域:特定用途的内存区域(直接内存访问(DMA)、普通、高位内存)。
  • 迁移类型:不可一定,可回收,可移动…
  • 尺寸:数量为 2 的幂次方的页面。

回收

回收大多是从内核的slab分配器缓存释放内存。这些缓存包含slab大小的未使用内存块,以供重用、回收将这些内存交还给系统进行分配。

在Linux中,内核模块也可以调用register_shrinker() 以注册特定的函数回收自己的内存。

页扫描

内核页面换出守护进程管理利用换页是否内存。当主存中可用的空闲链表低于阀值时,页面换出守护进程会开始页扫描。

Linux 页面换出守护进程被称为kswapd(),它扫描非活动和活动内存的LRU(最近最少被使用)页列表以释放页面。如下图所示,它的激活基于空闲内存和两个提供滞后的阀值。
在这里插入图片描述
一旦空闲内存达到最低阀值,kswapd运行于同步模式,按需求释放内存页(内核排除在外)。该最低阀值是可调的(vm.min_free_kbytes),并且其他阀值基于它按比例放大。

页缓存的活动页和非活动页分别设有列表。这些列表按LRU方式工作,因而kswapd能快速找到空闲页,如下图所示。
在这里插入图片描述

进程地址空间

进程地址空间是一段范围的虚拟页,由硬件和软件同时管理,按需映射到物理页。这些地址被划分为段以存放线程栈、进程可执行(文件)、库和堆。

应用程序可执行段包括分离的文本和数据段。库也由分离的可执行文本和数据段组成。这些不同的段类型如下:

  • 可执行文本:包括可执行的进程CPU指令。由文件系统中的二进制应用程序文本段映射而来。它是只读的并带有执行权限。
  • 可执行数据:包括已初始化的变量,由二进制应用程序的数据段映射而来。有读写权限,因此这些变量在应用程序的运行过程中可以被修改。它也带有私有标记,因此这些修改不会被写回磁盘。
  • :应用程序的临时工作内存并且匿名内存(无文件系统位置)。它按需增长并且用mollac() 分配。
  • :运行中的线程栈,映射为读写。

堆增长

不停增长的堆通常会引起困惑。它是内存泄露吗?对于大多数分配器,free() 不会将内存还给操作系统,相反的,会保留它们以备将来分配。这意味着进程的常驻内存只会增长,并且是正常现象。进程缩减内存的方法如下:

  • Re-exec:从空的地址空间调用exec() 。
  • 内存映射:使用mmap() 和 munmap(),它们会归还内存到系统。

分配器

多种用户级和内核级的分配器可用于内存分配。下图展示了分配器的作用,包括一些常见的类型。
在这里插入图片描述
内存分配器的特征如下:

  • 简单 API:如malloc()、free()。
  • 高效的内存使用:处理多种不同大小的内存分配时,当存在许多浪费内存的未使用区域时,内存使用可能会变得碎片化。分配器会尽可能合并未使用的区域,因此大块的分配使得它们提供效率。
  • 性能:内存分配会很频繁,而且在多线程的环境里它们会因为竞争同步基源而表现糟糕。分配器可设计为慎用锁,并利用线程级或者 CPU 级的缓存以提高内存本地性。
  • 可观测性:分配器可能会提供统计数据和排错模式以显示如何被调用,以及调用分配的代码路径。

方法

内存分析和调用的多种方法及运行。下表总结了这些内容:

方法类型
工具法观测分析
USE法观测分析
使用特征观测分析,容量规划
周期分析观测分析
性能监测观测分析,容量规划
性能监测观测分析,容量规划
发现泄露观测分析
静态性能调优观测分析,容量规划
资源控制调优
微基准测试实验分析

工具法

工具法遍历可用的工具,检查它们提供的关键指标。尽管是一个简单的方法,但它有可能忽视这些工具不可见或者看不清楚的问题,并且操作比较费时。

对内存而言,应用工具法可以检查以下指标:

  • 页扫描:寻找连续的页扫描(超过10秒),它是内存压力的预兆。Linux中,可以使用 sar -B并检查pgscan列。
  • vmstat:每秒运行vmstat 检查 free列的可用内存。
  • OOM终结者:仅对Linux有效,这些事件可以在系统日志/var/log/messages,或者从dmesg(1) 中找到。
  • top/prstat:查看哪些进程和用户是(常驻)物理内存和虚拟内存的最大使用者。
  • dtrace/stap/perf:内存分配的栈跟踪,确认内存使用的原因。

USE 方法

性能调查的初期,在使用更深层次和更费时的策略前,USE方法可以用来定位瓶颈和跨所有组件的错误。

检查系统级的如下:

  • 使用率:多少内存被使用,及多少仍可用。物理内存和虚拟内存都需要检查。
  • 饱和度:作为释放内存压力的衡量,页扫描、换页、交换和Linux OOM终结者牺牲进程的使用程度。
  • 错误:失败的内存分配

首先应检查饱和度,因为持续的饱和状态是内存问题的征兆。这些指标能由vmstat(1)、sar(1) 和dmesg(1) 等操作系统工具轻易获得。对于配置了独立磁盘交换设备的系统,任何交换设备活动都是内存压力的征兆。

使用率通常较难读取和解读。通过饱和度指标,可以发现物理内存耗尽:系统开始换页或者进程被杀死(OOM)。要确认物理使用率,需要了解可用内存(free)大小。不同的工具不一定考虑了未被引用的文件系统缓存页或者非活动页,因此它们的报告可能会不同。一个系统可能会报告只有10MB的可用内存,但事实上它由10GB的文件系统缓存在,需要时能立刻被应用程序回收利用。

有可能需要检查虚拟内存的使用率,这取决于系统是否支持过度提交。对于那些不支持过度提交的系统,一旦虚拟内存耗尽,内存分配就会失败——这是一种典型的内存错误。

历史上内存错误由应用程序报告,尽管不是所有的应用程序会这样做(而且,由于Linux的过度提交,开发人员可能觉得没有必要)。

使用特征归纳

实施容量规划、基准和负载模拟时,归纳内存使用特征分析是一项重要的活动。发现错误的配置,可能促成最大的性能提升。例如,一个数据库缓存可能配置得过下导致命中率过低,或者过高而引起系统换页。

对于内存,这包括了要求发现内存用于何处以及使用了多少,如下所示:

  • 系统范围的物理和虚拟内存使用率
  • 饱和度:换页、交换、OOM终结者
  • 内核和文件系统缓存使用情况
  • 每个进程的物理和虚拟内存使用情况
  • 是否存在内存资源控制

高级使用特征分析 / 检查清单

更细致地理解使用特征需要涵盖更多具体信息。下面列举一些参考的问题。这可在需要缜密的研究内存问题时作为检查清单:

  • 内核内存用于何处?每个slab呢?
  • 文件系统缓存(或者页缓存)中不活跃与活跃的比例是多少?
  • 进程内存用于何处?
  • 进程为何分配内存(调用路径)?
  • 内核为何分配内存(调用路径)?
  • 哪些进程被持续地页面换出 / 交换出?
  • 哪些进程曾经被页面换出 / 交换出?
  • 进程或者内核是否有内存泄露?
  • NUMA 系统中,内存是否被分配到合适的节点中去?
  • CPI 和内存停滞周期频率是多少?
  • 内存总线的平衡性?
  • 相对于远程内存 I/O,执行了多少本地内存 I/O ?

周期分析

内存总线负载通过检查CPU性能计数器(CPC)测定,它能被设置用来计算内存停滞周期。作为内存依赖的CPU负载的指标,它们也能用来测量每指令周期(CPI)。

性能监测

性能检查能发现当前的问题以及随着时间推移的行为模式。关键的内存指标如下:

  • 使用率:使用百分比,由可用内存推断
  • 饱和度:换页、交换、OOM终结者

对于应用了内存限制或配额(资源控制)的环境,有关强制配额的统计数据也需要收集。

监测随时间推移的内存使用率,特别是按进程监测,有助于发现是否存在内存泄露及其泄露速度。

泄露监测

当应用程序或者内核模块无尽地增长,从空闲链表、文件系统缓存,最终从其他进程消耗内存时,就出现了这个问题。初次注意到这个问题可能是因为系统为应对无尽的内存压力而做的换页。

这类问题源自以下两种情况:

  • 内存泄露:一种类型的软件bug,忘记分配过的内存而没有释放。通过修改软件代码或应用补丁进行升级能修复。
  • 内存增长:软件在正常地消耗内存,远高于系统允许的速率。通过修改软件配置,或者由软件开发人员修改软件内存的消耗方式来进行修复。

内存增长的问题常常被误认为是内存泄露。第一个问题应该是:这应该发送吗?检查配置。

静态性能调优

静态性能调优注重解决配置后的环境中的问题。对于内存性能,在静态配置中检查如下方法:

  • 主存有多少?
  • 配置允许应用程序使用多少内存(它们自己的配置)?
  • 应用程序使用哪个分配器?
  • 主存的速度?是否是可用的最快的类型?
  • 系统架构是什么?NUMA、UMA?
  • 操作系统支持NUMA吗?
  • 有多少内存总线?
  • COU缓存的数量和大小是多少?TLB?
  • 是否配置和使用了大页面?
  • 是否支持和配置了过度提交?
  • 还使用了哪些其他的内存可调参数?
  • 是否有软件强制的内存限制(资源控制)?

回答这些问题可能会揭示被忽视的配置选择、

资源控制

操作系统可能向进程或进程组内存分配提供细粒度控制。这些控制可能会包括使用主存和虚拟内存的固定极限。

微基准测试

微基准测试可用于确定主存的速度和特征,例如CPU 缓存和缓存线长度。它有助于分析系统间的不同。由于应用程序和负载的不同,内存访问速度可能比 CPU 时钟速度对性能影响更大。

分析

内存分析工作

Linux描述
vmstat虚拟和物理存储器统计信息
sar历史统计信息
slabtop内核块分配统计信息
ps进程状态
top监视每进程存储器使用率
pmap进程地址空间统计信息
DTrace分配跟踪

调优

最重要的内存调优是保证应用程序保留在主存中,并且避免换页和交换经常发生。

可调参数

Linux在Documentation/sysctl/vm.txt的内核源代码文档中介绍了多种可调参数,并且也能用sysctl(8) 设置。

多个页面大小

更大的页面能通过提高TLB缓存命中率(增加它的覆盖范围)来提升内存 I/O 性能。现代处理器支持多个页面大小,例如默认的4KB以及2MB的大页面。

分配器

有多种为线程应用程序提升性能的用户级分配器可供选用。可以在编译阶段选择,也可以在执行时用LD_PRELOAD环境变化设置。

资源控制

基础的资源控制,包括设置主存限制和虚拟内存现在,可以用ulimit(1) 实现。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值