系统性能调优CPU与内存

时间:2022-06-09 16:28:21

CPU相关术语

处理器:插到系统插槽或者处理器版上的物理芯片,以核或者硬件线程的方式包含了一块或者多块CPU。

核:一颗多核处理器上的一个独立CPU实例。核的使用时处理器扩展的一种方式,有称为芯片级多处理器(chip-level multiprocessing,CMP)。

硬件线程:一种支持在一个核上同时执行多个线程(包括Intel的超线程技术)的CPU架构,每个线程是一个独立的CPU实例。这种扩展的方法又称为多线程。

CPU指令:单个CPU操作,来源于它的指令集。指令用于算术操作、内存I/O,以及逻辑控制。

逻辑CPU:又称为虚拟处理器,一个操作系统CPU的实例(一个可调度的CPU实体)。处理器可以通过硬件线程(这种情况下又称为虚拟核)、一个核、或者一个单核的处理器实现。

调度器:把CPU分配给线程运行的内核子系统。

运行队列:一个等待CPU服务的可运行线程队列。

 

 

系统性能调优CPU与内存系统性能调优CPU与内存

CPU架构

多进程,多线程

大多数处理器都以某种形式提供多个CPU。对于想使用这个 功能的应用程序来说,需要开启不同的执行线程以并发运行。对于一个64颗CPU的系统来说,这意味着一个应用程序如果同时满足所有CPU,可以达到最快64倍的速度,或者64倍的负载。应用程序可以根据CPU数目进行有效放大的能力又称为扩展性。

应用程序在多CPU上扩展的技术分为多进程和多线程,如图所示:

系统性能调优CPU与内存系统性能调优CPU与内存

内存

系统主存存储应用程序和内核指令,包括它们的工作数据,以及文件系统缓存。许多系统中,存放这些数据的二级存储是主要的存储设备—磁盘—它的处理速度比内存低几个数量级。一旦主存存满,系统可能会在主存和这些存储设备间交换数据。这是一个缓存的过程,它常常成为系统瓶颈,严重影响性能。系统也有可能终止内存占用最多的进程。其它影响系统性能的因素包括分配和释放内存、复制内存,以及管理内存地址空间映射的CPU开销。对多处理器架构的系统,由于连接到本地CPU的内存相对远程CPU访问延时更低,内存本地性也是一个影响因素。。

与内存相关的术语如下

主存:也称为物理内存,描述了计算机的高速数据存储区域,通常是动态随机访问内存(DRAM)。

虚拟内存;一个抽象的主存概念,它(几乎是)无限的和非竞争的。虚拟内存不是真实的内存。

常驻内存:当前处于主存中的内存。

匿名内存:无文件系统位置或者路径名的内存。它包括进程地址空间的工作数据,称作堆。

地址空间:内存上下文。每个进程和内核都有对应的虚拟地址空间。

段:标记为特殊用途的一块内存区域,例如用来存储可执行或者可写的页。

OOM:内存耗尽,内核检测到可用内存低。

页:操作系统和CPU使用的内存单位。它一直以来是4KB或者8KB。现代的处理器允许多种页大小以支持更大的页面尺寸。

缺页:无效的内存访问。使用按虚拟内存时,这是正常事件。

换页:在主存与存储设备间交换页。
交换:源自UNIX,指将整个进程从主存转移到交换设备。Linux中交换指页面转移到交换设备(迁移交换页)。

交换(空间):存放换页的匿名数据和交换进程的磁盘空间。它可以是存储设备的一块空间,也称为物理交换设备,或者是文件系统文件,称作交换文件。部分工具用交换这个术语特指虚拟内存(这是令人误解和不正确的)。

内存分析调优的方法

工具法

页扫描:寻找连续的也扫描(超过10秒),它是内存压力的预兆。Linux中,可以使用sar –B并检查pgscan列。

换页:换页是系统内存低的进一步征兆。Linux,可以使用vmstat并检查si和so列(这里,交换匿名换页)。

vmstat:每秒运行vmstat检查free列的可用内存。

OOM终结者:仅对Linux有效,这些事件可以在系统日志/var/log/messages,或者从dmesg中找到。搜索“Out of Memory”。

top/prstat:查看哪些进程和用户是(常驻)物理内存和虚拟内存的最大使用者(列明参考Man手册,不同版本有所变化)。这些工具野火总结内存使用率。

dtrace/stap/perf:内存分配的栈跟踪,确认内存使用的原因。

检查系统级别

使用率:多少内存被使用,及多少仍可用。物理内存和虚拟内存都需要检查。

饱和度:作为释放内存压力的衡量,页扫描、换页、交换、和Linux OOM终结者牺牲进程的使用程度。

错误:失败的内存分配。

 

性能监测

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

使用率:使用百分比,由可用内存推断。

饱和度:换页、交换、OOM终结者。

静态性能调优

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

主存有多少?

配置允许应用程序使用多少内存(它们自己的配置)?

应用程序使用哪个分配器?

主存的速度?是否是可用的最快的类型?

系统架构是什么?NUMA、UMA?

操作系统支持NUMA吗?

有多少内存总线?

CPU缓存的数量和大小是多少?TLB?

是否配置和使用了大页面?

是否支持和配置了过度提交?

还使用了哪些其他的内存可调参数?

是否有软件强制的内存限制(资源控制)?

分析

vmstat  虚拟和物理存储器统计信息

sar     历史统计信息

slabtop 内核块分配统计信息

ps      进程状态

top     监视每进程存储器使用率

pmap    进程地址空间统计信息

DTrace  分配跟踪

vmstat是虚拟内存统计信息命令。它提供包括当前内存和换页在内的系统内存健康程度总览。

vmstat 1

 

默认数据列如下,单位为KB

swpd:交换出的内存量。

free:空闲的可用内存。

buff:用于缓冲缓存的内存。

cache:用于页缓存的内存。

si:换入的内存(换页)。

so:换出的内存(换页)。

系统启动后,空闲内存下降并被用于这些缓存以提高性能是正常的。需要时,它们可以被释放以供应用程序使用。

如果si和so列一直非0,那么系统正存在内存压力并换页到交换设备或文件(swapon)。用其它工具可以研究什么在消耗内存,例如能观察每进程内存使用的工具。拥有大量内存的系统中,数据列会不对齐而影响阅读。你可以试着用-S选项修改输出单位为MB

vmstat 1 –Sm

选项-a可以输出非活动和活动页缓存的明细:

vmstat –a 1

内存统计信息可以用选项-S输出成列表。

sar

系统活动报告工具sar可以用来观测当前活动并且能配置保存和报告历史统计数据。

-B:换页统计信息      千字节/秒

-H:大页面统计信息    千字节

-r:内存使用率        千字节

-R:内存统计信息      页面/秒

-S:交换空间统计信息  千字节

-W:交换统计信息       页面/秒

 

pg表示页,kb表示KB,%表示百分比以及/s表示每秒。完整的列表见Man手册

其中包含更多百分比统计信息。

slabtop

Linux的slabtop命令可以通过slab分配器输出内核slab缓存使用情况。类似top,它实时更新屏幕。

slabtop –sc

对象数量OBJS

多少活动的ACTIVE

使用百分比USE

对象大小OBJ SIZE,字节

缓存大小CACHE SIZE,字节

选项-sc按缓存大小排序,最大值在顶端。

slab统计信息取自/proc/slabinfo,也可以用vmstat –m输出。

ps

top

prstat

pmap