下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

全面详解Informix数据库调优方法

作者:课课家教育     来源: http://www.kokojia.com点击数:1376发布时间: 2017-06-27 11:00:16

标签: 服务器计算机操作系统

  数据库调优可以使数据库应用运行得更快,它需要综合考虑各种复杂的因素。将数据均匀分布在磁盘上可以提高I/O利用率,提高数据的读写性能;适当程度的非规范化可以改善系统查询性能;建立索引和编写高效的SQL语句能有效避免低性能操作;通过锁的调优解决并发控制方面的性能问题。

  数据库调优技术可以在不同的数据库系统中使用,它不必纠缠于复杂的公式和规则,然而它需要对程序的应用、数据库管理系统、查询处理、并发控制、操作系统以及硬件有广泛而深刻的理解。

     InformixIDS数据库广泛的应用在金融、电信和邮政等各个行业中,它是一个多线程的关系数据库服务器,采用对称的多处理器技术和单处理器体系结构,并具有先进的技术、性能与高可靠性和高可用性。它为用户提供了动态系统管理工具来监控和管理数据库服务器。随着数据库数量的增加和应用处理交易量的增多,它的运行效率显得尤为突出。在硬件环境不变的情况下,数据库性能的提高也一直成为大家关注的话题。

  数据库系统性能通常与CPU、共享内存、数据的存储和网络设置等四个方面有直接的关系。下面着重介绍通过配置InformixIDS参数和监控InformixIDS运行效率,来提高数据库的性能。

  虚拟处理器参数的调整和监控

全面详解Informix数据库调优方法_服务器_计算机_操作系统课课家教育

  InformixIDS对于虚拟处理器的分类,达到了十多种,每个虚拟处理器像操作系统的一个CPU允许多个进程服务于多个用户一样,也可以运行多个线程来为多个SQL客户机应用程序提供服务。其中最重要的虚拟处理器是CPU、AIO、网络处理器三种,在这三种服务器中,CPU虚拟处理器(CPUVP)是最重要的,它驱动其他虚拟处理器,如磁盘I/O虚拟处理器(AIOVP)和IDS会话中的所有线程。AIOVP的功能是在SQL语句访问或更新数据库数据时,执行磁盘I/O。网络处理器涉及到数据库服务器的客户机或用户连接。可以进行两种类型的连接:共享内存连接和网络连接。下面分别介绍这三种类型的参数。

  1.CPU虚拟处理器(CPUVP)的参数

  NUMCPUVPS:定义了InformixIDS开始启动的CPUVP的数量。一般情况下不能超过系统CPU的个数,对于单或双CPU的计算机系统,建议设置NUMCPUVPS是1或者2,即使用一个或两个CPUVP;对于有4个以上CPU,建议设置NUMCPUVPS的值等于处理器总数减1。

  SINGLE_CPU_VP:定义了多CPUVP(0)和单CPUVP(1)设置。

  MULTIPROCESSOR:定义了多个CPUVP(1)还是单个CPUVP(0)。

  AFF_NPROCS:定义了可以绑定到CPUVP的CPU的数目。

  AFF_SPROC:定义了把连续的几个CPU(AFF_NRPOCS参数定义的值)中第一个CPU的序号连接到CPUVP上。

  例如,某个InformixIDS系统所在的硬件平台有4个CPU,AFF_NPROCS设置为3(即可用于绑定CPUVP的CPU有3个),NUMCPUVPS设置为3,AFF_SPROC设置为1,则3个CPUVP需要绑定到CPU上,是从第2个CPU开始,绑定到第二、三、四个CPU上。SINGLE_CPU_VP设置为0。

  2.对于磁盘I/O虚拟处理器(AIOVP)的配置

  NUMAIOVP指定系统上AIO/KAIO虚拟处理器的数目,如果InformixIDS采用裸设备存储,可以设置成2。

  在InformixIDS9.2以后的版本中将NUMCPUVPS、NOAGE、AFF_NPROCS、AFF_SPROC、NUMAIOVP用VPCLASS参数代替。当InformixIDS处于online的状态下,可以使用onmode-p(+/-)#来增加或者减少虚拟处理器。#代表增加或者减少虚拟处理器的个数。

  3.对于网络处理器参数的配置

  NETTYPE:定义了InformixIDS的连接类型和连接可以连接的轮询线索数目。如果sqlhosts文件中支持一个以上的接口或协议的连接,就必须对每个连接类型规定独立的NETTYPE参数。

  轮询线索可以在两类VP上运行:NETVP和CPUVP。为得到最佳性能,Informix建议使用NETTYPE表项为CPUVP类只分配一个轮询线索,将其余轮询线索轮询线索分配给NETVP。分配给任何一种连接类型的轮询线索不得超过NUMCPUVPS的取值。

  事务处理调优

  数据库的日常运行过程中可能面临多个用户同时对数据库的并发操作带来的数据不一致的问题,如:丢失更新、脏读和不可重复读等。并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致。

  数据库应用程序将其工作分成若干个事务进行处理。当一个事务执行时,它访问数据库并执行一些本地计算。开发人员可以假设每一个事务都会被隔离地执行—没有任何并发动作。因为隔离的概念提供了透明性,这种对事务处理方式的保证有时被称为原子性保证。但是,如果把应用程序中的事务序列作为一个整体来看,则并没有上面所说的那种保证。在一个应用程序执行的两个事务之间,可能会执行另外一个应用程序的事务,而且第二个应用程序的执行可能修改了第一个应用程序中的两个事务(或其中的一个)需要访问的数据项。因此,事务的长度对保证正确性有着重要影响。

  尽管将事务切分成较小粒度可以提高执行效率,但会因此破坏执行的正确性。这种性能和正确性之间的矛盾充斥并发控制的整个调优过程。考虑事务的性能我们要考虑到:事务使用的锁的个数(在所有其他条件相同的情况下,使用的锁个数越少,性能越好);锁的类型(读锁对性能更有利);事务持有锁的时间长短(持有时间越短,性能越好)。

  NETTYPE的配置格式如下:NETTYPEconnection_type,poll_threads,c_per_t,vp_class。其中,connection_type标识轮询线索分配的连接协议;poll_threads是分配给该连接类型的轮询线索数目,对任何连接类型,这个值不能超过NUMCPUVPS值;c_per_t是每个轮询线索的连接数目,可以用如下公式计算这个值:c_per_t=connections/poll_threads;connections是所希望指定的连接类型支持的最大连接数。对于共享内存连接(ipcshm),该值应该加倍以获得最好的性能;vp_class是可运行轮询线索的VP类,如果CPUVP上只运行一个轮询线索,那么指定为CPUVP。

  在对虚拟处理器的监控中,可以通过系统的一些命令,也可以通过数据库的一些命令,常用的数据库命令是onstat-grea和onstat-gioq。

  以下是onstat-grea的输出:

  /usr/informix>onstat-grea

  InformixDynamicServerVersion9.30.FC5--On-Line--Up36days00:22:32-

  -5352416Kbytes

  Readythreads:

  tidtcbrstcbprtystatusvp-classname

  onstat-grea监控了就绪队列中的线程数目。包括准备运行而且在等待资源的线程。理想的状态下是输出极少的条目或者不显示任何条目。如果输出的某种VP类条目持续增长,那么就要考虑在该类中添加VP。

  在onstat-giog指令的输出中,最需要关注的列是len列。len列的值应该总是为0或接近于0。如果该列的值很高并持续增长,那么我们可能需要添加另一个AIO/KAIO虚拟处理器来减少磁盘I/O负载。

  监控虚拟处理器的方法比较多,可以使用InformixIDS查询语句在系统表中找到虚拟处理器的使用情况:还可以在Unix操作系统中使用系统命令sar、top等来监控操作系统的CPU使用情况;还可以在一段时间内的重复执行InformixIDS命令onstat-gglo来监控各个虚拟处理器已占用的CPU资源。判断CPU的忙闲。

  内存使用效率的参数调整和监控

InformixIDS使用的内存部分被数据库服务器线程以及其他用户和虚拟进程共享,所以这部分的内存叫做共享内存,共享内存减少磁盘I/O,提供了最快地进行进程间通信的方法,还可以使数据库服务器减少总的内存使用。

  InformixIDS使用的内存部分被数据库服务器线程以及其他用户和虚拟进程共享,所以这部分的内存叫做共享内存,共享内存减少磁盘I/O,提供了最快地进行进程间通信的方法,还可以使数据库服务器减少总的内存使用。

  InformixIDS共享内存分为四个部分:驻留部分、虚处理部分、消息部分和虚拟扩展区部分,其中消息部分只有在客户机和服务器采用共享内存方式连接时才有,而且尺寸很小。虚拟扩展区也极小,它包含了用于DataBlade模块的线程heaps和其他在用户定义的虚拟处理器中运行的用户定义例程。

  1.驻留内存部分的参数

  驻留内存部分又可以细分为:共享内存头、缓冲区,逻辑日志缓冲区、物理日志缓冲区、锁。

  共享内存头在共享内存中包含所有其他结构的描述,还包含到这些结构位置的指针共享内存头是在初始化InformixIDS时创建的,并且不能进行调优。

  缓冲区存储InformixIDS从dbspace所读取的数据,是数据库对象数据,如表的数据或索引数据。缓冲区占用了驻留内存中最大的部分。所有的缓冲区被组织到一个较长的最近最少使用(least-recently-used,LRU)缓冲区队列中,并通过最近最少使用(LRU)机制进行管理。定义缓冲区的参数是BUFFERS。称作指定共享内存缓冲区的最大数目,该参数对数据库I/O和事务处理吞吐量有明显的影响。但是,如果分配过多的缓冲区会影响到操作系统的内存并导致过多的交换内存页面的活动。一般建议设置为物理内存的20%到25%。

  逻辑日志缓冲区是用来存储最后一次备份开始的逻辑日志记录的。逻辑日志记录保存了SQL语句对数据库数据进行的修改。在初始化InformixIDS时,它创建三个逻辑日志缓冲区,以循环方式运作,来确保将获得的每一条逻辑日志记录都被刷新到磁盘中。LOGBUFF定义了逻辑日志缓冲区的数量,缓冲区的大小决定了它被添满的频率,从而决定了它必须被刷新到硬盘上的逻辑文件中的频率。一般情况下,InformixIDS建议设置为16KB或32KB

  物理日志缓冲区在InformixIDS修改或着删除记录之前,将该记录的原始值存入到物理日志缓冲区中,在事务失败时,用于恢复数据,以保持数据的一致性。在InformixIDS初始化时,创建了两个物理日志缓冲区,也以循环的方式运作。与物理日志缓冲区对应的参数是PHYSBUFF。

  锁包含可用锁的数量,每个用户对数据库的连接并执行数据库的操作,都需要一定数量的锁。在InformixIDS9.2以后的版本中,当用户的锁不够时,可以动态的分配锁的数量。在以前的版本中,该数值是固定不变的。与锁对应的参数是LOCKS。一般情况下设置为2000到8000000个。

  2.共享内存虚拟存储区的参数

  共享内存虚拟存储区存储各种各样的不同数据,可以分为:内部表、较大的缓冲区、会话数据、线程数据(堆栈和堆)、数据分布缓存器、字典缓存器、SPL例程缓存器、SQL语句缓存器、排序池、全局池。

  影响虚拟存储区的参数是:SHMADD、SHMVIRTSIZE、STACKSIZE。

  SHMVIRTSIZE定义了分配给InformixIDS共享内存的虚拟存储区的大小。InformixIDS在处理大型查询或高峰负荷的需要增加共享内存给虚拟存储区,但是共享内存的分配需要增加事务处理的时间,故在设置SHMVIRTSIZE值时,一般考虑能满足一个日常操作的需要。

  STACKSIZE指示了数据库服务器为每个活动线程指派的初始堆栈的大小。如果将该参数配置得过小,那么线程将无法拥有执行其程序的足够内存空间,而且它将干扰其他线程。

  SHMADD定义了InformixIDS自动加到虚拟存储区的共享内存增量的大小。在增加共享内存时,要占用CPU周期;每次的增加量越大,增加次数就越少,留给其它的进程的内存也越少。所以一般采用大的增加量。但是在内存负荷很重时,少量增加使其他程序更好的共享内存资源。所以,如果实际内存小于等于256MB,则建议SHMADD使用缺省值8192KB;如果在256MB到512MB之间,则设置为16384KB;如果大于512MB,则设置为32768KB。

  可以用命令onstat-gseg来显示IDS当前共享内存虚拟区中的段的数目。

  InformixIDS在初始化时,如果定义的虚拟内存区尺寸太小,会自动向虚拟区附加其他操作系统段,虚拟内存中的段过多从而引起数据库的整体性能下降。所以在初始化时,将虚拟内存区的尺寸配置得足够大,以避免进行动态的分配共享内存段。在该列的输出中,class列为R是驻留内存段,V是虚拟内存段,M是消息内存段。如果显示的虚拟内存段多于三个,那么就需要提高配置文件中SHMVERSIZE参数的值。

  命令onstat-p是监控内存的另一个命令。其输出结果中的两个%cache显示了读写高速缓存比例的百分比,一般在80%到90%之间,如果低于80%,要调节BUFFERS参数值。ovlock字段表明IDS在使用了最大数量的锁之后尝试过再使用锁的次数,如果该数字非零,可能需要提高配置文件中LOCKS参数的值。ovbuf字段表明IDS在使用了最大数量的缓冲区之后尝试过再使用缓冲区的次数。如果该数字很大,比如说超过100000,就需要提高BUFFERS参数,以便用户在需要从磁盘访问数据时不必等待缓冲区。在监控内存的使用情况时还可以采用Unix系统命令vmstat。

  存储器及I/O的参数调整和监控

nformixIDS支持两种基本的数据存储设备裸设备和文件系统,建议使用裸设备存储数据文件。与文件系统相比,裸设备在存取数据时要快得多,而且对用户来说是看不到裸设备文件的,要安全一些。使用文件系统作为数据存储设备还有一个潜在的危险

  InformixIDS支持两种基本的数据存储设备裸设备和文件系统,建议使用裸设备存储数据文件。与文件系统相比,裸设备在存取数据时要快得多,而且对用户来说是看不到裸设备文件的,要安全一些。使用文件系统作为数据存储设备还有一个潜在的危险,当文件系统由于某些操作系统的错误而崩溃,且有一个数据库事务正在进行时,数据库服务器将认为数据库事务已经成功完成,但实际上,该事务正陷入操作系统缓冲区中,这最终将导致数据库中的某些不一致。

  InformixIDS在dbspace中存取数据,dbspace又包含一个或多个chunk(块)。在9.40以后的版本中chunk的大小可以超过2G,在以前的版本中不能超过2G。可以使用onsta-d监控dbspace和chunk的使用情况和状态。

  与I/O参数调整直接相关的是检查点。检查点是使磁盘上的页与共享内存缓冲池中的页同步的过程。检查点时间包含检查点间隔时间和检查点持续时间。在检查点期间,IDS阻止用户线程进入临界会话,并阻止所有的事务活动。因此,检查点持续时间过长,用户会经历系统挂起。

  CKPTINTVL参数指定检查点之间的时间间隔。当检查点间隔到了,则系统执行检查点操作。

  PHYSFILE指定物理日志的大小。一旦物理日志(PHYSFILE)的75%已满,检查点也会发生。

  LRUS参数指示共享内存缓冲池中设置的最近最少使用(LRU)队列数目。

  可以用LRUS和LRU_MAX_DIRTY及LRU_MIN_DIRTY来控制在满的检查点之间页被刷新到磁盘的频度。在某些情况下,通过设置这些参数,使得在检查点发生时需要刷新修改的页数量很少,可以达到高的吞吐量;假如检查点持续时间始终超过10秒甚至以上,那么可能需要减少LRU_MIN_DIRTY和LRU_MAX_DIRTY配置参数的值以获取更短的检查点持续时间。可以使用onstat-R和onstat-P、onstat-F命令的输出来确定参数值的大小。一般情况下LRU_MIN_DIRTY设置为50,LRU_MAX_DIRTY设置为70。

  调整InformixIDS参数来优化数据库性能,是InformixIDS性能优化的一个方面,它的性能调优还要从网络、硬件、操作系统、应用程序等多个方面来综合考虑,其性能的优化是一个高度复杂,异常繁琐而且涉及面很广的综合性工作,而且它们之间相互关联,相互影响。在调整过程中,应该明确数据库的运行状况和系统资源的使用情况,确定问题的瓶颈出现在哪里。然后根据问题的所在来优化数据库的性能。数据库参数的调整是数据库优化的一个方面,在此只是想起到一个抛砖引玉的作用。

     共享内存虚拟存储区的参数

  共享内存虚拟存储区存储各种各样的不同数据,可以分为:内部表、较大的缓冲区、会话数据、线程数据(堆栈和堆)、数据分布缓存器、字典缓存器、SPL例程缓存器、SQL语句缓存器、排序池、全局池。

更多详细内容尽在课课家哦!

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程