Chinaunix首页 | 论坛 | 博客
  • 博客访问: 312149
  • 博文数量: 94
  • 博客积分: 2220
  • 博客等级: 大尉
  • 技术积分: 975
  • 用 户 组: 普通用户
  • 注册时间: 2004-12-17 21:17
文章分类

全部博文(94)

文章存档

2011年(5)

2010年(11)

2009年(1)

2008年(2)

2006年(1)

2005年(65)

2004年(9)

我的朋友

分类: DB2/Informix

2005-07-11 10:29:53

Informix 高级培训教材(二)

2.3.3. 影响性能的I/O 的参数
CHUNK 
DBSPACES 的配置
在整个I/O 过程中磁盘是最为缓慢的一个环节,因此如何安排好磁盘空间的使用也使I/O 性能的关键。
在创建CHUNK 时建议将一个完整的分区分配个CHUNK,避免offset 计算错误引起的数据访问失败。 
在5.以前的版本建议一个DBSPACES 使用都个CHUNK 来提高性能,但从7.0 以后对此不在要求,反而是最好一个DBSPACES 用一个CHUNK,这样便于作数据分割。
ONLINE 
在缺省情况将临时表建在rootdbs 中,建议使用DBSPACETEMP 参数建立temp dbspace, 用于临时表的存放。
设置预读的参数
RA_PAGES: 
确定ONLINE预读的页数,
RA_THRESHOLD
ONLINE 响应I/O 请求的指针
用下面的计算公式:
RA_PAGES = (BUFFERS * bp_fract) / (2 * large_queries) + 2
RA_THRESHOLD = (BUFFERS * bp_fract) / (2 * large_queries) - 2 
配置后台I/O
后台I/O 不能直接服务于SQL 请求。后台I/O 主要是维护数据一致性。后台I/O带来高速的I/O 同时消耗CPU 资源,同时会与交易竞争系统资源。如果后台I/O 过多会影响应用的性能。下面是一些后台I/O:
Checkpoints
Logging 
Page cleaning 
Backup and restore 
Rollback and recovery 
Data replication 
Checkpoints
LoggingPage cleaning 是数据库维护数据一致性所必需的后台I/O。相对后台I/O,前台I/O 的效率比较差, 因此尽量避免前台I/O。可以通过增加Page Cleaning数或减少触发Page Cleaning 来减少前台 I/O。用onstat -F 命令可以监控前台I/O 的频率。 
影响后台I/O 的参数 
CKPTINTVL
:设置checkpoint的时间间隔,onstat -m可以监控checkpoint的时间。当物理日志达到75%时也发生checkpoint
LOGSIZE 
LOGSIZE 
LOGFILES 
LOGSMAX 
PHYSFILE 
PHYSFILE
影响日志的参数 
LOGBUFF 
PHYSBUFF
LTXHWM 
LTXEHWM 
影响Page Cleaning 的参数
CLEANERS
:清页线索的个数,建议每个磁盘使用一个清页线索。
LRUS 有更多的LRU就会有更多的Page Cleaning,onstat -R命令监控脏页的比例 
LRU_MAX_DIRTY
LRU的最大脏读比例
LRU_MIN_DIRTY
LRU的最小脏读比例
RA_PAGES 6
RA_THRESHOLD 

三种写的比较
1
 前台写:由sqlexec 亲自刷新,前台写效率最低尽量避免。
2
LRU 写:它是由LRU_MAX_DIRTY LRU_MIN_DIRTY 决定刷新的频率,并且这种刷新操作是不彻底的,但有个好处是在刷新时不会终止用户线索的操作。
3 Chunk 写:这种写实最彻底并且效率最高,但在写的时候所有用户线索不能进入临界区,因此检查点会延迟用户的响应时间。
通过onstat -F 可以观察以上三种写的使用情况。可以通过改变LRU_MAX_DIRTY LRU_MIN_DIRTY CKPTINTVL 的值调整写的方式。
2.4. 操作系统上的性能监控 
IBM RS6000 
系列小型机上的AIX 4.3.3 操作系统提供了一些列的系统性能分析工具,这些工具主要以命令行方式执行,平 时我们常用的主要有个命令sariostat vmstat, 它们是从不同侧面反映当前系统的性能,sar 是针对系统整体性能的反映, iostat 是针对系统I/O 性能的反映,vmstat 是针对系统内存和CPU 使用状况的反映。下面我们一一进行分析说明。 
2.4.1. Sar
sar 
UNIX 系统提供的一个标准的系统性能报告工具,它有一些列的参数,一部分参数因UNIX 系统的不同而不同。我们主要用sar 命令来观察系统的整体性能。
使用方法: sar 60 60
说明:第一个数字代表采样的时间间隔,这里定为60  
第二个数字代表采样的次数,这里定为60 
这样我们就能看到系统从现在开始一个小时内的系统性能报告(分钟采样次)
输出结果:
AIX s7a 3 4 000946594C00 11/23/01 
13:55:53 %usr %sys %wio %idle 
13:55:54 14 2 84 0 
13:56:54 21 4 63 12 
13:57:54 24 2 68 6
13:58:54 12 1 86 0 
13:59:54 10 2 86 2 
14:00:54 14 2 64 20 
14:01:54 10 1 11 79
14:02:54 18 1 56 26 
14:03:54 14 2 74 10 
14:04:54 9 2 76 13 
14:05:54 10 2 77 10 
14:06:54 11 4 83 2 
14:07:54 12 1 72 16 
14:08:54 6 2 77 16 
t14:09:54 23 3 63 11 
14:10:54 26 2 61 11
14:11:54 10 2 67 21 
14:12:54 32 2 65 0 
14:13:54 36 1 52 10 
14:14:54 31 3 9 57 
14:15:54 36 3 60 0 
14:16:54 35 3 56 6 
14:17:54 27 3 70 0
14:18:54 31 4 61 4 
14:19:54 34 1 54 11 
14:20:54 26 0 6 67 
14:21:54 0 0 0 100 
Average 20 2 60 17 
说明:标准sar 命令结果显示如图的五列内容
第一列:说明采样的系统时间 
%usr
:用户进程占用整个系统CPU 的百分比
%sys
:系统进程占用整个系统CPU 的百分比 
%wio
I/O 等待占用整个系统CPU 的百分比 
%idle
:空闲占用整个系统CPU 的百分比 
其中%usr + %sys + %wio+ %idle=100% 
以通过观察%idle 的值来确定当前整个系统的繁忙程度,该值越小说明系统 WH越繁忙。当%wio 值持续大于15%时说明系统的 I/O 可能成为瓶颈。当%idle 值持续是零,并且%sys 值很高且大于%usr 的值,说明系统过多的使用交换区,即有可能内存不足。 
从以上观察系统性能的结果可以分析出,系统CPU 存在大量I/O 等待,即系统I/O 性能比较低,I/O 成为系统性能的瓶颈。
相对用户和系统本身占用的CPU 资源平均20%,因此,现有CPU 资源可以满足使用需要。
2.4.2. iostat D
iostat 
AIX 系统提供的一个系统I/O 性能报告工具。可以观察系统I/O 设备的吞吐率。
使用方法: iostat -d hdiskx 60 60 
说明:-d hdiskx 可以选择具体的磁盘 
第一个数字代表采样的时间间隔,这里定为60  
第二个数字代表采样的次数,这里定为60 
这样我们就能看到系统从现在开始一个小时内的系统性能报告(分钟采样次)
输出结果:
Disks: % tm_act Kbps tps Kb_read Kb_wrtn 

hdisk2 98.0 4808.0 267.0 4804 4 
hdisk2 95.0 5164.0 301.0 5164 0
hdisk2 79.8 4137.7 266.3 4148 0
hdisk2 64.0 3220.0 214.0 3220 0 
hdisk2 25.0 1112.0 78.0 1112 0 
hdisk2 34.0 1692.0 116.0 1692 0 
hdisk2 71.0 3536.0 236.0 3496 40 
hdisk2 67.0 3792.0 251.0 3792 0 
hdisk2 80.0 3416.0 238.0 3416 0 
hdisk2 74.0 3936.0 265.0 3936 0 
hdisk2 72.0 3544.0 238.0 3544 0
hdisk2 79.0 3176.0 223.0 3140 36 
hdisk2 74.0 2912.0 197.0 2908 4 
hdisk2 69.0 3460.0 227.0 3460 0 
hdisk2 70.0 3348.0 230.0 3344 4 
hdisk2 68.0 3944.0 258.0 3944 0 
hdisk2 97.0 1372.0 139.0 552 820 
hdisk2 99.8 638.4 111.7 64 576 
hdisk2 100.0 536.0 115.0 84 452 
hdisk2 100.0 524.0 103.0 84 440 
hdisk2 100.0 536.0 101.0 148 388 
hdisk2 100.0 660.0 127.0 148 512 
hdisk2 100.0 516.0 104.0 132 384 
说明:iostat 命令结果显示如图的六列内容
Disks: 
所观察的磁盘名称 
% tm_act 
:设备使用率的百分比 
Kbps 
:设备每秒种读、写的KB  
tps 
:设备每秒种读、写请求的次数 
Kb_read 
:设备每秒种读的KB  
Kb_wrtn 
:设备每秒种写的KB 
以上观察系统性能的结果可以分析出,用作数据库的磁盘hdisk2 I/O 非常繁忙,最高时达到了100%,磁盘读写率最高5M/S,  平均3M/S, 可以判断磁盘读写能力较差,这主要有两方面的原因:现有磁盘阵列的磁盘本身读写慢( 7200 转); RAID卡没有读cache
2.4.3. vmstat 
vmstat 
AIX 系统提供的一个综合性观察系统性能的工具,包括观察系统核心线
程、内存、交换区、系统调用及CPU 的运行情况。
使用方法:vmstat 60 60 
说明:第一个数字代表采样的时间间隔,这里定为60  
第二个数字代表采样的次数,这里定为60  
这样我们就能看到系统从现在开始一个小时内的系统性能报告(分钟采样次)
输出结果:
kthr memory page faults cpu 
----- ----------- ------------------------ ------------ -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
0 1 161419 645 0 0 0 0 0 0 1044 1973 1084 20 2 0 78 
1 1 161419 645 0 0 0 0 0 0 1024 2106 1104 24 2 2 72 
1 1 161615 430 0 0 0 0 0 0 1016 4244 1009 21 2 0 77 
1 1 161099 1000 0 0 0 0 0 0 1051 2517 1241 17 2 0 82 
0 1 160957 1161 0 0 0 0 0 0 988 2367 1225 16 2 0 82
1 1 160424 1762 0 0 0 0 0 0 967 3263 1173 45 4 0 51
2 1 160424 1762 0 0 0 0 0 0 1008 1920 1133 23 2 1 74
0 1 160192 2034 0 0 0 0 0 0 990 2666 1295 18 2 3 78 
0 1 160329 1878 0 0 0 0 0 0 958 4974 1444 14 2 3 82 
0 1 160449 1739 0 0 0 0 0 0 1053 4875 1288 10 2 4 84 
0 1 160454 1733 0 0 0 0 0 0 1025 4315 2830 30 4 0 66 
1 1 160455 1732 0 0 0 0 0 0 1042 2824 1741 13 2 1 84 
0 1 160456 1731 0 0 0 0 0 0 997 2207 1342 10 3 1 87 
0 1 160633 1542 0 0 0 0 0 0 1026 4433 1295 12 2 1 86 
0 1 160543 1626 0 0 0 0 0 0 1039 5321 1412 13 2 1 83 
1 1 159998 2221 0 0 0 0 0 0 964 3357 1499 22 3 3 72 
1 1 159876 2362 0 0 0 0 0 0 1015 2625 1423 13 1 2 84 
1 1 159876 2361 0 0 0 0 0 0 947 2150 1288 12 2 2 84
1 1 159879 2357 0 0 0 0 0 0 991 2058 1184 9 2 2 87
0 1 159879 2357 0 0 0 0 0 0 996 2208 1309 21 1 2 76 
说明:
kthr r 
 在运行队列中的核心线程的个数 
 在等待队列中的核心线程的个数
memory avm 
 正在使用的内存的页数
fre 
 空闲的内存的页数 
page re 
 内存交换的总页数
pi 
 内存交入的总页数
po 
 内存交出的总页数 
fr 
 空闲的交换页 
sr 
 页交换算法扫描过的页数 
cy 
:页交换算法锁的循环数 
faults in 
:设备中断
sy 
 系统调用
cs 
 核心线程上下文切换 
cpu us 
 用户进程占用的CPU 时间
sy 
 系统进程占用的CPU 时间 
id 
 系统空闲的CPU 时间 
wa
 系统I/O 等待的时间 
从以上观察系统性能的结果可以分析出,系统还没有用到交换区的空间,这说明现有内存可以满足现有应用运行的需求,但空闲内存数不多,在用户持续增长的情况下有可能导致内存不足,应考虑适当增加内存容量。
3. 
程序及数据的性能调整 
3.1. 
索引
   
在数据库中,索引对效率的影响可以说是决定性的。所以,索引使用的好坏直接影响系统的效率。每一索引的建立都要根据系统的使用综合考虑,哪些语句使用最频 繁,这些语句的where 条件是什么,对当前表的更新频率如何。在索引的建立过程中,能够建成unique 索引的,最好建成unique 索引,举例 说明:假设在业务系统中,check_info 表是核保信息表,有保单号(bm_cert)字段,在投保单登录前,此字段无值。若将此字段置为空,则登 录前的投保单的保单号(bm_cert)均为空,就不能建唯一索引。此时若改变策略,将投保单时的保单号置为投保单号,(投保单号与保单号不会重复),则 bm_cert 字段就可建唯一索引,大大提高了连表查询速度。对唯一索引可根据需要建成聚类,语法如下:
create cluster index id_person on person(insure_nu);
alter index id_person to cluster 
alter index id_person to not cluster 
聚类使数据的物理存储顺序与索引一致,减少取数的读盘次数,从而提高效率。
3.2. 关于with hold
   
在游标中,如果在循环体内使用了事物,该游标的声明必须使用with hold 否则该游标在事物后会被关闭。为此,可能习惯在声明游 标时加上with hold,不管内部是否有事物。这种做法对单处理器机器可能没什么影响,但对多处理器机器就有影响了。 因为使用 with hold 后,就不能使用并行查询。也就是说,用了with hold 后,pdq 不能起作用。因此,对于 游标内未使用事物的,建议最好不要使用with hold
3.3. 关于隔离级别
隔离级别设成脏读,可提高查询速度。 若对某表查询,而该表的更新频率较高,这时在查询前设置set isolation to dirty read 可使查询速度大大提高。但要注意脏数据。有两种情况可以这样使用:
1 不怕读到脏数据,有脏数据也没有关系。 3#.6S
2  确信读不到脏数据。例如,假设在业务系统中,对rtdz2(单证状态表)表的更新比较频繁,而且此表的记录数也比较多,在很多情况下又要对该表进行实时 查询。在更新时要锁记录,那么查询只好set lock mode to wait ,这样查询速度将会受到很大影响。只好将隔离级别设成脏读。为了保证实时数据不是脏数据,那么我们必须确保一点:系统中所有对 rtdz2 的更新的语句都在事物的最后一句。而业务系统中已经做到了这一点。事实证明,此处效率的提高是显著的。
3.4. 
关于事物 
   
事物的作用相信大家都明白,这里就不再说明了。但在使用事物的时候,为了尽量减少锁表时间,事物中的语句应尽量少。因此在begin work 内最好只有更新语句update, delete , insert 等。而一些预备工作如查询,计 算等都应放在begin work 外。
3.5. 
关于数据分割 
当某一表的数据量较大时,可考虑用数据分割的方式来提高效率。数据分割就是将某一表的数据根据一定的条件放入不同的dbspace ,若这些不同的dbspace 在不同的物理盘上效果会更好。数据分割的用法如下所示:
create table rta14

bm_cert char(15), 
bm_type char(6), 
bm_way char(1), 
je_pay decimal(12,2), 
rq_payto date,
rq_lqstart date, 
flag char(5), 
age_min smallint, 
age_max smallint,
lj_pay decimal(16,2) 

fragment by expression
((bm_cert <= '002999999999999' ) OR (bm_cert >= '990999999999999' ) ) in datadbs1 , 
((bm_cert > '002999999999999' ) AND (bm_cert <= '099999999999999' ) ) in datadbs2 , 
((bm_cert > '099999999999999' ) AND (bm_cert <= '599999999999999' ) ) in datadbs3 ,
((bm_cert > '599999999999999' ) AND (bm_cert < '990999999999999' ) ) in  datadbs4
extent size 38566 next size 3856 lock mode page;

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