|
原帖由 magic007 于 2011-8-11 13:26 发表 ![]()
memory(kbytes) 32768
这个资源限制的确会影响进程可用内存数量,实际上AIX对进程内存的限制在这个值之上。我曾经遇到过一个这样设置的系统,进程使用的内存在超过100M多一点的时候才报了ORA-04030错误。
下面是我以前的一个测试:
SQL> create or replace procedure test4030 (size_mb in number)
2 is
3 TYPE array_char is table of varchar2(32767) index by binary_integer;
4 data_list array_char;
5 cnt number:=size_mb*1024/32;
6 begin
7 for i in 1..cnt loop
8 begin
9 data_list(i):=rpad('a',32767,'a');
10 exception
11 when others then
12 dbms_output.put_line('error at line ' || i || ' msg:' || substr(sqlerrm,1,200));
13 raise;
14 end;
15 end loop;
16 end;
17 /
SQL> set serverout on size 1000000
SQL> exec test4030(1);
PL/SQL procedure successfully completed.
SQL> exec test4030(200);
SQL> select pga_max_mem,pga_alloc_mem,pga_used_mem,pga_freeable_mem from v$process where spid='3150056';
PGA_MAX_MEM PGA_ALLOC_MEM PGA_USED_MEM PGA_FREEABLE_MEM
----------- ------------- ------------ ----------------
420360601 1847705 660369 917504
可以看到,成功运行这个存储过程,使进程消耗了420M的PGA。
这里size_mb参数只是存储过程中那个数组存储的字符百万个数,实际效率的空间占了约2倍。
你可以用这样的过程,在你的系统上进行测试,看看是不是会报ORA-4030错误,当然前提是ulimit设置保持如前。
可以预期的是,这个过程输入的参数值在100多一点就会报ORA-4030错误。
注意为了排除监听的干扰,直接在主机上不通过监听连接数据库测试。
。。ulimit 参数没有修改root/oracle用户的 memory 依然是23768
运行到300 还是没有ORA-4030。。。
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select sid from v$mystat where rownum<2;
SID
----------
150
Elapsed: 00:00:00.01
SQL> select spid from v$process p , v$session s where s.paddr =p.addr and sid=150;
SPID
------------
196810
Elapsed: 00:00:00.01
SQL> select pga_max_mem,pga_alloc_mem,pga_used_mem,pga_freeable_mem from v$process where spid='196810';
PGA_MAX_MEM PGA_ALLOC_MEM PGA_USED_MEM PGA_FREEABLE_MEM
----------- ------------- ------------ ----------------
736673 736673 539601 0
Elapsed: 00:00:00.00
SQL> select pga_max_mem,pga_alloc_mem,pga_used_mem,pga_freeable_mem from v$process where spid='196810';
PGA_MAX_MEM PGA_ALLOC_MEM PGA_USED_MEM PGA_FREEABLE_MEM
----------- ------------- ------------ ----------------
736673 736673 425929 0
Elapsed: 00:00:00.00
SQL> create or replace procedure test4030 (size_mb in number)
2 is
3 TYPE array_char is table of varchar2(32767) index by binary_integer;
4 data_list array_char;
5 cnt number:=size_mb*1024/32;
6 begin
7 for i in 1..cnt loop
8 begin
9 data_list(i):=rpad('a',32767,'a');
10 exception
11 when others then
12 dbms_output.put_line('error at line ' || i || ' msg:' || substr(sqlerrm,1,200));
13 raise;
14 end;
15 end loop;
16 end;
17 /
Procedure created.
Elapsed: 00:00:00.31
SQL> exec test4030(100);
PL/SQL procedure successfully completed.
Elapsed: 00:00:08.94
SQL> select pga_max_mem,pga_alloc_mem,pga_used_mem,pga_freeable_mem from v$process where spid='196810';
PGA_MAX_MEM PGA_ALLOC_MEM PGA_USED_MEM PGA_FREEABLE_MEM
----------- ------------- ------------ ----------------
210582945 1654177 561161 917504
Elapsed: 00:00:00.01
SQL> exec test4030(150);
PL/SQL procedure successfully completed.
Elapsed: 00:00:13.37
SQL> select pga_max_mem,pga_alloc_mem,pga_used_mem,pga_freeable_mem from v$process where spid='196810';
PGA_MAX_MEM PGA_ALLOC_MEM PGA_USED_MEM PGA_FREEABLE_MEM
----------- ------------- ------------ ----------------
315440545 1654177 561161 917504
Elapsed: 00:00:00.00
SQL> exec test4030(200);
PL/SQL procedure successfully completed.
Elapsed: 00:00:17.88
SQL> select pga_max_mem,pga_alloc_mem,pga_used_mem,pga_freeable_mem from v$process where spid='196810';
PGA_MAX_MEM PGA_ALLOC_MEM PGA_USED_MEM PGA_FREEABLE_MEM
----------- ------------- ------------ ----------------
420298145 1654177 561161 917504
Elapsed: 00:00:00.00
SQL> exec test4030(300);
PL/SQL procedure successfully completed.
Elapsed: 00:00:26.77
SQL> select pga_max_mem,pga_alloc_mem,pga_used_mem,pga_freeable_mem from v$process where spid='196810';
PGA_MAX_MEM PGA_ALLOC_MEM PGA_USED_MEM PGA_FREEABLE_MEM
----------- ------------- ------------ ----------------
630013345 1654177 561161 917504
Elapsed: 00:00:00.00
在运行过程中不停用ps gv来查看进程内存如下:
其中RSS是进程使用内存 TRS是这个进程和其他进程公用的内存(也就是可执行文件$ORACLE_HOME/bin/oracle)
SIZE近似等于RSS-TRS,也就是近似等于进程私有内存,可以理解为这个进程的PGA~
从下面的红色输出上看 SIZE 最高达到了559M左右,
上面SQLPLSU中也显示最高的PGA_MAX_MEM(红色)曾达到过 630M ~
可见这些都已经远远的突破了LIM 32768KB的限制呀....
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196808
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196808 - A 0:00 5 5472 50324 32768 90741 44852 0.0 0.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:00 0 4392 49244 32768 90741 44852 0.0 0.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:07 18 199392 244320 32768 90741 44928 0.5 1.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:08 18 5420 50348 32768 90741 44928 0.6 0.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:17 18 199396 244324 32768 90741 44928 0.7 1.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:20 18 281312 326240 32768 90741 44928 0.9 1.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:22 18 5444 50372 32768 90741 44928 0.9 0.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:24 18 68380 113308 32768 90741 44928 0.8 0.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:26 18 101140 146068 32768 90741 44928 0.9 1.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:27 18 150280 195208 32768 90741 44928 0.9 1.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:29 18 199420 244348 32768 90741 44928 1.0 1.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:31 18 232180 277108 32768 90741 44928 1.1 1.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:32 18 264940 309868 32768 90741 44928 1.1 1.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:34 18 297700 342628 32768 90741 44928 1.2 1.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:35 18 330464 375392 32768 90741 44928 1.2 1.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:37 18 363232 408160 32768 90741 44928 1.3 2.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:39 18 412448 457376 32768 90741 44928 1.3 2.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:39 18 5536 50464 32768 90741 44928 1.3 0.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:40 18 35712 80640 32768 90741 44928 1.0 0.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:44 18 133992 178920 32768 90741 44928 1.1 1.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:47 18 199512 244440 32768 90741 44928 1.1 1.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:51 18 281412 326340 32768 90741 44928 1.2 1.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:54 18 363312 408240 32768 90741 44928 1.3 2.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 0:57 18 434808 479736 32768 90741 44928 1.3 2.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 1:00 18 494368 539296 32768 90741 44928 1.4 2.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 1:02 18 559904 604832 32768 90741 44928 1.5 2.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 1:06 18 376932 420836 32768 90741 44928 1.5 2.0 oracleTr
cntzunxb02:/tmp#ps gv| head -1 ;ps gv |grep 196810
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
196810 - A 1:07 18 5584 50512 32768 90741 44928 1.6 0.0 oracleTr
[ 本帖最后由 zergduan 于 2011-8-11 14:07 编辑 ] |
|