第 4 部分 性能调优.docx
《第 4 部分 性能调优.docx》由会员分享,可在线阅读,更多相关《第 4 部分 性能调优.docx(46页珍藏版)》请在冰点文库上搜索。
第4部分性能调优
开始之前
关于本系列
您打算获得IBMIDS11系统管理(考试918)的认证吗?
如果是这样,本系列正好适合您。
这个分8部分的IDS认证准备系列教程覆盖了在参加考试之前需要了解的所有主题。
即使您不打算马上参加认证考试,这个教程系列也可以帮助您了解IDS11中的新特性。
关于本教程
IDS是一种复杂的、可调的产品。
本教程将帮助您从服务器获得最佳性能。
本教程还介绍IDS11中的子系统,并展示如何查看它们。
在本教程中,您将学习:
∙检查点
∙恢复
∙物理日志记录
∙逻辑日志记录
∙异步IOVP
∙网络参数
∙磁盘资源
∙CPUVP资源
∙PDQ和MemoryGrantManager
∙扫描线程
∙索引创建
∙统计信息维护
本教程是一个由8篇教程组成的系列中的第4篇教程,这个系列可以帮助您准备IBMIDSV11系统管理(918考试)认证。
本教程中的内容主要谈到该考试题为“性能调优”的第4部分中的目标。
IDS11的安装在本教程系列的第1部分中已谈到。
如果您还没有安装IDS11,请考虑下载和安装IBMIDS11。
安装IDS可以帮助您理解IBMIDSV11系统管理认证考试中要考的很多概念。
回页首
目标
完成本教程之后,您应该能够:
∙调优IDS系统以提高性能
∙理解操作系统资源方面的考虑
回页首
先决条件
IDS11的安装在本教程系列的第1部分中已谈到。
如果您还没有安装IDS11,请考虑下载和安装IBMIDS11。
安装IDS可以帮助您理解IBMIDSV11系统管理认证考试中要考的很多概念。
回页首
系统需求
完成本教程不需要IDS的副本。
但是,如果下载免费试用版的IBMIDS11并随本教程一起使用该产品,可以更好地理解本教程。
IDS的性能调优
IDS是一种通用的、灵活的数据库服务器。
因此,刚刚投入使用时,它不能对于每个人的需求都达到最佳性能。
本教程将考察以下子系统以及如何调优它们:
∙检查点
∙恢复
∙物理日志记录
∙逻辑日志记录
∙异步IOVP
∙网络参数
∙磁盘资源
∙CPUVP资源
∙PDQ和MemoryGrantManager
∙扫描线程
∙索引创建
∙统计信息维护
性能调优概述
性能调优是一个复杂的过程。
要进行性能调优,需要认识到看起来毫不相干的事物却可能相互影响。
当进行性能调优时,务必将作出的更改和样本运行的性能记录到文档,以便发现作出的更改对性能有不良影响之后可以复原。
回页首
如何开始
性能调优的一个重大问题是子系统太多了。
如何知道哪些东西需要调优呢?
回答是主观性的。
先前的经验和实验有助于形成一种直觉,知道哪里运行正常,哪里还需要进行一点调整。
随便试试吧,看您是否能利用这些技巧提高服务器的性能。
对系统运行有影响的操作系统资源
数据库服务器应用程序的性能取决于以下因素:
∙硬件资源
∙操作系统配置
∙网络配置和流量
∙内存管理
当试图发现性能问题或者对系统作出调整时,必须考虑这些因素。
硬件资源
硬件主要由以下几个部分组成(但不止这些):
∙CPU
∙磁盘i/o子系统
∙物理内存
操作系统配置
数据库服务器依赖于操作系统提供对设备的低级访问、进程调度、进程间通信和其他重要服务。
操作系统的配置对数据库服务器的性能有直接的影响。
操作系统内核要占用大量物理内存,这部分内存是数据库服务器或其他应用程序不能使用的。
但是,还必须预留适当的内核资源供数据库服务器使用。
除了调优内核外,对于栈大小、文件描述符数量等不同资源也有软限制。
这些资源可以通过ulimit命令进行检查和调整。
(本教程不谈这个命令。
)
操作系统处理同时运行的多个应用程序的一种常见机制是交换空间。
可能需要添加或调优交换空间。
而且,临时目录是很多常见应用程序(例如vi、ed或内核)的公共储存库。
可能需要根据操作系统上的用户和应用程序的需要相应地调整临时目录。
回页首
磁盘和控制器I/O瓶颈
监视磁盘使用情况很重要。
如果某个表使用比较频繁,它存放在一个磁盘上,那么这个表与同一个磁盘上的另一个使用也比较频繁的表之间就会竞争i/o。
对于磁盘控制器也是如此。
在这种情况下,可以进行负载均衡,将表转移到另一个磁盘,从而轻松地提高性能。
回页首
网络配置和流量
依赖于网络与数据库服务器通信的应用程序,以及依赖于数据复制来维护高可用性的系统,其性能都要受到网络的约束。
在网络上传输数据通常比从磁盘传输数据慢。
网络延时对数据库服务器和其他在主计算机上运行的应用程序的性能有很大的影响。
回页首
内存管理
操作系统需要在内存中有一个页面,以便在那个页面上执行操作。
如果操作系统需要分配内存供一个进程使用,它首先尝试提取它发现的内存中未被使用的页面。
但是,如果没有空白页面呢?
这时内存管理系统必须选择其他进程正在使用的页面。
引擎尽量确定看上去短时间内最不可能需要的页面,以便用新的页面置换它们。
找到那些可以被置换的页面的过程就叫做页面扫描。
页面扫描会增加对CPU的利用。
大多数内存管理系统使用最近最少使用算法以确定内存中哪些页面可以被置换。
这些页面首先被复制到磁盘上。
复制完毕后,内存便释放出来,供其他进程使用。
当一个页面被写出到磁盘上时,它被写到一个称作交换空间的特定区域。
这个空间通常是一个专用磁盘或磁盘分区。
这个磁盘或磁盘分区称作交换空间或交换区,它们将存放这些交换出的页面。
这个过程称作换页(paging)。
换页过程需要利用I/O资源和CPU周期。
在某个时候,必须将换出的页面镜像换回到内存中,以便需要它们的进程可以使用它们。
所以对于其他较旧的页面(最近没有被使用的页面),这个周期又开始了。
如果非常频繁地这样来回交换,操作系统可能达到这样一种状态:
内核几乎完全被用于页面的换进和换出。
这种状态称作系统失效(thrashing),所有有用的工作都被终止。
为了防止系统失效,有些操作系统的内存管理算法大致地确定一个阈值。
它不是寻找较旧的页面,而是换出用于某个特定进程的所有页面。
这个过程称作交换(swapping)。
每个被换出的进程最终必须被换回到内存中。
这大大增加了对交换设备的磁盘I/O,也增加了进程间切换所需的时间,因为现在每次上下文切换还必须将与进程相关的所有页面换进内存。
因此,性能受到将那些页面从交换磁盘传输到内存的速度的限制。
正在进行交换的系统会严重超载,其吞吐量会降低。
很多操作系统在提供关于换页活动的信息方面有一些共同之处,这些信息包括执行的页面扫描次数、从内存送出(换出)的页面数量和送入(换进)内存的页面数量:
∙换出是关键因素。
当操作系统找不到已被释放的页面时,就进行换出。
∙内存使用正成为瓶颈的一个早期的指示符是高页面扫描率。
∙如果一个进程被终止,则内存中的所有页面被标记为freed(已释放),并且可以被重用,因此换入活动对内存负载的影响可能难以估计。
另一方面,很多进程的开始会导致较高的换进率,但是对性能没有显著的影响。
可以使用下面的公式,根据给定的CPU使用情况和换页率计算预计的换页延时:
PD=(C/(1-U))*R*T
表1.符号描述
符号
描述
PD
换页延时
C
用于一个事务的CPU服务时间
U
十进制表示的CPU利用率
R
换出率
T
用于交换设备的服务时间
随着换页的增加,CPU利用率也增加,因此它们之间存在联系。
如果每秒15次的换页率导致3%的CPU利用率,那么将换页率增加到每秒30次将导致CPU利用率3个百分点。
换页率越接近交换阈值,CPU利用率增加得越快,直到发生交换。
如果负载进一步增加,则系统将开始失效。
ONCONFIG
VPCLASS
IDS是可伸缩的,因此对它进行调优,以容纳大型实例。
用于调优VP的主要参数是VPCLASS。
下面的参数已经被弃用,并被VPCLASS替代:
∙NUMCPUVPS
∙SINGLE_CPU_VP
∙AFF_SPROC
∙AFF_NPROCS
∙NOAGE
∙NUMAIOVPS
VPCLASS语法
VPCLASS参数中的第一项提供所描述的虚拟处理器类型的名称。
VPCLASS名称不是区分大小写的。
可以为用户定义例程或DataBlade模块定义新的虚拟处理器类型,或者为预定义的虚拟处理器类型设置值。
注意:
下面的类型名称是预定义的:
清单1.预定义的VPCLASSes
admlioshm
adtmscsoc
cpuntkstr
jvpopttli
kioaiopio
encrypt
classname变量是必需的。
与大多数配置参数不同,VPCLASS有一些选项字段,它们可以以任意顺序出现,之间用逗号隔开。
字段中不能使用空格。
VPCLASS有以下空格:
清单2.VPCLASS的次要参数
num=num_VPs
max=max_VPs
aff=affinity
noage
noyield
要了解更多信息,请参阅文档。
多个CPU的配置
如前所述,IDS是可伸缩的,可以对它进行配置,以容纳和使用多CPU的计算机。
CPUVP的数量可以这样配置:
清单3.多个CPUVP
VPCLASScpu,num=3
JavaVP
VPCLASS配置参数的JVP选项设置Java虚拟处理器的数量。
当使用IBMInformixJDBCDriver时,这个参数是必需的。
在UNIX上,必须定义多个Java虚拟处理器以并行执行Java用户定义例程。
网络VP
对于VP类型tli、shm、str和soc,必须将NETTYPE配置参数的VP_class字段设置为NET。
例如,如果VPCLASS参数被设置如下:
VPCLASSshm,num=1
VPCLASStli,num=1
那么NETTYPE参数应该设置为:
NETTYPEipcshm,1,100,NET
NETTYPEtlitcp,1,100,NET
回页首
配置共享内存参数
下面是一些共享内存参数:
表2.共享内存参数
参数
描述
EXTSHMADD
指定增加的扩展段(extensionsegment)的大小
SHMADD
指定当数据库服务器请求更多内存时内存的增量
SHMBASE
指定共享内存基址,与计算机有关。
这个值取决于是什么平台,处理器是32位还是64位的。
要了解关于使用哪个SHMBASE值的信息,请查看计算机说明
SHMTOTAL
指定允许数据库服务器使用的最大内存数
SHMVIRTSIZEL
指定数据库服务器使用的第一块内存的大小
回页首
管理网络参数以获得最佳通信性能
DBSERVERNAME和DBSERVERALIASES参数对应于sqlhosts文件或注册表第一列中的条目。
一个NETTYPE条目可以指定一个接口/协议组合。
NETTYE与DBSERVER或DBSERVERALIAS条目不是匹配的,而是对应于sqlhosts文件中第二列中有相应协议的那一行。
根据关于分配多少个poll线程的定义,数据库服务器将为每个惟一的NETTYPE条目运行一个或多个poll线程。
NETTYPE配置参数还提供用于一个相应的接口/协议组合的附加配置信息。
这使DBA可以分配一个初始缓冲区以处理用户,并为一个接口/协议组合分配不止一个poll线程。
NETTYPE还指定poll线程将在其上工作的虚拟处理器类型(CPU或NET)。
poll线程可以在CPU虚拟处理器(VP)或网络VP上运行。
对于单CPU机器,poll线程通常在CPUVP上可以更高效地运行。
但是,在具有大量远程客户机的多处理器计算机上,在NETVP上运行poll线程可以获得更好的吞吐率。
默认情况下,如果没有为一个接口/协议组合设置NETTYPE,则数据库服务器将在内部运行poll线程。
默认情况下,与DBSERVERALIAS匹配的、用于特定接口/协议组合的poll线程将在CPUVP上运行,因为数据库服务器假定这是任何用户的主接口。
对于其他接口/协议组合,如果没有指定VP类型,则默认地在NETVP上运行那些poll线程。
如果poll线程在NETVP上运行,那么引擎将为每个poll线程启动一个NETVP。
这是因为每个poll线程都需要自己的虚拟处理器。
对于在内部运行(即在CPUVP上运行)的poll线程也是如此。
如果指定VP类型为CPU,那么每个CPUVP上只能运行一个poll线程。
如果数据库服务器没有足够的CPUVP,则数据库服务器将委派NETVP处理溢出。
对于较小的系统,每个网络接口/协议组合只需一个poll线程,即只需一个虚拟处理器。
对于有200个以上并发网络用户的系统,增加更多的poll线程(随之增加网络虚拟处理器)可以取得更好的性能。
由于用户负载较高,可能需要进行试验,以确定poll线程(不管是内部运行还是在NETVP上运行)和要启动的网络VP的数量(如果在网络虚拟处理器上运行的话)的配置。
如果对于给定的单个端口和相应侦听线程的接口/协议组合,数据库服务器不能令人满意地处理连接请求,那么可以通过以下方法提高连接吞吐率:
∙分配更多的侦听线程
∙增加一个网络接口卡
分配更多的侦听线程
一个侦听线程专用于它所在的端口。
首先,使用DBSERVERALIASES参数为每个附加端口指定一个dbservername。
引擎只能分配一个共享内存侦听线程。
但是对于网络连接,每个DBSERVERALIAS将处理NETTYPE设置,并分配一组相同的poll线程和连接缓冲区。
对于sqlhosts文件或注册表中的每个DBSERVERALIAS,必须指定一个接口/协议组合。
增加一个网络接口卡
有时候,用于主计算机的一个网络接口卡不能达到要求的连接吞吐率。
或者,可能需要将数据库服务器连接到不止一个网络。
在这种情况下,可以增加一个网络接口卡。
为支持多个网络接口卡,必须为每个卡赋予一个惟一的主机名或网络地址。
增加一个网卡后,就可以增加一个附加的侦听线程,这个侦听线程在新增的网卡上运行。
数据库服务器将使用sqlhosts文件中的hostname条目以确定使用哪个网卡。
网络缓冲区
调整网络缓冲区的大小以容纳一个常见的请求,这样可以避免将一个请求拆分成多个报文,从而提高CPU利用率。
但是,这样做时要小心,因为数据库服务器会为所有活动的连接动态地分配指定大小的网络缓冲区。
如果缓冲区配置得太大,就会消耗大量的内存。
数据库服务器从全局内存池中为请求报文分配网络缓冲区。
当数据库服务器服务完一个客户机请求之后,它将那些缓冲区返回给公共网络缓冲池。
这个缓冲池在使用SOCTCP、IPCSTR或TLITCP网络连接的会话之间共享。
数据库管理员可以用以下方法控制自由缓冲区阈值和每个缓冲区的大小:
∙NETTYPE配置参数
∙IFX_NETBUF_PVTPOOL_SIZE环境变量
∙sqlhosts文件或注册表中的IFX_NETBUF_SIZE环境变量和b(客户机缓冲区大小)选项
NETTYPE配置参数
数据库服务器维护自由网络缓冲区的一个阈值。
这是为了防止从网络缓冲池中频繁地分配和回收共享内存。
如果在NETTYPE参数中指定一个用户数量,则数据库服务器利用这个值,并维护阈值,以匹配共享内存的分配。
数据库服务器使用下面的公式计算网络缓冲池中自由缓冲区的阈值:
freenetworkbuffersthreshold=100+(0.7*number_connections)
对于TCPIP连接(即SOCTCP、TLITCP或IPCSTR),number_connections的值与NETTYPE条目的第三个字段相关联。
共享内存连接(IPCSHM)不使用这个公式以计算connections_used。
如果没有指定,NETTYPE参数第三个字段的默认值是50个用户。
IFX_NETBUF_PVTPOOL_SIZE环境变量
数据库服务器提供了一种机制以支持使用SOCTCP、IPCSTR或TLITCP网络连接的每个会话的私有网络缓冲区。
当很多连接和会话经常活动时,这些私有网络缓冲区可以带来以下好处:
∙减少公共网络缓冲池的连接
∙节省CPU资源,因为不需要为每个网络传输从公共网络缓冲池中分配网络缓冲区和为之回收网络缓冲区。
这些缓冲区将静态可用。
用于每个会话的私有网络缓冲池的大小由IFX_NETBUF_PVTPOOL_SIZE环境变量指定。
默认大小是一个缓冲区。
可以使用下面表中的onstat选项以监视网络缓冲区的使用:
表3.用onstat监视网络缓冲区
选项
输出字段
字段描述
onstat-gntu
q-pvt
私有缓冲池中用于该会话的自由缓冲区的当前数量和最高数量
onstat-gntm
q-exceeds
超过自由缓冲区阈值的次数
onstat-gntu选项按以下格式显示q-pvt输出字段:
currentnumber/highestnumber
如果自由缓冲区的数量(q-pvt字段中的值)始终为0,那么可以采取以下几种行动之一:
∙使用环境变量IFX_NETBUF_PVTPOOL_SIZE增加缓冲区的数量
∙使用环境变量IFX_NETBUF_SIZE增加每个缓冲区的大小
q-exceeds字段表明自由共享网络缓冲池的阈值被超过的次数。
当超过这个阈值时,数据库服务器将未使用的网络缓冲区(超过这个阈值的部分)返回给全局内存池。
最佳情况下,这个值应该总是为0或者一个很低的数字。
这是服务器不在分配或回收网络缓冲区的一个指示符。
IFX_NETBUF_SIZE环境变量
IFX_NETBUF_SIZE环境变量指定公共网络缓冲池中每个网络缓冲区和私有网络缓冲池的大小。
默认大小为4KB。
使用IFX_NETBUF_SIZE配置一个较大的缓冲区可以减少接收每个分组所需的开销。
如果知道客户机会发送大于4B的分组,可以将IFX_NETBUF_SIZE配置为平均分组大小。
客户机在以下几种情况下会发送大型分组:
∙表装载
∙行大小大于4KB
∙发送简单的大型对象
sqlhosts的b选项对应于IFX_NETBUF_SIZE参数。
sqlhosts选项的值通常应该与IFX_NETBUF_SIZE的值匹配。
可以使用下面的onstat命令查看网络缓冲区大小:
onstat-gafrglobal|grepnet
输出中的size字段显示网络缓冲区的大小,单位为字节。
回页首
自调优
IDS11在某些方面会自动调优。
自动检查点
数据库服务器会自动调整检查点频率,以避免事务阻塞。
为此,服务器监视物理和逻辑日志的消耗情况以及关于过去检查点性能的信息。
然后,必要时服务器更频繁地触发检查点,以避免事务阻塞。
为了保存关于最近检查点性能的信息,InformixDynamicServers在SYSMATER数据库中增加了下面两个表:
表4.用于检查点的新的Sysmaster表
表
描述
syscheckpoint
存放关于最近20个检查点的历史
sysckptinfo
跟踪检查点活动
由于数据库服务器在检查点处理期间不阻塞事务,LRU刷新应该放缓。
如果服务器不能在物理日志被消耗(这样会导致事务阻塞)之前完成检查点处理,并且不能增加物理日志的大小,那么可以配置服务器,使之更积极地进行LRU刷新。
增加LRU刷新会影响事务性能,但是可以减少事务阻塞。
如果没有配置服务器使之更频繁地进行LRU刷新,那么只有当服务器找不到低优先级的缓冲区进行页面置换时,服务器才自动调整LRU刷新,使之变得更积极。
ONCONFIG参数AUTO_CKPTS启用自动检查点,默认情况下,在配置文件中它是自动启用的。
可以通过将onmode-wfAUTO_CKPTS设为0,或者将AUTO_CKPTS配置参数设为0以关闭自动检查点。
如果关闭了AUTO_CKPTS,则InformixDynamicServer只根据以下4个事件触发检查点:
∙诸如归档、onmode-c、增加数据库空间、启动和关闭服务器之类的管理事件
∙物理日志满了75%。
确保物理日志较大,以避免在达到CKPTINTVL之前发生检查点处理
∙每个逻辑日志空间一个检查点:
InformixDynamicServer不能覆盖包含当前检查点的逻辑日志,所以它必须在转移到那个逻辑日志之前触发检查点
∙ONCONFIG参数CKPTINTVL
LRU的自动调优
用于使用间歇性检查点刷新每个缓冲池的LRU设置对于检查点性能并不重要。
只有当维护足够多干净的页面用于页面置换时,才需要进行LRU设置,以减缓LRU刷新。
每当发生页面置换时,数据库服务器自动调优LRU刷新。
发生检查点之后,如果在之前的检查点间歇期间发生了页置换前台写操作,则数据库服务器将LRU设置增加10%,并且在随后的每个检查点继续增加LRU刷新,直到页置换前台写操作停止,或者一个给定的缓冲池的LRU_MAX降低了10%。
例如,如果发生页置换前台写操作,并且一个缓冲池的LRU设置是80和90,则数据库服务器将该设置调整为76和85.5。
除了前台写操作之外,每当一个页错误替代了一个热页面(高优先级缓冲区),并且非高优先级缓冲区在修改的LRU队列上时,LRU刷新也将被调整为更加积极。
自动LRU调整只是使LRU刷新变得更积极,而不能减少LRU刷新。
自动LRU调整不是永久的,不会记录在ONCONFIG文件中。
LRU刷新会被重新设置为数据库服务器启动时使用的ONCONFIG文件中包含的值。
自动LRU调优对所有缓冲池都有影响,并且会调整BUFFERPOOL配置参数中的LRU_MIN_DIRTY和LRU_MAX_DIRTY值。
AUTO_LRU_TUNING配置参数指定当服务器启动时是否启用自动LRU