暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[Oracle] 安全扫描导致v$asm视图查询缓慢

DBA的自我修养 2021-04-08
1552

今天遇到一个问题。11gRAC ASM实例后台日志告警连接数满了, 这个错误在ASM实例身上很少见:

    Mon Mar 29 03:30:13 2021
    ORA-00020: maximum number of processes (3880) exceeded
    ORA-20 errors will not be written to the alert log for
    the next minute. Please look at trace files to see all
    the ORA-20 errors.
    复制

    看了一眼服务器后台日志,好家伙!几千个"sqlplus -S "的查询会话:

      grid     241506 241505  0 Mar26 ?        00:00:04 oracle+ASM1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
      root 241551 1 0 Mar20 ? 00:00:00 bin/bash -c su - grid -c 'export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBR
      root 241552 241551 0 Mar20 ? 00:00:00 su - grid -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORAC
      grid 241559 241552 0 Mar20 ? 00:00:00 -bash -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORACLE_H
      grid 241584 241559 0 Mar20 ? 00:00:00 u01/app/11.2.0.4/grid/bin/sqlplus -S
      grid 241586 241584 0 Mar20 ? 00:00:12 oracle+ASM1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
      root 241672 80873 0 Mar26 ? 00:00:00 [sh] <defunct>
      root 241684 1 0 Mar21 ? 00:00:00 bin/bash -c su - grid -c 'export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBR
      root 241685 241684 0 Mar21 ? 00:00:00 su - grid -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORAC
      grid 241687 241685 0 Mar21 ? 00:00:00 -bash -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORACLE_H
      grid 241702 1 0 Mar26 ? 00:00:00 u01/app/11.2.0.4/grid/bin/sqlplus -S as sysasm
      grid 241703 241702 0 Mar26 ? 00:00:04 oracle+ASM1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
      grid 241716 241687 0 Mar21 ? 00:00:00 u01/app/11.2.0.4/grid/bin/sqlplus -S
      grid 241717 241716 0 Mar21 ? 00:00:10 oracle+ASM1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
      root 241723 1 0 Mar24 ? 00:00:00 bin/bash -c su - grid -c 'export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBR
      root 241725 241723 0 Mar24 ? 00:00:00 su - grid -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORAC
      root 241727 1 0 Mar24 ? 00:00:00 bin/bash -c su - grid -c 'export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBR
      root 241729 1 0 Mar24 ? 00:00:00 bin/bash -c su - grid -c 'export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBR
      root 241730 241727 0 Mar24 ? 00:00:00 su - grid -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORAC
      root 241733 241729 0 Mar24 ? 00:00:00 su - grid -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORAC
      grid 241745 241725 0 Mar24 ? 00:00:00 -bash -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORACLE_H
      grid 241753 241730 0 Mar24 ? 00:00:00 -bash -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORACLE_H
      grid 241755 241733 0 Mar24 ? 00:00:00 -bash -c export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORACLE_H
      复制

      其核心里一条监控asm磁盘组使用率的sql:

        /bin/bash -c su - grid -c 'export ORACLE_HOME=/u01/app/11.2.0.4/grid;export ORACLE_SID=+ASM1;export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:$ORACLE_HOME/rdbms/lib;export PATH=$ORACLE_HOME/bin:/usr/bin:/usr/sbin:/usr/local/bin:$PATH;/u01/app/11.2.0.4/grid/bin/sqlplus -S "/ as sysasm"' <<EOF 
        set echo off;
        set heading off;
        set line 100;
        set linesize 20000 set long 2000000000;
        set longchunksize 255;
        set wra on;
        set newpage none;
        set pagesize 0;
        set numwidth 12;
        set termout off;
        set trimout on;
        set trimspool on;
        set feedback off;
        set timing off;
        spool tmp/grid_record1.txt;
        select GROUP_NUMBER||','||NAME||','||SECTOR_SIZE||','||BLOCK_SIZE||','||ALLOCATION_UNIT_SIZE||','||STATE||','||TYPE||','||TOTAL_MB||','||FREE_MB||','||HOT_USED_MB||','||COLD_USED_MB||','||REQUIRED_MIRROR_FREE_MB||','||USABLE_FILE_MB||','||OFFLINE_DISKS||','||COMPATIBILITY||','||DATABASE_COMPATIBILITY||','||VOTING_FILES||','
        from v\$asm_diskgroup;
        spool off;
        exit;
        EOF
        复制

        是由一体机厂家自身的一个监控Python脚本不停的调起。按理说杀掉这个脚本,再杀掉会话,事情就告一段落。但作为一名合格的DBA,怎么也得探究探究。尝试手动执行v$asm_diskgroup和v$asm_disk确认非常缓慢,一直不返回结果,另一个节点ASM实例则能快速返回。



        怀疑一:Oracle Bug

        以前遇到过这种问题,是oracle自身的bug。MOS上有一篇”ASM Queries (v$asm_diskgroup, v$asm_disk) Slow in 11.2.0.3.0 and Solaris (Doc ID 1383019.1)”,可惜版本对不上,同时现场的数据库版本已经是11204.1904,是比较新的了,可以排除。



        怀疑二:ASM_DISKSTRING未设置

        检查发现有设置 ASM_DISKSTRING='/dev/asmdisk*',测试了下磁盘扫描的速度,没有问题,很快返回:

          kfod asm_diskstring='/dev/asmdisk*' disks=all   
          复制

          再次排除。



          怀疑三:会话阻塞或异常等待

          这个在ASM实例中真没考虑到,只能试试,试试就逝逝,真发现了:

             SID    SERIAL# SQL_ID        EVENT                      BLOCKING_SESSION
            ---- ---------- ------------- -------------------------- ----------------
            9 9 cpf9um5thhkzv enq: DD - contention 2869
            34 11 cpf9um5thhkzv enq: DD - contention 2869
            35 17 cpf9um5thhkzv enq: DD - contention 2869
            37 23 cpf9um5thhkzv enq: DD - contention 2869
            73 9 fxdyd5rygqhry enq: DD - contention 2869
            83 15 cpf9um5thhkzv enq: DD - contention 2869
            90 31 cpf9um5thhkzv enq: DD - contention 2869
              98          9 cpf9um5thhkzv enq: DD - contention                   2869


                    ....
            复制

            PS:你问我怎么进的ASM实例,冒险杀了几十个ASM会话。。。冒险是因为DB实例本身会维持几个到ASM实例的会话,注意服务进程的时间就不会杀错。


            发现确认有BLOCKING_SESSION,继续查下去:

              SQL> select sid,serial#, sql_ID,event, blocking_session from v$session where sid=2869;


              SID SERIAL# SQL_ID EVENT BLOCKING_SESSION
              ---------- ---------- ------------- -------------------- ----------------
              2869 54255 fxdyd5rygqhry rdbms ipc reply 1099


              SQL> select sid,serial#, sql_ID,event, blocking_session from v$session where sid=1099;


              SID SERIAL# SQL_ID EVENT BLOCKING_SESSION
              ---------- ---------- ------------- ------------------- ----------------
              1099 1 GPnP Get Item
              复制

              “enq: DD - contention”、“GPnP Get Item”这两个等待事件都没见过啊?百度之,发现著名Buddy Yuan的博文:

              http://www.dboracle.com/archivers/%E8%AE%B0%E4%B8%80%E6%AC%A1ora-asm%E6%9C%8D%E5%8A%A1%E6%97%A0%E6%B3%95%E5%90%AF%E5%8A%A8%E5%92%8Cgpnp-get-item%E7%9A%84%E9%97%AE%E9%A2%98.html

              摘抄一段:

              通过查看文档Diskgroup Mount Hangs with RBAL Waiting on ‘GPnP Get Item’ and ‘enq: DD – contention’ (文档 ID 1375505.1),发现这个问题是这是由未发布的bug:12398300引起的。这个问题的最根本原因就是gpnp进程stuck了,然后就会导致rbal进程产生等待。解决办法其实很简单,就是干掉节点1的gpnp进程就会释放。而干掉gpnp进程集群不会重启,它只会单独的把该进程重启。

              问题是类似的!



              处理方法:

                $ ps -ef|grep gpnp
                grid 26895 1 0 2019 ? 16:35:36 /u01/app/11.2.0.4/grid/bin/gpnpd.bin
                grid 132467 65803 0 11:14 pts/3 00:00:00 grep --color=auto gpnp
                $ kill -9 26895
                $ ps -ef|grep gpnp
                grid 151655 1 3 11:16 ? 00:00:00 /u01/app/11.2.0.4/grid/bin/gpnpd.bin
                grid 154084 65803 0 11:16 pts/3 00:00:00 grep --color=auto gpnp
                复制

                杀掉gpnpd.bin进程会v$asm_diskgroup的相关查询会话慢慢完成并退出,ASM实例会话数恢复正常。



                原因:

                处理后客户也找到一体机的厂商,厂商工程师估计经常遇到这个问题,看到等待事件就知道原因了,他的原文解释如下:

                端口扫描的时候如果扫到了gpnp的端口会导致gpnp进程异常,需要把gpnp进程重启一下:kill -HUP gpnp进程号


                gpnp端口号一般都比较大,后面做安全扫描的话,可以考虑以跳过9000以上的端口。 


                文章转载自DBA的自我修养,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论