.comment-link {margin-left:.6em;}

Tuesday, April 25, 2006

Simulando um Stress Teste

O estresse teste consiste em colocar algo a prova. Em nosso caso uma aplicação. Recebi uma dúvida hoje e vou tentar desenvolvê-la na medida do possível. Um verdadeiro Estresse Teste deveria ser realizado utilizando um "verdadeiro" software de Stress Test. Uma pequena busca no Google e econtramos algumas dezenas. Voltando a dúvida, ela é sobre submeter um script várias vezes contra uma base de dados simultaneamente.

A dúvida:


deixe eu te pedir um favor:
quero gerar um script que faça n conexões no banco ao mesmo tempo para simular um ambiente de producao .... tem jeito?

Pensei em um procedimento simples que faz insert em uma tabela (mas aqui vale o que a aplicação quer validar: update, delete, select, connect, etc). Submeti 30 vezes simultaneas. Para isso, usei o dbms_job. Sempre lembrar de setar o parametro job_queue_processes para 30 (número de jobs simultanes).

NAME TYPE VALUE
------------------------------------ ----------- ----------------
job_queue_processes integer 30
Depois rodei um bloco anônimo para chamar a stored procedure 30 vezes (loop) e controle da execução através de uma tabela que tem os números dos jobs submetidos. Não havia necessidade desse controle, porém serve como exemplo de como se faz uma chamada coordenada (isso é útil para coordenar uma execução em paralelo manual).

E agora o teste. Durante a execução, fiz busca no sistema operacional para ver quantas sessões do ora_j0xx_LNX10GR2 foram disparadas. O teste foi realizado em um Linux Red Hat EL 4 usando Oracle 10gR2.

SQL> create table t ( x int );

Table created.

SQL>
SQL> create table hold_job ( x int );

Table created.

SQL>
SQL> create or replace procedure p ( job in number )
2 as
3 PRAGMA AUTONOMOUS_TRANSACTION;
4 begin
5 for i in 1 .. 1000
6 loop
7 insert into t values ( i );
8 commit ;
9 end loop;
10 delete from hold_job where x = job;
11 commit;
12 end;
13 /

Procedure created.

SQL>
SQL> declare
2 l_job number;
3 l_cnt number;
4 begin
5 for x in 1 .. 30
6 loop
7 dbms_job.submit( l_job, 'p (JOB);' );
8 insert into hold_job values (l_job);
9 end loop;
10 commit;
11 loop
12 dbms_lock.sleep(30);
13 select count(*) into l_cnt from hold_job;
14 exit when (l_cnt = 0);
15 end loop;
16 end;
17 /

PL/SQL procedure successfully completed.

E durante a execução este foi o resultado do ps -ef | grep ora_j0

SQL> !ps -ef | grep ora_j0
oracle 15875 1 2 02:06 ? 00:00:01 ora_j000_LNX10GR2
oracle 15881 1 3 02:07 ? 00:00:01 ora_j001_LNX10GR2
oracle 15883 1 3 02:07 ? 00:00:01 ora_j002_LNX10GR2
oracle 15885 1 4 02:07 ? 00:00:01 ora_j003_LNX10GR2
oracle 15887 1 4 02:07 ? 00:00:01 ora_j004_LNX10GR2
oracle 15889 1 2 02:07 ? 00:00:00 ora_j005_LNX10GR2
oracle 15891 1 2 02:07 ? 00:00:00 ora_j006_LNX10GR2
oracle 15893 1 4 02:07 ? 00:00:01 ora_j007_LNX10GR2
oracle 15895 1 5 02:07 ? 00:00:01 ora_j008_LNX10GR2
oracle 15897 1 2 02:07 ? 00:00:00 ora_j009_LNX10GR2
oracle 15899 1 4 02:07 ? 00:00:01 ora_j010_LNX10GR2
oracle 15901 1 4 02:07 ? 00:00:01 ora_j011_LNX10GR2
oracle 15903 1 4 02:07 ? 00:00:01 ora_j012_LNX10GR2
oracle 15905 1 4 02:07 ? 00:00:01 ora_j013_LNX10GR2
oracle 15908 1 4 02:07 ? 00:00:01 ora_j014_LNX10GR2
oracle 15910 1 4 02:07 ? 00:00:01 ora_j015_LNX10GR2
oracle 15912 1 4 02:07 ? 00:00:01 ora_j016_LNX10GR2
oracle 15914 1 0 02:07 ? 00:00:00 ora_j017_LNX10GR2
oracle 15918 1 0 02:07 ? 00:00:00 ora_j018_LNX10GR2
oracle 15925 1 0 02:07 ? 00:00:00 ora_j019_LNX10GR2
oracle 15927 1 0 02:07 ? 00:00:00 ora_j020_LNX10GR2
oracle 15929 1 1 02:07 ? 00:00:00 ora_j021_LNX10GR2
oracle 15931 1 1 02:07 ? 00:00:00 ora_j022_LNX10GR2
oracle 15933 1 1 02:07 ? 00:00:00 ora_j023_LNX10GR2
oracle 15935 1 0 02:07 ? 00:00:00 ora_j024_LNX10GR2
oracle 15937 1 1 02:07 ? 00:00:00 ora_j025_LNX10GR2
oracle 15939 1 0 02:07 ? 00:00:00 ora_j026_LNX10GR2
oracle 15941 1 1 02:07 ? 00:00:00 ora_j027_LNX10GR2
oracle 15943 1 1 02:07 ? 00:00:00 ora_j028_LNX10GR2
oracle 15945 1 1 02:07 ? 00:00:00 ora_j029_LNX10GR2
marcio 15968 15877 0 02:07 pts/2 00:00:00 /bin/bash -c ps -ef | grep ora_j0
marcio 15970 15968 0 02:07 pts/2 00:00:00 grep ora_j0
A brincadeira ficou ainda mais interessante, porque pude investigar como o AWR joga com o ADDM. Realmente Statspack é coisa do passado. Se for reproduzir o teste em 9i, não deixe de usar o statspacks para verificar os waits (obviamente a freelist está em contenção) - não importa, pelo menos faça o exercício da investigação.

Espero que ajude Professor! :-) Abraços,

Labels:


Comments: Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?