AIX系统性能管理之Oracle案例分析

AIX系统性能管理之Oracle案例分析

在这个案例中,主要重点就io这一块作分析。对于其他的,在这里就不作讨论。

  应用环境:

  两台P570作HA(Rotating方式),AIX 5.3 安装oracle 9206,磁阵DS4300,14块盘,6块作raid10为hdisk4,另外8块盘作raid10为hdisk5

  两台P630作HA(Rotating方式),AIX 5.1 安装oracle 9206,磁阵7133

  两个数据库各分担一定的功能。P570压力比较大。

  性能问题:

  最近,P570数据库上的数据库性能急剧下降,报表统计跑将近24个小时才能完成,严重影响白天正常的业务,给主机带来比较大的性能负担。

  检查过程(主要在P570上操作):

  1、使用topas查看一下操作系统的load情况。结果没想到topas无法运行了,得到的结果如下,根本无法刷新数据。

Topas Monitor for host:    jsdxh_db01           EVENTS/QUEUES    FILE/TTY
Thu Oct 25 13:58:32 2007   Interval:  2         Cswitch          Readch
                                                Syscall          Writech
Kernel          |                            |  Reads            Rawin
User            |                            |  Writes           Ttyout
Wait            |                            |  Forks            Igets
Idle            |                            |  Execs            Namei
                                                Runqueue         Dirblk
Network  KBPS   I-Pack  O-Pack   KB-In  KB-Out  Waitqueue

                                                PAGING           MEMORY
                                                Faults           Real,MB
                                                Steals           % Comp
Disk    Busy%     KBPS     TPS KB-Read KB-Writ  PgspIn           % Noncomp
                                                PgspOut          % Client
                                                PageIn
                                                PageOut          PAGING SPACE
                                                Sios             Size,MB
                                                                 % Used
                                                NFS (calls/sec)  % Free
                                                ServerV2
                                                ClientV2           Press:
                                                ServerV3           "h" for help
                                                ClientV3           "q" to quit

 2、安装nmon_aix53(操作系统为5.3),结果nmon_aix53运行也报错。

#./nmon_aix53
ERROR: Assert Failure in file="nmon11.c" in function="main" at line=3239
ERROR: Reason=NULL pointer
ERROR: Expression=[[q->procs = MALLOC(sizeof(struct procentry64 ) * n )]]
ERROR: errno=12
ERROR: errno means : Not enough space

  3、检查进程情况

  #ps -ef | wc -l
  9947

  竟然总共已经产生了9000多个进程。在这众多的进程中可以发现有很多的defunct进程。

#ps -ef |grep defunct | wc -l
9331
##ps -ef | grep defunct | more
    root   159952        1   0                  0:00 <defunct>
    root   172052        1   0                  0:00 <defunct>
    root   225294        1   1                  0:00 <defunct>
    root   262236        1   0                  0:00 <defunct>
    root   290902        1   0                  0:00 <defunct>

  在网上随便查一下defunct,就可以知道,这是孤儿进程。已经找不到父进程,所以把init(PID 1)作为他的父进程。上面的结果中就是PPID=1。孤儿进程无法用kill -9 来清除,即使是root用户也不行,只能重启。这些孤儿进程一般情况下都是由于不当的fork ()/execve()造成的。

  继续检查系统,不知道这么多的孤儿进程是哪个产生的。看一下主机系统的报错情况。

 

#errpt |more
IDENTIFIER TIMESTAMP  T C RESOURCE_NAME  DESCRIPTION
A63BEB70   1025140007 P S SYSPROC        SOFTWARE PROGRAM ABNORMALLY TERMINATED
A63BEB70   1025133007 P S SYSPROC        SOFTWARE PROGRAM ABNORMALLY TERMINATED
A63BEB70   1025130007 P S SYSPROC        SOFTWARE PROGRAM ABNORMALLY TERMINATED
A63BEB70   1025123007 P S SYSPROC        SOFTWARE PROGRAM ABNORMALLY TERMINATED
A63BEB70   1025120007 P S SYSPROC        SOFTWARE PROGRAM ABNORMALLY TERMINATED

  在这里,可以看到频繁的这个报错。基本每隔半个小时报错一次。再检查详细的错误。可以定位到原来是由于一个网管监控软件造成的这个错误。基本也可以判断,由于整个软件的不当的fork调用,导致了数量惊人的孤儿进程。

  现在孤儿进程的问题基本确定了,但是这个孤儿进程到目前为止,对系统造成的影响有多大?网上搜了一把,孤儿进程一般不占用内存,不占用空间,只不过是在进程列表中占了一个位置,所以并不会对系统性能产生太严重的影响。当然,如果任期发展,有可能就会使主机hang住。在这里,网管系统是以root用户运行的,进程数的限制非常大。所以,这里孤儿进程应该只是一个安全隐患,并不是对当前性能造成影响的原因。

  4、检查cpu的使用情况,

#vmstat 1 10
System configuration: lcpu=16 mem=23552MB

kthr    memory              page              faults        cpu   
----- ----------- ------------------------ ------------ -----------
 r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa
 4  0 3533226 2251446   0   0   0   0    0   0 3167 323907 7321 22  9 32 37
 1  0 3533229 2251443   0   0   0   0    0   0 1863 313913 4784 18  8 40 34
 2  0 3533229 2251443   0   0   0   0    0   0 3004 319720 6939 19  9 35 38

  Cpu的使用率基本在65%左右,wa基本在35%到40%,io等待比较严重。

  5、再继续检查一下磁盘的IO情况

#iostat 1 2
System configuration: lcpu=16 drives=11 paths=4 vdisks=0
tty:      tin         tout    avg-cpu: % user % sys % idle % iowait
          0.0         60.0               26.6   9.6   38.4     25.4
Disks:        % tm_act     Kbps      tps    Kb_read   Kb_wrtn
hdisk1          37.0     350.0      70.0          0       350
hdisk0          31.0     354.0      70.0          0       354
hdisk2           0.0       0.0       0.0          0         0
hdisk3           0.0       0.0       0.0          0         0
dac0             0.0     9780.0     1199.0       2000      7780
dac0-utm         0.0       0.0       0.0          0         0
dac1             0.0       0.0       0.0          0         0
dac1-utm         0.0       0.0       0.0          0         0
hdisk4          49.0     3141.0     389.0        520      2621
hdisk5          99.0     6639.0     810.0       1480      5159
cd0              0.0       0.0       0.0          0         0

tty:      tin         tout    avg-cpu: % user % sys % idle % iowait
          0.0        902.0               30.2   8.4   38.9     22.5
Disks:        % tm_act     Kbps      tps    Kb_read   Kb_wrtn
hdisk1           0.0       0.0       0.0          0         0
hdisk0           0.0       0.0       0.0          0         0
hdisk2           0.0       0.0       0.0          0         0
hdisk3           0.0       0.0       0.0          0         0
dac0             0.0     13080.0     1497.0       1616     11464
dac0-utm         0.0       0.0       0.0          0         0
dac1             0.0       0.0       0.0          0         0
dac1-utm         0.0       0.0       0.0          0         0
hdisk4          63.0     3866.0     405.0        296      3570
hdisk5         100.0     9214.0     1092.0       1320      7894
cd0              0.0       0.0       0.0          0         0

  在上面的两份报告中,可以发现,系统对磁盘的负载不均。Hdisk5基本上长期维持在100%,而hdisk4则基本上维持在50%左右。再检查这两个hdisk的详细情况:

#lspv hdisk5
PHYSICAL VOLUME:    hdisk5                   VOLUME GROUP:     oravg
PV IDENTIFIER:      00c2c1eb0bcfbdd4 VG IDENTIFIER     00c2c1eb00004c0000000110153a551d
PV STATE:           active                                    
STALE PARTITIONS:   0                        ALLOCATABLE:      yes
PP SIZE:            64 megabyte(s)           LOGICAL VOLUMES:  120
TOTAL PPs:          8718 (557952 megabytes)  VG DESCRIPTORS:   1
FREE PPs:           1206 (77184 megabytes)   HOT SPARE:        no
USED PPs:           7512 (480768 megabytes)  MAX REQUEST:      1 megabyte
FREE DISTRIBUTION:  00..00..00..00..1206                      
USED DISTRIBUTION:  1744..1744..1743..1743..538  

#lspv hdisk4
PHYSICAL VOLUME:    hdisk4                   VOLUME GROUP:     oravg
PV IDENTIFIER:      00c2c1eb0bcfb8b3 VG IDENTIFIER     00c2c1eb00004c0000000110153a551d
PV STATE:           active                                    
STALE PARTITIONS:   0                        ALLOCATABLE:      yes
PP SIZE:            64 megabyte(s)           LOGICAL VOLUMES:  128
TOTAL PPs:          6538 (418432 megabytes)  VG DESCRIPTORS:   2
FREE PPs:           100 (6400 megabytes)     HOT SPARE:        no
USED PPs:           6438 (412032 megabytes)  MAX REQUEST:      1 megabyte
FREE DISTRIBUTION:  00..00..00..00..100                       
USED DISTRIBUTION:  1308..1308..1307..1307..1208

  6、检查一下内存,

#lsps -a
Page Space      Physical Volume   Volume Group    Size %Used Active  Auto  Type
paging00        hdisk2            rootvg       12288MB     1   yes   yes    lv
hd6             hdisk0            rootvg       12288MB     1   yes   yes    lv
#svmon -G -i 1 5
               size      inuse       free        pin    virtual
memory      6029312    3780159    2249153     446200    3535574
pg space    6291456      17540

               work       pers       clnt
pin          445938        262          0
in use      3535574     244585          0
               size      inuse       free        pin    virtual
memory 6029312 3780168 2249144 446205 3535578
pg space 6291456 17540

  这台机器内存比较大,24G物理内存,从这里看,free的空间也挺多,交换区也基本没怎么使用,在这里内存肯定不会造成问题。

查看一下参数设置情况:

#vmo -a | grep perm
maxperm = 4587812
maxperm% = 80
minperm = 1146952
minperm% = 20
#vmo -a | grep client
maxclient% = 80


  这里,两套系统都使用的是裸设备,这几个参数完全没必要设这么高,这会造成系统的内存争用。P570内存比较大,这种情况还没多大影响,但是在P630上,就可以看到已经比较危险了。下面是nmon输出的一个内存统计结果,可以看到物理内存已经被消耗殆尽,交换也已经使用了62.6%的空间了。但实际上这个数据库是比较空闲的,cpu使用率不超过10%,io的量基本为0,内存的消耗实际上就是被maxperm给吃了,被文件页面的缓存给占用了。这个系统就必需要调整maxperm和minperm的值,否则如果业务繁忙起来,将导致oracle和操作系统的内存争用,影响性能。

Memory
Physical PageSpace | pages/sec In Out | FileSystemCache
% Used 99.4% 62.6% | to Paging Space 0.0 0.0 | Process & 13.3%
% Free 0.6% 37.4% | to File System 0.0 14.2 | System 86.1%
MB Used 8141.4MB 2563.9MB | Page Scans 0.0 |
MB Free 50.6MB 1532.1MB | Page Cycles 0.0 | Free 0.6%
Total(MB) 8191.9MB 4096.0MB | Page Steals 0.0 | ------
| Page Faults 18.9 | Total 100.0%
------------------------------------------------------------ |
Min/Maxperm 1540MB( 19%) 6162MB( 75%) <--% of RAM |
Min/Maxfree 120 128 Total Virtual 12.0GB |
Pinned 7.1%

7、顺带再检查一下,网络基本没什么问题。

#netstat -i
Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll
en7 1500 link#2 0.14.5e.c5.5d.2e 3133315897 0 2978410586 4 0
en7 1500 10.33.102.9 jsdxh_db_svc 3133315897 0 2978410586 4 0
en9 1500 link#3 0.14.5e.c5.64.b8 16814726 0 3897247 3 0
en9 1500 192.168.0 jsdxh_db01_stby 16814726 0 3897247 3 0
lo0 16896 link#1 13949555 0 13969868 0 0
lo0 16896 127 loopback 13949555 0 13969868 0 0

lo0 16896 ::1 13949555 0 13969868 0 0


  从上面对数据库主机的操作系统层面的情况检查来看,大致可以判断造成问题主要应该是在io上面。尤其是hdisk5,hdisk5的io负担过重,可以考虑与分担一部分的量到hdisk4上,以平衡磁盘io,减少io等待。下面对数据库部分的分析也主要在io这一块,其他方面在这里就不作分析了。

  下面对数据库部分的分析思路大致如下:找到读写最频繁读写的lv(有可能是表,索引或者其他的),分布其流量。

下面再对数据库来作分析。

1、检查了一下alert日志。

$ tail -100 alert_ora92.log |more
Thu Oct 25 17:43:29 2007
Thread 1 advanced to log sequence 68444
Current log# 3 seq# 68444 mem# 0: /dev/rlv_redo13
Current log# 3 seq# 68444 mem# 1: /dev/rlv_redo16
Thu Oct 25 17:47:26 2007
Thread 1 advanced to log sequence 68445
Current log# 4 seq# 68445 mem# 0: /dev/rlv_redo11
Current log# 4 seq# 68445 mem# 1: /dev/rlv_redo14
Thu Oct 25 17:51:16 2007
Thread 1 advanced to log sequence 68446
Current log# 5 seq# 68446 mem# 0: /dev/rlv_redo12
Current log# 5 seq# 68446 mem# 1: /dev/rlv_redo15


  从日志中看,redo切换的频率相当高,基本上是4分钟不到,就会作一次日志的切换操作。Redo是3个组,每组2个member,每个member 500M。

2、statspack

Top 5 Timed Events
~~~~~~~~~~~~~~~~~~ % Total
Event Waits Time (s) Ela Time
-------------------------------------------- ------------ ----------- --------
log file sync 483,667 84,354 64.69
db file sequential read 469,344 35,231 27.02
enqueue 82,536 5,747 4.41
CPU time 2,150 1.65
db file parallel write 11,919 1,245 .96

从top 5事件看,

  日志的写入速度太慢。这需要对应用作调整,将频繁commit的改为批量提交。但是在这里我想可能更大的原因是磁盘io的原因。检查一下相关的日志文件,以及相关redo的lv情况:

QL> /
GROUP# STATUS TYPE MEMBER
---------- ------- ------- ------------------------------
3 ONLINE /dev/rlv_redo13
3 ONLINE /dev/rlv_redo16
4 ONLINE /dev/rlv_redo11
4 ONLINE /dev/rlv_redo14
5 ONLINE /dev/rlv_redo12
5 ONLINE /dev/rlv_redo15
SQL> !
$ lslv -l lv_redo13
lv_redo13:N/A
PV COPIES IN BAND DISTRIBUTION
hdisk4 008:000:000 0% 000:000:000:000:008
$ lslv -l lv_redo16
lv_redo16:N/A
PV COPIES IN BAND DISTRIBUTION
hdisk5 008:000:000 0% 000:000:008:000:000
$ lslv -l lv_redo11
lv_redo11:N/A
PV COPIES IN BAND DISTRIBUTION
hdisk4 008:000:000 0% 008:000:000:000:000
$ lslv -l lv_redo14
lv_redo14:N/A
PV COPIES IN BAND DISTRIBUTION
hdisk5 008:000:000 0% 008:000:000:000:000
$ lslv -l lv_redo12
lv_redo12:N/A
PV COPIES IN BAND DISTRIBUTION
hdisk4 008:000:000 0% 000:000:000:000:008
$ lslv -l lv_redo15
lv_redo15:N/A
PV COPIES IN BAND DISTRIBUTION
hdisk5 008:000:000 0% 008:000:000:000:000


  在这里,每个组中的两个member一个在hdisk4,一个在hdisk5,分布在磁盘的边缘。可以考虑改变一下内策略,将redo分布调整到磁盘的中间位置。因为本身是raid10的方式,或者干脆不要两个member,只使用其中的一个member,这个有可能带来其他的问题,如果非不得已,不考虑这种方法。

另外一个等待事件,顺序读。这个事件一般是由于不当的选择索引或者表的连接。但在这里,我想可能并不是这个原因,而主要还是磁盘繁重的io造成的。看一下物理读排序的SQL语句:

SQL ordered by Reads for DB: ORA92 Instance: ora92 Snaps: 47 -48
-> End Disk Reads Threshold: 1000
CPU Elapsd
Physical Reads Executions Reads per Exec %Total Time (s) Time (s) Hash Value
--------------- ------------ -------------- ------ -------- --------- ----------
170,449 206,955 0.8 33.1 279.55 20719.02 4053432766
Module: Das.exe
BEGIN p_mc_sce_addsms(:p0,:p1,:p2,:p3,:p4,:p5,:p6,:p7,:p8); END
;
142,856 233,890 0.6 27.8 74.05 9616.88 1594289970
Module: Das.exe
SELECT MAX(T.ACTIVE_FLAG), MAX(T.SECOND_NO) FROM T_MC_MCN_USERIN
FO T WHERE T.USER_NO = :B1 AND T.PARTCOL_USERNO = SUBSTR(:B1 , -
3, 2) AND ROWNUM <= 1


      我想,在这里我们对比cpu time和Elapsd time就可以发现,这里I/O等待的情况非常严重。当然,也可以进一步检查过程内语句的执行计划情况,看是否合理。在这里,还是来关注io的情况。

      在表空间的io统计中,比较繁忙的表空间是:

    ->ordered by IOs (Reads + Writes) desc
    Tablespace
    ------------------------------
                     Av      Av     Av                    Av        Buffer Av Buf
             Reads Reads/s Rd(ms) Blks/Rd       Writes Writes/s      Waits Wt(ms)
    -------------- ------- ------ ------- ------------ -------- ---------- ------
    TBS_MCN_HIS_IDX
           109,393      61   94.2     1.0      421,033      233      8,004    1.8
    TBS_MCN_LOG_IDX
           101,915      56   74.3     1.0      416,523      231     34,705    2.8
    TBS_MCN_MAIN_IDX
           110,871      61   43.9     1.0      200,902      111     15,797    1.4
    TBS_MCN_MAIN_DAT

 108,012      60   79.2     1.2       68,267       38      9,668    0.9


      在看file io之前,先看一下hdisk4和hdisk5的各自拥有的lv情况。

    #lspv -l hdisk4
    hdisk4:
    LV NAME               LPs   PPs   DISTRIBUTION          MOUNT POINT
    lv_data052            64    64    00..00..64..00..00    N/A
    lv_data009            64    64    00..64..00..00..00    N/A
    lv_data053            64    64    00..00..64..00..00    N/A
    …
    #lspv -l hdisk5
    hdisk5:
    LV NAME               LPs   PPs   DISTRIBUTION          MOUNT POINT
    lv_data143            64    64    00..00..64..00..00    N/A
    lv_data100            64    64    00..64..00..00..00    N/A
    lv_data244            64    64    00..00..00..00..64    N/A
    lv_data142            64    64    00..00..64..00..00    N/A
    lv_data099            64    64    00..64..00..00..00    N/A


      通过观察,可以分布的大致情况是,080以上的lv基本在hdisk5中,080以下lv基本都在hdisk4中。现在再对比一下file io的统计:

      根据file io的统计,去计算一下,在hdisk4和hdisk5中的物理读的数量差不多是

      Hdisk4:132,578

      Hdisk5:261,996

      Hdisk5的io量差不多就是hdisk4的两倍。这和前面iostat的统计的结果也基本差不多。

      下面几个是file io统计中最繁忙的几个lv。

    TBS_MCN_LOG_IDX          /dev/rlv_data096
            50,938      28   74.8     1.0      209,422      116     17,496    2.6
                             /dev/rlv_data097
            50,977      28   73.7     1.0      207,101      115     17,209    3.0
    TBS_MCN_MAIN_DAT         /dev/rlv_data009
            15,625       9   20.6     1.0          985        1          0
                             /dev/rlv_data010
            33,026      18   18.0     1.5       26,717       15      9,658    0.7
                             /dev/rlv_data091
            37,009      21  118.5     1.2       38,190       21          9  107.8
                             /dev/rlv_data092
            22,352      12  145.5     1.0        2,375        1          1   70.0

    TBS_MCN_MAIN_IDX         /dev/rlv_data018
            26,666      15   17.6     1.0       35,333       20      4,023    1.8
                             /dev/rlv_data019
            26,661      15   17.3     1.0       35,216       20      3,368    0.9
                             /dev/rlv_data020
            30,600      17   17.1     1.0       93,095       52      4,274    1.1
                             /dev/rlv_data093
            26,944      15  126.8     1.0       37,258       21      4,132    1.8


    再来统计一下,表的读写情况。

 

      通过上面的file io以及表的统计,再结合实际的业务情况,可以明确,这里最繁忙的是表空间TBS_MCN_LOG_DAT中的表T_MC_SMS_SMSNOTI以及其上位于表空间TBS_MCN_LOG_IDX中的索引。并且,这两部分全部集中再hdisk5上,所以后面的平衡io的优化操作就是将该表以及索引部分分布到hdisk4上。

原文地址:https://www.cnblogs.com/yaoyangding/p/13097134.html