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

Um comentário:

  1. Saudações, Pontes.
    Sou o José Paulo da Scope Systems.
    Estamos precisando de um provider de Informix para utilizar o ADO Entity Framework .NET.
    Você pode nos ajudar?
    Meu e-mail é josepaulolima@gmail.com
    Desde já, agradeço.

    ResponderExcluir

Observação: somente um membro deste blog pode postar um comentário.