log PID de cada tentativa de conexão

4

Encontrar o PID de uma conexão estabelecida é trivial usando netstat ou lsof . No entanto, eu tenho um processo que está criando uma conexão de 60 segundos para o nosso banco de dados e bloqueá-lo, maximizando o limite de tentativas de conexão com falha. Eu posso aumentar o limite de conexão com falha para algo extremamente alto no banco de dados, ou eu posso tentar rastrear o que está fazendo a conexão, e eu escolhi o último.

Com base no tcpdump / wireshark, posso ver que o que está acontecendo é que uma conexão é estabelecida e, em seguida, o servidor de conexão fecha imediatamente a conexão antes que o servidor possa responder. O que eu não sei é porque.

O primeiro passo é descobrir o que o PID está abrindo a conexão. Infelizmente, parece mais fácil falar do que fazer. O problema é que, quando uma conexão entra no estado TIME_WAIT, ela não está mais associada a um PID. Como minha conexão tem uma vida útil de menos de um décimo de segundo, existe alguma maneira de registrar essas informações?

netstat e lsof parecem poder pesquisar a cada segundo, mas isso simplesmente não é rápido o suficiente com a tentativa de conexão com a qual estou lidando. Existe um gancho que eu possa conectar para despejar essas informações em um log? Ou é a minha única opção para força bruta com um loop e alguma codificação?

Eu uso o CentOS 6.

    
por James Shewey 26.02.2015 / 07:01

1 resposta

3

Considere o uso do SystemTap . É um mecanismo de instrumentação dinâmico que corrige dinamicamente o kernel para que você possa rastrear qualquer evento no kernel, como abrir um soquete. Ele é ativamente desenvolvido pelo RedHat, por isso é suportado no CentOS.

Instalando

Para instalar o SystemTap no CentOS 6:

  1. Ativar repositório debuginfo:

    sed -i 's/^enabled=0/enabled=1/' /etc/yum.repos.d/CentOS-Debuginfo.repo
    
  2. Instale o SystemTap:

    yum install systemtap
    
  3. Instale os pacotes debuginfo para o kernel. Pode ser feito manualmente, mas existe uma ferramenta que pode fazer isso automaticamente:

    stap-prep
    

Rastreio

O SystemTap não possui uma sonda tapset para conexão TCP, mas você pode se ligar diretamente às funções do kernel! Você também pode fazer isso no nível do soquete.

Ou seja. criar script chamado conn.stp :

probe kernel.function("tcp_v4_connect") {
    printf("connect [%s:%d] -> %s:%d\n", execname(), pid(),
            ip_ntop(@cast($uaddr, "struct sockaddr_in")->sin_addr->s_addr),
            ntohs(@cast($uaddr, "struct sockaddr_in")->sin_port));
}

Isso fornecerá a seguinte saída:

# stap conn.stp
connect [nc:2552] -> 192.168.24.18:50000
connect [nc:2554] -> 192.168.24.18:50000
connect [nc:2556] -> 192.168.24.18:50000

No entanto, os eventos de desconexão de rastreamento parecem ser mais complicados.

    
por 26.02.2015 / 08:35