作者简介:陈能技,资深质量优化专家,新炬网络技术总监,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去查了。上面的通用粗糙算法大体也没有问题。
上一篇:数据治理与大数据
下一篇:庖丁解牛-剖析系统应用架构