Entendendo e otimizando a conectividade entre Cliente / Servidor.

Versão para impressãoEnviar para amigoVersão PDF

Observação: Estas configurações *não* são validas apenas para o protocolo onipcshm (IPC Shared Memory)

Entendendo como funciona a alocação de buffers para comunicação


  • O buffer aqui descrito , é um buffer especifico da área de comunicação do banco e possui um tamanho padrão de 4096 bytes.
  • Toda a conexão com o banco possue um network private buffer, que é um buffer fixo utilizado para a comunicação com o cliente.
    Por padrão possui o tamanho de 1 (um) buffer.
  • Existe no banco uma área chamada global buffers que é utilizado para vários objetivos.
  • Banco possui o network free buffers, que é uma área em *comum* para todas as conexões (threads sqlexec). Quando o private buffer não é suficiente, elas utilizam esta área como "complemento".
  • Caso a área do network free buffer seja completamente utilizada e mais buffers sejam necessários, o banco recorre ao global buffer pool, após a utilização estes buffers são devolvidos ao global buffer pool. Este processo pode consumir CPU.
    O tamanho do network free buffers é calculado conforme abaixo:
    net_free_buffer = 100+0.7 * [nmr_conexões]
    [nmr_conexões] é o parametro definido no NETTYPE (valor absoluto, sem considerar a quantidade de pools).
    Ex.: NETTYPE soctcp,3,160,NET
    net_free_buffer = 100 + 0.7 * 160 = 212 buffers
  • O Tamanho do buffer de comunicação , que por padrão é 4096 bytes, pode ser alterado através da variável de ambiente IFX_NETBUF_SIZE
  • A quantidade de buffers de comunicação padrão para cada conexão (network private buffer) é de 1 buffer. Este valor pode ser alterado através da variável IFX_NETBUF_PVTPOOL_SIZE.

Portanto a ordem de alocação dos buffers é:

network private buffer -> network free buffer -> global buffer pool

Váriaveis de ambiente definidas no servidor


Váriaveis de ambiente definidas no Cliente / Aplicação


  • env FET_BUF_SIZE: Padrão 4096, limite de 32767.
    Altera o valor do fetch buffer e insert buffer.
    Quando o cliente solicita os dados, os dados são enviados ao cliente, e este só irá ler as informações quando completar o fetch buffer e solicitar novamente os restante dos dados quando já tiver lido todos os dados do fetch buffer.
    Para INSERTs os dados são incluido em um buffer chamado insert buffer até completa-lo, ou são enviado apenas quando ocorrer um FLUSH ou CLOSE. Este buffer também segue o tamanho definido para o fetch buffer definido nesta variável.
  • env OPTOFC: Se ativado (valor igual a 1), otimiza o OPEN,FETCH e CLOSE de cursores
    Onde o OPEN só é enviado ao servidor quando o FETCH é executado, evitando assim o trafego de rede em uma mensagem e o CLOSE é automaticamente executado no servidor quando a ultima linha dos dados requisitados é enviada para o cliente.
    Observação: se na aplicação houver um CLOSE, não será gerado erro.
    Este parâmetro tem um efeito muito grande sob a performance de rede em aplicações com muitas transações pequenas.
  • env OPTMSG: Se ativado (valor igual a 1), o cliente acumula alguns comandos antes de envia-lo para o banco.
  • env IFX_LOB_XFERSIZE: Na versão 11.50 xC4 foi incluído o parametro IFX_LOB_XFERSIZE, este parâmetro tem efeito na transferência de campos BLOBs/CLOBs, onde é definido a "frequência" de sua checagem durante a transferência, gerando um overhead de rede. Alterando este parâmetro você pode otimizar este overhead
ATENÇÃO: As variáveis FET_BUF_SIZE e OPTMSG devem ser utilizadas com *cuidado* pois afetam o tratamento de erro na aplicação do cliente , por exemplo, no caso da aplicação enviar vários INSERTS seguidos de vários UPDATES, todos estes comandos poderão ser enviados juntos, se ocorrer um erro em algum INSERT, para a aplicação o erro poderá aparentar ter ocorrido em um UPDATE ou em um INSERT diferente do que realmente originou o erro.

Monitorando


Deve-se utilizar o comando onstat -g ntu para monitorar a utilização dos buffers de comunicação, os os campos são:
q-free : current/maximum number of free network buffers since initialization
q-limits : threshold limit for buffers on the free/normal network buffer queue
q-exceeds: number of times the limit for buffers on the free/normal network buffer queues has been exceeded
q-nrm : current/maximum number of normal data buffers used by this thread.
q-pvt : current/maximum number of free private data buf used by this thread
q-exp : current/maximum number of expedited data buf used by this thread.

#Os valores são exbidos no formato: "current number / highest number" . 

Para identificar o tamanho do buffer de comunicação, pode-se utilizar o seguinte comando:

onstat -g afr global | grep net 

Recomendações


  • Definir quantidade apropriada de SOC/TLI VPs ou CPU VPs no parâmetro NETTYPE (ou VPCLASS, se utilizado versão mais recente do Informix). Não existe regra de qual é a melhor forma e quantidade. É necessário realizar testes para avaliar.
  • Definir o tamanho dos buffer sizes das conexões através da opção b=[bytes] no sqlhosts .
    Este parâmetro diz a quantidade de dados que o banco irá armazenar antes de enviar ao cliente. Conseqüentemente tem efeito direto na quantidade de pacotes de rede gerado e quantidade de memória que o banco irá alocar.
    Por exemplo, se definir 12k (b=12000) e o sistema estiver trabalhando com 500 conexões o banco irá alocar 6 MBytes de memória (= 12k * 500) para as conexões.
    Um valor alto neste buffer ajuda aplicações com muitas transações a ter mais eficiência no trafego de rede pois evita que os dados sejam fragmentados em pequenos pacotes.
    Atenção, este parâmetro tem efeito apenas no sentido Servidor -> Cliente.
  • Deve-se otimizar com as variáveis de ambiente IFX_NETBUF_PVTPOOL_SIZE e IFX_NETBUF_SIZE antes de iniciar o banco quando identificado situações através do q-exceed e q-pvt do onstat -g ntu e quando o numero de free buffers ( q-pvt / q-free ) é constantemente zero, o quer dizer que não há buffers sobrando.
  • Compatiblizar a configuração do IFX_NETBUF_SIZE com a opção b do sqlhosts.
  • Aumentar o tamanho definido no IFX_NETBUF_SIZE pode melhorar a performance em situações de carga de dados, inclusão de registros com mais de 4 kbytes e campos BLOBs (text,byte,clob e blob).

4
Média: 4 (4 votos)
Sua avaliação: Nenhum

Comentar

O conteúdo deste campo é privado não será exibido ao público.
  • Endereços de páginas de internet e emails viram links automaticamente.
  • Você pode usar tags BBCode no texto.
  • Tags HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>

Mais informações sobre as opções de formatação

CAPTCHA
Este teste é para bloquear programas automatizados e previnir spams
CAPTCHA de Imagem
Digite o texto exibido na imagem.