sexta-feira, 21 de agosto de 2009

Mutex Contention - Parte I

Ni-hao,

Para quem gosta de estudar sobre software com arquitetura multithread irei falar um pouco sobre como o Informix utiliza a Arquitetura DSA (Dynamic Server Architecture) para implementar o controle de threads.

Basicamente quando um thread tenta acessar algum recurso em modo exclusivo o mesmo precisa que um latch ou mutex seja alocado.

No Informix existem diversas formas de identificarmos os mutexes e seus status, basta usar o onstat:

onstat -g lmx: lista todos os latches que estao bloqueados, ou sejam um thread foi marcado com holder e outros threads estao waiters.

onstat -g amx: similar ao anterior porem lista todos os latches independentes de status.

E muito comum alguns tipos de contencao abaixo:

- NSF.LOCK
Este latch indica que o sistema operacional pode estar com o kernel mal-configurado, por exemplo o numero de file descriptors 'e pequeno.

Em toda nova conexao ao banco de dados um file descriptor 'e alocado, em ambiente AIX esse parametro costuma ser definido como ilimitado.

Para checar sua configuracao conecte-se como usuario informix e rode ulimit -a

Existes outro cenario que esta contencao pode ocorrer, nao e um problema muito comum na maioria das vezes recomendo que o Suporte da IBM seja acionado.

Neste link tem uma nota da IBM sobre este tipo de contencao:
http://www-01.ibm.com/support/docview.wss?uid=swg21145897

A contenção também pode ser um defect:
http://www-01.ibm.com/support/docview.wss?uid=swg1IC50796


- DBS_PARTN
Este tipo de latch indica contencao na TBLSPACE, para reduzir isto voce deve distribuir suas tabelas em diversos dbspaces.
Esta contencao ocorre em instancias com um alto volume de threads concorrentes e muitas tabelas no catalogo.

http://www-01.ibm.com/support/docview.wss?rs=630&context=SSGU8G&dc=DA400&uid=swg27015907&loc=en_US&cs=UTF-8&lang=en&rss=ct630db2

- PT_??????
Aqui sao contencoes de tabelas mesmo, PT significa partition, meios de reduzir este tipo de contencao:

Onde consta ????? 'e o partnum em hexa, voce deve converte-lo para decimal e acessar a tabela sysmaster:systabnames e identificar o objeto atraves do partnum.

Caso seja um indice , voce deve checar a quantidade de extents ou niveis do indice.

Caso seja uma tabela, voce deve checar a quantidade de extents, ocorrencias de lock wait etc.

De forma geral voce deve verificar os caches de dicionario, distribuicao e procedure:

onstat -g dic -> ver parametro DD_HASHSIZE / DD_MAXSIZE
onstat -g dsc -> ver parametro DS_HASHSIZE / DS_POOLSIZE
onstat -g prc -> ver parametro PC_POOLSIZE

Lembrete: muitas instalacoes Informix trabalham com estes parametros com valores default.

O Cesar Martins tem um artigo muito interessante sobre o tunning no cache de distrbuicao:

http://www.imartins.com.br/informix/artigos/configurando-cache-distribuicao-dados

Aguardem no proximo capitulo, irei colocar alguns exemplos de como identificar longspings.

Saludos

Vagner

sexta-feira, 7 de agosto de 2009

Detalhes sobre DBINFO

Ni-hao,

Outro dia expliquei ao meu amigo Lud alguns detalhes sobre o DBINFO, achei interessante expor aqui essa dúvida.

Lá em meados de 1996 quando eu começei a programar em Informix 4gl (bons tempos!) eu fazia uso de uma estrutura chamada SQLCA, a mesma me retornava algumas informações do tipo:

- Numero de linhas processadas no comando SQL
- Ultimo numero inserido em um coluna do tipo serial
- Isam error

Nos dias atuais as linguagens de programação não trabalham ligadas diretamente ao banco de dados, é comum existir o ODBC, OLEDB ou outra camada entre a aplicação e o banco de dados.

No caso da funcao DBINFO a duvida do meu amigo foi "Mas oque realmente faz o DBINFO?"

A explicação é o DBINFO apenas acessa a estrutura ifx_sqlca_t que é estrutura correspondente ao SQLCA que conhecemos no Informix 4gl.

A definição da estrutura ifx_sqlca_t pode ser visualizada em $INFORMIXDIR/incl/esql/sqlca.h

Abracos

Vagner

domingo, 2 de agosto de 2009

Usando cláusula Current em Stored Procedure

Ni-hao,

Hoje irei falar de uma coisa que ocorre no Informix 7, quando executamos uma procedure e dentro dela temos que usar a cláusula CURRENT, temos um problema pois está cláusula não reflete a data e hora corrente quando a procedure tem um longo tempo de duração.

Para este tipo de situação eu criei a procedure abaixo:

create procedure "informix".timestamp()
returning datetime year to second;

define whora datetime year to second;

SELECT DBINFO( 'UTC_TO_DATETIME', sh_curtime ) into whora
FROM sysmaster:sysshmvals;

return whora;

end procedure;


O select abaixo acessa a coluna sh_curtime que representa o relógio interno do banco de dados, a função DBINFO converte a coluna sh_curtime do formato integer para data/hora.

SELECT DBINFO( 'UTC_TO_DATETIME', sh_curtime ) into whora
FROM sysmaster:sysshmvals;


Saludos