Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104595135
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-04-03 20:18:10

 出处:Unix爱好者家园unix-cd.com   

简介

IDS 的基本体系结构包括三个主要组件:数据存储器、内存结构和后台处理器或虚拟处理器。本文将详细地讨论每一个组件,并提供一些关于如何主动监控数据库引擎的性能,以及如何更为积极主动地进行调优的实用技巧。 确切地说,本文将详细地讨论下列主题:

  • 数据存储器及调优指南
  • 内存结构及调优指南
  • 后台处理器及调优指南

    数据存储器及调优指南

    磁盘是 IDS 的基本数据存储设备。IDS 可以使用两种类型的磁盘设备:成熟的(cooked)磁盘设备和原始的(raw)磁盘设备。成熟的磁盘设备指的是安装到操作系统的磁盘区域,其中包含了常规文件和文件系统。成熟的磁盘设备对用户来说是可视的。在 Unix 系统中,您可以使用命令 df -k 来显示系统上的所有成熟磁盘设备。例如:

    sys3508:omcadmin > df -k
    Filesystem kbytes used avail capacity Mounted on
    /dev/md/dsk/d0 1094523 669404 370393 65% /
    /dev/md/dsk/d8 7560147 5601614 1882932 75% /usr
    /proc 0 0 0 0% /proc
    fd 0 0 0 0% /dev/fd
    mnttab 0 0 0 0% /etc/mnttab
    /dev/md/dsk/d36 2285263 1440973 798585 65% /var
    swap 1025776 8 1025768 1% /var/run
    swap 1060400 34632 1025768 4% /tmp
    /dev/md/dsk/d16 10912273 6242461 4560690 58% /usr/gsm/ne_data
    /dev/md/dsk/d12 3009327 1121085 1828056 39% /usr/gsm/logs

    以上输出指出了系统上所有的成熟磁盘设备。Filesystem 列显示了所有成熟磁盘设备,而 Mounted on 列显示了相应设备上安装的所有文件系统。例如,设备 /dev/md/dsk/d0 安装在 / 或根文件系统上,/dev/md/dsk/d36 安装在 /var 文件系统上,/dev/md/dsk/d16 安装在 /usr/gsm/ne_data 文件系统上等。Kbytes 列展示了该设备所占的磁盘总空间,used 展示了该设备当前已使用的磁盘空间,而 avail 列则展示了该设备可用的剩余磁盘空间。另一方面,原始磁盘设备指的是无法安装到操作系统的磁盘片,对用户来说是不可视的。Informix 建议尽可能地使用原始磁盘设备,因为原始磁盘设备不用安装到操作系统上,并可以将数据服务器内存中的数据直接传送到磁盘上,而无需先将之复制到操作系统的内存池中,这比成熟的磁盘设备要快得多。此外,原始设备比成熟设备安全,因为对用户而言,它们是不可视的(除了 root 用户)。使用文件系统作为数据存储设备有一个潜在的危险,当文件系统由于某些操作系统的错误而崩溃,且有一个数据库事务正在进行时,数据库服务器将认为数据库事务已经成功完成,但实际上,该事务正陷入操作系统缓冲区中;这最终将导致数据库中的某些不一致。关于如何为 IDS 分配成熟和原始磁盘设备的详细过程,请参阅 IBM Informix Dynamic Server Administrator's Guide,Version 9.4(本文后面将称作 Administrator's Guide)。

    Informix Dynamic Server 在 dbspace 中存储其数据。dbspace 是 Informix 的数据存储单元,它包含一个或多个块(chunk),更确切地说是由一个或多个块来支持。块(chunk)在术语上是指磁盘上的连续空间。在 IDS 9.40 之前的 IDS 版本中,对于块的最大长度具有一个硬限制;一个块不能超过 2 G。从 IDS 9.40 开始,如果在大块(large chunk)模式下配置 IDS,则取消这一限制。这是一项革命性的提高;通过这项提高,IDS 可以更有效地利用磁盘空间,并更容易地管理它们。IDS 使用 onspaces 实用程序来配置和管理 dbspaces。以下是 onspaces 实用程序的用法:

    $ onspaces --
    Usage:
    onspaces { -a spacename -p path -o offset -s size [-m path offset]
    { { [-Mo mdoffset] [-Ms mdsize] } | -U }
    } |

    { -c { -d DBspace [-t]
    -p path -o offset -s size [-m path offset] } |
    { -b BLOBspace -g pagesize
    -p path -o offset -s size [-m path offset] } |
    { -S SBLOBspace [-t]
    -p path -o offset -s size [-m path offset]
    [-Mo mdoffset] [-Ms mdsize] [-Df default-list] } |
    { -x Extspace -l Location } } |

    { -d spacename [-p path -o offset] [-f] [-y] } |

    { -f[y] off [DBspace-list] | on [DBspace-list] } |

    { -m spacename {-p path -o offset -m path offset [-y] |
    -f filename} } |

    { -r spacename [-y] } |

    { -s spacename -p path -o offset {-O | -D} [-y] } |

    { -ch sbspacename -Df default-list } |

    { -cl sbspacename }

    -a - Add a chunk to a DBspace, BLOBspace or SBLOBspace
    -c - Create a DBspace, BLOBspace, SBLOBspace or Extspace
    -d - Drop a DBspace, BLOBspace, SBLOBspace, Extspace, or chunk
    -f - Change dataskip default for specified DBspaces
    -m - Add mirroring to an existing DBspace, BLOBspace or SBLOBspace
    -r - Turn mirroring off for a DBspace, BLOBspace or SBLOBspace
    -s - Change the status of a chunk
    -ch - Change default list for smart large object space
    -cl - garbage collect smart large objects that are not referenced
    default-list = {[LOGGING = {ON|OFF}] [,ACCESSTIME = {ON|OFF}]
    [,AVG_LO_SIZE = {1 - 2097152}] }

    只有用户 Informix 或具有 DBA 权限的用户可以使用此实用程序。

    那么,我们该如何配置 dbspaces 呢?没有一套硬性规则;适当的配置应基于您系统上的可用磁盘。但是为了最优化整体性能,Informix 为我们提供了一些指南,其中最为关键的就是为不同的数据配置不同的 dbspace。我们可以将 IDS 数据分成下列几类:

  • 逻辑日志数据;由逻辑日志生成的数据;
  • 物理日志数据;由物理日志生成的数据;
  • 表数据;数据库表中的数据;
  • 索引数据;由表上的索引生成的数据;
  • 二进制对象数据,如大型文本和内部图形;
  • 临时数据;通过对表进行排序、更改和创建索引而生成的数据。

    首次初始化 IDS 时,它会将其所有的数据、逻辑日志数据、物理日志数据和其他临时数据放置在根 dbspace 中。为了获得高性能,我们需要创建不同的 dbspaces,并且将逻辑日志数据和物理日志数据从 rootdbspace 移出。将索引数据从表数据中分离出来也是有益的。在为临时数据创建临时 dbspace 之后,Informix 还建议将 DBSPACETEMP 配置参数设置为您系统上所配置的多个临时 dbspace 的名称,这将减少磁盘 I/O,如果将 PDQPRIORITY 设置为大于 0 的值,这将提高创建临时表的速度,并允许并行排序或插入。

    另一重要指南就是在磁盘中分散 dbspace。这当然要受到硬件拓扑的限制,但其思想就是将关键的 dbspace(例如根 dbspace、逻辑日志 dbspace 和物理日志 dbspace)放置在更快的磁盘上,因为那些 dbspace 将进行大多数的磁盘 I/O 活动,并且也会将磁盘 I/O 负载均衡地分散在磁盘中。创建了合适的 dbspace 之后,我们需要不断地监控那些 dbspace 上的磁盘 I/O 活动,识别是否存在过热点(hot spot),并且在必要时对其进行调优,以获取更好的性能。

    Dbsapce I/O 是通过磁盘读写来衡量的。如果某些 dbspace 具有较多的磁盘读写,而其他磁盘却较为空闲,那么该系统可能存在磁盘 I/O 瓶颈。较为平衡的 dbspace I/O 将缓解系统磁盘 I/O 负载,从而提高系统的整体性能。下列脚本将显示当前每个 dbspace 的 I/O 统计信息:

    select d.name, fname[15,25] path_name, sum(pagesread) diskreads,
    sum(pageswritten) diskwrites
    from syschkio c, syschunks k, sysdbspaces d
    where d.dbsnum = k.dbsnum
    and k.chknum = c.chknum
    group by 1, 2
    order by 1

    其输出结果如下:

    name path_name diskreads diskwrites

    airgen_10_0 uild95/ltmp 3672 7964
    airgen_main_dbs uild95/ltmp 13545 32903
    llog uild95/ltmp 19 51633
    rootdbs uild95/ltmp 211 43117
    temp1 uild95/ltmp 3015 3122
    temp2 uild95/ltmp 3218 3317

    您可以通过查询 sysmaster 数据库中的 sysptprof 表,进一步确定哪些表具有多数磁盘读写:

    select dbsname, tabname, (isreads + pagreads) diskreads, (iswrites + pagwrites)
    diskwrites
    from sysptprof
    order by 3 desc, 4 desc

    其输出如下所示:

    dbsname tabname diskreads diskwrites

    airgen_10_0 fanout_param 84567 3094
    airgen_main_dbs sysindices 78381 0
    airgen_10_0 ne_nmo_i 75819 5
    airgen_10_0 ne_nmo 75440 297
    airgen_main_dbs ne_main 62610 28322
    airgen_10_0 systables 37342 466
    airgen_10_0 syscolumns 34539 4609
    airgen_10_0 457_484 32838 42
    airgen_10_0 453_480 30009 1
    airgen_main_dbs syscolumns 29531 4550
    airgen_10_5 syscolumns 28824 4552
    airgen_10_0 456_483 25448 14
    airgen_10_0 458_485 23278 177
    airgen_main_dbs 452_483 22412 31

    基于该查询所获得的输出,您可以发现 airgen_cm_db 数据库中的 ne_main 表具有最多磁盘 I/O,如果当前 dbspace 所承受的磁盘 I/O 过于繁重,那么可以考虑将该表移到另一 dbspace 中。

    内存结构及调优指南

    内存结构是 IDS 体系结构中最为复杂的组件。因为 IDS 使用的内存部分被数据库服务器线程以及其他用户和虚拟进程共享,因此该部分内存通常被称作共享内存。由于参与进程(在本例中是虚拟处理机)不需要维护共享内存中的私有数据副本,共享内存可以使数据库服务器减少总的内存使用。共享内存还能减少磁盘 I/O,这是因为作为公共池来管理的缓冲区,是在数据库服务器级基础上而不是在每进程基础上被刷新的。而且,因为这些数据已经作为前面读取操作的结果存在于共享内存中了,所以虚拟进程通常可以避免从磁盘读取数据。磁盘 I/O 的减少也减少了执行时间。共享内存提供了最快地进行进程间通信的方法,因为它以内存转换的速度来处理读写消息。

    在初始化 IDS 时,它就创建了共享内存,其中包括以下 4 个区(portion):

  • 常驻区(resident portion);
  • 虚拟区(virtual portion);
  • IPC 通信或消息区(IPC communications or message portion);
  • 虚拟扩展区(virtual-extension portion)。

    现在,让我们仔细地看看每一部分,并查看其内容以及它们分别是如何工作的。

    常驻部分存储数据库服务器运行时大小固定的数据结构,它具有下列几个部分:

  • 共享内存头
  • 缓冲池
  • 逻辑日志缓冲区
  • 物理日志缓冲区
  • 锁表

    共享内存头包含共享内存中所有其他结构的描述,包括内部表和缓冲池。它还包含到这些结构位置的指针。当一个虚拟进程首次附加到共享内存中时,它读取共享内存头中的地址信息,获取指向其他所有结构的方向。共享内存头是在初始化 IDS 时创建的,并且不能进行调优。缓冲池存储 IDS 从 dbspace 所读取的数据,更确切地说是数据库对象数据,例如表数据和索引数据,或者是从磁盘所读取的存储过程。然后,ESQL 或其他客户程序将操作该数据。

    缓冲池占用了常驻区中最大的部分。所有的缓冲区将被组织到一个较长的最近最少使用(least-recently-used,LRU)缓冲区队列中,并通过最近最少使用(LRU)机制进行管理。缓冲区的获取是通过使用锁存器(latch)和锁访问信息来管理的,该锁存器称作 mutex。逻辑日志缓冲区是用来存储最后一次备份开始的逻辑日志记录的。

    逻辑日志记录保存了 SQL 语句对数据库数据进行的修改。在初始化 IDS 时,它创建三个逻辑日志缓冲区。那些逻辑日志缓冲区以循环方式起作用,以确保将获得的每一条逻辑日志记录都被刷新到磁盘中。物理日志缓冲区被用来保存缓冲池中已修改数据库记录的前映像(before-image)。在 IDS 删除或修改一条数据库记录之前,它将捕获这一原始记录的快照并存储其原始值,以防事务失败。这就称作前映像(before-image),被用于恢复数据,确保了数据库的完整性。在初始化 IDS 时,它创建了两个物理日志缓冲区,而它们与逻辑日志缓冲区一样,以循环方式运作。锁表是一个包含可用锁的池;每个用户会话都需要一定数量的锁来连接数据库服务器并执行数据库操作,例如 select、insert、delete 和 update。

    除了共享内存头之外,所有这些部分都是可以控制并用 Informix 配置参数进行调优的。下表列举了与 IDS 共享内存的常驻区有关的所有配置参数:

  • 常驻区 参数
    缓冲池 BUFFERS
    逻辑日志缓冲区 LOGBUFF
    物理日志缓冲区 PHYSBUFF
    锁表 LOCKS
    整个区 RESIDENT

    BUFFERS 指定共享内存缓冲区的最大数目;LOCKS 指定用户会话可以使用的锁的最大数目。该数目过去是固定不变的,但在 IDS 的后来版本(IDS 9.20 以及更高版本)中,当用户会话缺少锁时,就可以动态地分配锁。LOGBUFF 指定逻辑日志缓冲区的大小,而 PHYSBUFF 指定物理日志缓冲区的大小。RESIDENT 指定数据库服务器共享内存的常驻区的位置;无论我们是在系统上的物理 RAM 中锁定它,还是让操作系统决定在 RAM 还是在虚拟内存中放置它,Informix 总是建议尽可能地在系统的物理 RAM 中锁定常驻区,以避免操作系统与磁盘交换共享内存的常驻区,从而取得更好的性能。

    共享内存的虚拟区十分复杂;它存储各种各样的不同数据。以下是共享内存的虚拟区存储的数据列表:

  • 内部表
  • 较大的缓冲区
  • 会话数据
  • 线程数据(堆栈和堆)
  • 数据分布缓存器
  • 字典缓存器
  • SPL 例程缓存器
  • SQL 语句缓存器
  • 排序池
  • 全局池

    内部表是在初始化 IDS 时创建的。一共有 7 种内部表。那些内部表的目的和功能是为了记录共享内存资源的状态和使用,例如缓冲区、块、dbspace、事务等。较大的缓冲区用于大型的读写 I/O 操作。例如,若数据库服务器试图执行一系列连续的读取(light scan),或者将存储在 dbspace 中的简单大对象读取到共享内存中,那么 IDS 将为该操作分配较大的缓冲区。会话数据也称作会话控制块,它存储会话 ID、用户 ID、客户机的进程 ID、主计算机名称以及客户机应用程序请求连接到数据库服务器时的各种状态标志。线程数据指的是会话的线程信息、有关该会话的基本线程和其他线程信息。它包括与该线程堆栈和堆有关的信息。排序池用于下列操作:

  • 包含连接、分组、聚集和排序操作的决策支持查询
  • 索引构建
  • SQL 中的 UPDATE STATISTICS 语句

    数据库服务器分配给排序的虚拟共享内存的数量取决于要进行排序的行数、每一行的大小以及是否为服务器设置了 PDQPIORIDY。全局池存储对于数据库服务器来说是全局性的结构。例如,全局池包含消息队列,其中用于网络通信的 poll 线程存放来客户机的消息。sqlexec 线程从全局池中取得消息并加以处理。所有那些区域基本上都是由 IDS 本身来控制和管理的;我们几乎不用做任何事情。

    但是,我们控制所有类型的缓存器,数据分布缓存器、字典缓存器、SPL 例程缓存器和 SQL 语句缓存器。我们还控制尺寸过大的虚拟内存。控制那些部分的方法就是调优下列配置参数:

    虚拟内存区域 参数
    数据分布缓存器 DS_POOLSIZE
    DS_HASHSIZE
    数据字典缓存器 DD_HASHSIZE
    DD_HASMAX
    SPL 或 UDR 例程缓存器 PC_HASHSIZE
    PC_POOLSIZE
    SQL 语句缓存器 STMT_CACHE
    STMT_CACHE_SIZE
    总的虚拟内存 SHMADD
    SHMTOTAL
    SHMVERSIZE
    STACKSIZE

    虚拟区可以通过数据库服务器得到较大扩展,并且可以通过操作系统将虚拟区页移出(page out)磁盘。当数据库服务器处于联机状态并执行操作时,如果虚拟区的初始尺寸太小,数据库服务器会自动向虚拟区附加其他操作系统段。虚拟内存中的段过多将使整体性能下降。因此,Informix 建议在初始化 IDS 时,将虚拟内存区的尺寸配置得足够大,以避免进行动态的段分配。命令 onstat -g seg显示 IDS 当前共享内存虚拟区中的段的数目。以下是该命令的输出示例:

    Informix Dynamic Server 2000 Version 9.21.UC4 -- On-Line -- Up 28 days 15:49:33 -- 205824 Kbytes

    Segment Summary:
    id key addr size ovhd class blkused blkfree
    0 1381386241 a000000 177209344 220688 R 42984 280
    1 1381386242 14900000 8388608 856 V 2048 0
    2 1381386243 15100000 1048576 632 M 164 92
    3 1381386244 15200000 8388608 856 V 2048 0
    4 1381386245 15a00000 8388608 856 V 2008 40
    5 1381386246 16200000 8388608 856 V 50 1998
    Total: - - 211812352 - - 49302 2410

    (* segment locked in memory)

    我们感兴趣的是输出的 class 列。这里的每个 V 条目都指示一个段,因此,该输出显示了过多的(通常为 5 个)段,这意味着我们配置的虚拟区的初始尺寸太小,需要增加它来获得更好的性能。您也可以使用输出的 size 列来估计虚拟区将使用多少内存,但是 Informix Administrator's Guide 提供了估算共享内存虚拟区的更准确的公式。Stacksize 也是一个极其重要的配置参数,它指示了数据库服务器为每个活动线程指派的初始堆栈的大小。如果将该参数配置得过小,那么线程将无法拥有执行其程序的足够内存空间,而且它将干扰其他线程。有关如何估算和配置 stacksize 参数的细节,请参阅 Administrator's Guide。Informix 同样建议配置所有的缓存器,以获取更好的性能。有关的详细信息,请参阅 Administrator's Guide。

    如果您至少将一个连接配置为 IPC 共享内存连接,那么在初始化 IDS 时将分配处理器间的通信或消息区。通信区包含本地客户机应用程序的消息缓冲区,这些应用程序使用共享内存与数据库服务器进行通信。该区的尺寸相当小,可用 12kb 乘以共享内存通信(NETTYPE ipcshm)所需的预期连接数目来计算该尺寸。如果未指定 NETTYPE ipcshm,那么所期望的连接数目的默认值为 50。虚拟扩展区也极为小;它包含了用于 DataBlade 模块的线程 heaps 和其他在用户定义的虚拟处理器中运行的用户定义例程。

    在配置 IDS 内存时,我们需要考虑总的可用内存,包括物理 RAM 、虚拟内存和系统上的日常负载。如果我们给 IDS 分配过多的内存,这将有损于一些系统操作,但是如果我们不给 IDS 分配足够的内存,那么将有损于数据库服务器。在这里,我们给出的指导方针是,不断监控系统内存的使用,查看系统是否因分页而受损。在 Unix 系统中,我们可以使用 vmstat 来监控内存的使用。以下是输出示例:

    sys3508:omcadmin > vmstat 1 10
    procs memory page disk faults cpu
    r b w swap free re mf pi po fr de sr m0 m1 m4 m5 in sy cs us sy id
    0 0 0 1047536 371088 242 1980 19 28 19 0 0 0 0 0 0 1036 9748 2379 11 7 82
    5 0 0 692488 67704 346 3997 0 56 32 0 0 0 0 0 0 5118 25093 7623 70 19 11
    3 0 0 693024 67816 168 1800 0 16 16 0 0 0 0 0 0 6409 26068 7839 72 23 5
    3 0 0 692848 67896 204 2151 0 32 24 0 0 0 0 0 0 6138 25327 7215 79 17 3
    4 0 0 692800 67824 196 2174 0 32 24 0 0 0 0 0 0 5533 23952 7610 74 21 6
    2 1 0 695248 70272 281 2896 0 32 24 0 0 0 0 0 0 5421 28503 8094 70 21 9
    2 1 0 695608 70416 212 2215 0 32 24 0 0 0 0 0 0 5535 24086 7855 75 16 9

    输出的 page 部分指示系统的当前分页状态;pi 列指示读入内存的页数目,而 po 列则指示移出内存的页数目。如果有较多 po,例如几千页,那么您的系统就可能缺乏内存。在系统高峰时期多次执行该命令,查看系统是否因分页而受损。

    后台处理器及调优指南

    在数据存储器和内存结构之间,有许多虚拟或后台处理器忙于处理 SQL 语句。虚拟处理器对数据库服务器的作用类似于 CPU 对计算机的作用。正如一个 CPU 允许多个操作系统进程来服务多个用户一样,一台数据库服务器虚拟处理器也可以运行多个线程来为多个 SQL 客户机应用程序提供服务。有关虚拟处理器及其功能的完整列表,请参阅 Administrator's Guide。

    在所有虚拟处理器中,下列 3 种最为重要:

  • CPU
  • AIO
  • 网络处理器

    让我们分别仔细地看一看这 3 种虚拟处理器。CPU 虚拟处理器是最重要的 IDS 虚拟处理器;它驱动其他虚拟处理器,如磁盘 I/O 虚拟处理器和 IDS 会话中的所有线程。AIO 的功能是在 SQL 语句访问或更新数据库数据时,执行磁盘 I/O。网络处理器进行到数据库服务器的客户机或用户连接。可以进行两种类型的连接:共享内存连接和网络连接。可以通过在配置文件中调优下列参数来控制和管理那些虚拟处理器:

    虚拟处理器 参数
    CPU MULTIPTOCESSOR
    SINGLE_CPU_VP
    VPCLASS
    AIO/KAIO NUMAIOVPS
    NETWORK NETTYE

    MULTIPROCESSOR 和 SINGLE_CPU_VP 指定您的机器是否有一个或多个处理器(CPU)。VPCLASS 是 IDS V9.2 和更高版本中的新参数。该参数用于取代几个旧的参数,例如 NUMCPUVPS、NUMAIOVPS、NOAGE、AFF_SPROC 和 AFF_NPROCS。虽然 IDS 仍然支持这些旧参数,但是 Informix 建议您使用 VPCLASS。该参数为每个类别配置虚拟处理器的数目,并指定系统是否想用数据库服务器进程来绑定物理 CPU 处理器,Informix 极力推荐通过这种方法提高性能。NUMAIOVP 指定系统上 AIO/KAIO 虚拟处理器的数目;如果您对 dbspace 使用原始磁盘空间,通常将 UMAIOVP设置为 2 就足够了,但是,如果您对 dbspace 使用成熟的磁盘空间,那么应将之设置为系统上块的数目。NETTYPE 指定 IDS 的连接类型和网络虚拟处理器的数目。当 IDS 处于联机状态时,可以使用 onmode -p来添加或删除虚拟处理器。例如:

    onmode -p +4 cpu

    该命令将向数据库服务器添加 4 个 CPU 虚拟处理器。" + " 号表示添加,而 " - " 号则表示删除。

    那么,我们如何监控那些虚拟处理器的性能,以及如何主动调优呢?我们可以使用下列两个 onstat 命令来监控虚拟处理器:

    onstat -g rea
    onstat -g ioq

    第一个命令监控就绪队列中的线程数目。就绪队列包含准备运行但在等待必要资源(如 CPU 等)的线程。以下是其输出示例:

    Ready threads:
    tid tcb rstcb prty status vp-class name
    6 536a38 406464 4 ready 3cpu main_loop()
    28 60cfe8 40a124 4 ready 1cpu onmode_mon
    33 672a20 409dc4 2 ready 3cpu sqlexec

    理想的输出应显示极少的条目,或者不显示任何条目。如果某个 VP 类的输出条目持续增长(例如,在以上输出中,CPU VP 类有 3 个条目),那么我们就需要考虑在该类中添加更多 VP。

    第二个命令显示磁盘 I/O 信息,并有助于确定是否需要增加 AIO/KAIO 虚拟处理器。例如:

    onstat -g ioq
    AIO I/O queues:
    q name/id len maxlen totalops dskread dskwrite dskcopy
    adt 0 0 0 0 0 0 0
    msc 0 0 1 12 0 0 0
    aio 0 0 4 89 68 0 0
    pio 0 0 1 1 0 1 0
    lio 0 0 1 17 0 17 0
    kio 0 0 0 0 0 0 0
    gfd 3 0 3 254 242 12 0
    gfd 4 0 17 614 261 353 0

    我们感兴趣的是输出的 len 列。该列的值应该总是为 0 或接近于 0。如果该列的值很高并持续增长,那么我们可能需要添加另一个 AIO/KAIO 虚拟处理器来减少磁盘 I/O 负载。我们还可以使用 SMI 表来监控虚拟处理器。有关详细信息,请参阅 Administrator's Guide。

    在配置和调优虚拟处理器时,我们需要在脑海里勾画出整个系统的图像。虚拟处理器的数目,特别是 CPU 虚拟处理器的数目应该与系统中物理 CPU 成合适的比例。否则,您的系统将受到损害,整体性能也将下降。根据经验,为机器上的每个物理 CPU 设置的 CPU VP 数目应该总是不超过 2 个。

  • 阅读(724) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~