当前位置: 首页 > 技术与资源 > 技术分享 > 正文

测试数据管理平台构想

2015-07-03 10:49:32

作者简介:陈能技,资深质量优化专家,新炬网络技术总监,12年软件测试与质量管理经验,《软件性能测试诊断分析与优化》等多本IT畅销书作者。


在做服务器配置规划,涉及到内存的时候,都会考虑下操作系统自身的内存、SGA、PGA、所有连接到数据库进程消耗的内存、其他应用进程消耗的内存。


这中间,不太好估算的是server process消耗内存的估算。从我们在电信、金融这样一些相对比较大的系统使用来看,HPUX下(11g)每个server process进程大概在10M~12M之间,HPUX下大概在10M~20M之间。有些进程如果只是连接,没有产生过任何查询或者DML的话,消耗的内存可能低于5M。


也因此,一旦应用上线后,遇到内存“不够”,某些个别程序遇到问题时,运维就会被challenge,这些应用以前都是好好的,为什么不行了?


有个新的例子是这样的,一个批处理的进程,消耗了50G内存,居然都没有跑完。


过程代码是这样(仅更改了敏感内容):


SQL> DECLARE
  2
  3  TYPE TP_RRRIDTP_RRRIDTP_RRRID             IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
  4  TYPE TYPE_XC_CODE           IS TABLE OF ACTUARY.TBL_TRAD.XC_CODE%TYPE INDEX BY BINARY_INTEGER;
  5  VV_RRRID                     TP_RRRIDTP_RRRIDTP_RRRID;
  6  V_XC_CODE                   TYPE_XC_CODE;
  7
  8  BEGIN
  9
 10
 11
 12  SELECT A.ROWID,B.XC_CODE BULK COLLECT INTO VV_RRRID,V_XC_CODE
 13  FROM ZBCS.TBL_UL A,
 14       ZBCS.CLASSCODE_SUM B
 15  WHERE A.XZCODE = B.XZCODE
 16  AND A.GSCODE = ‘SHH’
 17  ;
 18
 19  FORALL I IN VV_RRRID.FIRST..VV_RRRID.LAST
 20
 21  UPDATE ZBCS.TBL_UL
 22  SET XC_CODE = V_XC_CODE(I)
 23  WHERE ROWID = VV_RRRID(I);
 24  COMMIT;
 25
 26 DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,’YYYY-MM-DD HH24:MI:SS’));
 27
 28  END;
 29  /
DECLARE
*
ERROR at line 1:
ORA-04030: out of process memory when trying to allocate 1917720 bytes (PLS
non-lib hp,DARWIN)
ORA-06512: at line 19

这个表本身虽然不算太大,半个月的时间增长近2000万,其中一个分区接近一半的记录。在查询小分区的时候语句没有问题,但是查询最大这个分区数据的时候就ORA-04030。

 

当然,改进的方法不难,在fech的时候加以limit限制(5000或者10000都可以)即可。


要说的是,类似的应用写法,在不同的开发商中,确是普遍存在的。好的开发干个2-3年就跳槽或者升职了,写这样代码的人总是新手,出了问题总是运维在熬夜分析(你不能总是一上来就指出开发有问题啊,他们有惯用的语句:我们什么都没改啊,以前跑的好好的!所以要通过各种分析,拿出证据,就是他的问题)。


那么,一个oracle连接进程到底消耗多少内存呢?当然实际的只能从V$process去查了。上面的通用粗糙算法大体也没有问题。

上一篇:数据治理与大数据
下一篇:庖丁解牛-剖析系统应用架构