Como ver a quantidade de dados pendentes em um soquete de domínio unix?

2

Quando estou logado em uma sessão tmux de dois computadores diferentes, gostaria de poder rastrear a quantidade de dados pendentes nos sockets de ambos os tmux session. Para testar isso eu loguei no computador A e no computador B , então do computador B usei o ssh para acessar o computador A . De cada console, eu associei à mesma sessão tmux e comecei a executar um script que imprime o número da iteração de 1 a 100M. De fato, vejo que os números das iterações impressas no console local ( A ) são maiores do que os números impressos no console remoto ( B ), já que leva tempo para as mensagens viajarem para o computador remoto

[user@server00 ~]$ lsof | grep tmux | grep unix
tmux      1073     user    4u     unix 0xf6dc2ac0       0t0   18681 socket
tmux      1073     user    5u     unix 0xf6dc3840       0t0   18682 socket
tmux      1073     user    6u     unix 0xf137ed00       0t0   19768 socket
tmux      1073     user    7u     unix 0xf6dc2880       0t0   18683 /tmp/tmux-1000/default
tmux      1073     user    8u     unix 0xf6cbcd80       0t0   22647 /tmp/tmux-1000/default
tmux      1073     user   14u     unix 0xf137ef40       0t0   12146 /tmp/tmux-1000/default
tmux      1092     user    4u     unix 0xf6cbd200       0t0   24848 socket
tmux      1092     user    5u     unix 0xf6cbef40       0t0   24849 socket
tmux      1092     user    6u     unix 0xf6cbed00       0t0   24850 socket
tmux      1177     user    4u     unix 0xf137fcc0       0t0   19947 socket
tmux      1177     user    5u     unix 0xf137fa80       0t0   19948 socket
tmux      1177     user    6u     unix 0xf137c240       0t0   19949 socket
[user@server00 ~]$ netstat -a | grep tmux
unix  2      [ ACC ]     STREAM     LISTENING     18683    /tmp/tmux-1000/default
unix  3      [ ]         STREAM     CONNECTED     12146    /tmp/tmux-1000/default
unix  3      [ ]         STREAM     CONNECTED     22647    /tmp/tmux-1000/default

Como vejo apenas o caminho de /tmp/tmux-1000/default , esperava ver seu tamanho aumentar, mas seu tamanho é sempre 0

[user@server00 ~]$ ls -l /tmp/tmux-1000/default
srwxrwx---. 1 user user 0 Feb  9 10:45 /tmp/tmux-1000/default

Como posso ver os dados pendentes no soquete e como saber se o soquete está congestionado?

    
por e271p314 09.02.2014 / 17:51

2 respostas

1

Eu não acredito que seja assim que os soquetes funcionam. Você continua lendo até que esteja vazio, o tamanho não é comunicado através do soquete, e não é do meu conhecimento exibido em qualquer lugar no soquete que é criado no sistema de arquivos /tmp/tmux-1000/default .

trecho

Unix Socket FAQ - 2. Questions regarding both Clients and Servers (TCP/SOCK_STREAM)

I don't think that write() can legitimately return 0. read() should return 0 on receipt of a FIN from the peer, and on all following calls.

So yes, you must expect read() to return 0.

Fonte: Perguntas freqüentes sobre o soquete do Unix

Além disso, se você observar como a leitura de um soquete é feita com frequência, você estará basicamente em um loop while (true) , lendo continuamente até que a conexão seja encerrada explicitamente. Você não tem como saber quantos dados estão pendentes no soquete.

trecho

while ( true )
    {
        unsigned char packet_data[256];
        unsigned int maximum_packet_size = sizeof( packet_data );
...

Fonte: ENVIANDO E RECEBENDO PACOTES

Então, para responder à sua pergunta, a única maneira de saber quantos dados estão no soquete é ler tudo!

Referências

por 09.02.2014 / 18:27
2

Eu tenho medo que a resposta do slm (atualmente marcada como correta) esteja incorreta em várias frentes.

Em primeiro lugar, o OP estava perguntando se havia uma maneira de dizer externamente se um processo tinha dados pendentes em um soquete AF_UNIX. A resposta do slm requer modificações no processo em si. Geralmente, o netstat é útil para examinar externamente um processo sobre o qual você não pode controlar o comportamento. Pode ser útil saber se um processo possui dados não lidos, o que pode indicar que o processo não está atendendo adequadamente seu soquete com leituras (isto é, talvez ele tenha um erro ou esteja configurado incorretamente ou um encadeamento morreu).

Em segundo lugar, slm indica que você não pode fazê-lo, mesmo dentro do processo, exceto lendo o socket até que esteja vazio. Também errado. Um processo pode usar o SIOCINQ/FIONREAD ioctl para detectar quantos dados estão pendentes em um soquete, sem lê-los (prefiro FIONREAD , porque significa a mesma coisa em mais contextos e, portanto, é mais geralmente reconhecido que SIOCINQ , que é específico para soquetes). Veja a página man do unix (7) .

Finalmente, no Linux existe uma maneira de fazer o que o OP realmente requisitou ( externamente detecta a quantidade de dados pendentes em um soquete de domínio unix), usando o programa ss , em vez de netstat . ss -ax fará o truque. É como netstat em esteróides. Veja a página man ss (8) .

Referências

por 03.02.2015 / 18:58

Tags