AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 543971
Accepted
Scott M
Scott M
Asked: 2019-09-27 18:40:45 +0800 CST2019-09-27 18:40:45 +0800 CST 2019-09-27 18:40:45 +0800 CST

Linux TCP, como depurar atrasos inesperados escrevendo um fluxo?

  • 772

Problema: meu código de servidor de música, usando uma conexão TCP simples em um soquete de bloqueio, precisa transmitir bytes para um cliente (acontece ser um squeezebox da Logitech). Não é complicado - leia 64k de um arquivo, grave-o no squeezebox, repita. Está tudo rodando em uma LAN local não ocupada, e o servidor e o cliente squeezebox estão conectados ao mesmo switch. O squeezebox não consome o fluxo muito rapidamente, então o servidor, em praticamente qualquer hardware, não deve ter problemas para manter o cliente alimentado.

E quando o servidor é executado em um Raspberry pi 3B+, na verdade não há nenhum problema. Um pi zero provavelmente poderia acompanhar. Quando é executado no meu laptop Linux, idem, está tudo bem. Posso perguntar ao squeezebox periodicamente o quão cheio está o buffer interno e ele rapidamente chega a cerca de 99+% e permanece lá. As gravações do servidor (após as primeiras) passam a maior parte do tempo bloqueadas, como seria de esperar.

Mas eu movo o servidor para um Azulle Inspire rodando Linux, conectado ao mesmo switch, e algo dá muito errado. A música começa a tocar, mas rapidamente gagueja e morre. O squeezebox informa que o buffer está começando a encher, mas então algo trava e o buffer esvazia rapidamente (às vezes aumentando um pouco, então acho que algum tráfego passa, mas não o suficiente), interrompendo a música. O servidor afirma que continua escrevendo, embora as gravações demorem mais do que eu esperava.

Observe que o Azulle tem outras funções de rede ocasionais e todas funcionam bem, embora eu provavelmente não notaria pequenos atrasos de rede para a maioria desses outros aplicativos. Mas quando o servidor de música está em execução, o NUC (e a rede) ficam ociosos - isso não é um problema de CPU ou largura de banda.

Já tentei trocar cabos, trocar switches e usar portas diferentes nos switches. Eu tentei enviar tamanhos de buffer diferentes. Sem efeito. Tudo o que posso dizer é que há algo muito instável sobre a pilha TCP ou o hardware ethernet.

Como depuro isso? O laptop linux, que funciona muito bem, está executando o Linux 4.15.0-55-generic (e o apt upgrade não muda isso). O Azuelle está rodando Linux 4.15.0-64-generic, Mint. Eu não posso acreditar que há uma mudança radical no tratamento do TCP no 4.15.0. Eu não estou muito familiarizado com ferramentas como tcpdump, deixe ao longo da configuração do kernel ou depuração, então estou procurando por alguns ...

os tempos de ping entre o laptop Linux e o Azuelle são consistentemente em torno de 0,2 ms e 0,35 ms, com 0,33 ms típico.

Estou perdido. TIA.

tcp
  • 2 2 respostas
  • 709 Views

2 respostas

  • Voted
  1. V13
    2019-09-29T12:54:22+08:002019-09-29T12:54:22+08:00

    Use tcpdump para capturar seu stream:

    tcpdump -i iface -s 1500 -w out.cap 'tcp and port xxx'
    

    onde ifaceé a interface de rede e xxxé um dos dois números de porta.

    Em seguida, abra out.capcom wireshark e veja o que você pode fazer com o traço. Deve ser óbvio o que está acontecendo lá. Se não, poste novamente.

    FWIW, pelo que você está dizendo, parece um problema de MTU.

    • 1
  2. Best Answer
    Scott M
    2019-09-29T16:34:06+08:002019-09-29T16:34:06+08:00

    Bem, essa era a pista que eu precisava.

    Eu encontrei isso quando fiquei curioso sobre os tamanhos de MTU:

    /sys/class/net/enp1s0/mtu:1500 /sys/class/net/lo/mtu:65536 /sys/class/net/wlp2s0/mtu:1500

    Tudo bem, mas o wlp parecia uma conexão sem fio. Sem fio? Isso estava mesmo ligado? Então eu fiz o tcpdump na interface wlp..., e vi uma mensagem que reconheci do protocolo e depois uma longa série de ACKs, e nada mais, e o streaming tocou alguns segundos de música e falhou.

    Então desliguei o wireless e tentei novamente. Sem gagueira. Tudo liso.

    O estranho é que o servidor está a poucos metros do ponto de acesso sem fio. Mesmo que estivesse usando, não deveria haver largura de banda suficiente. Eu me pergunto se, por algum motivo, ter os dois ao mesmo tempo causou algum problema, mas pensei que era impossível...

    • 1

relate perguntas

  • O AF_INET é necessário para criar o arquivo de soquete?

  • Perfuração UDP ou TCP para conectar dois pares (cada um atrás de um roteador)

  • Construindo uma ponte de soquete Unix via TCP

  • A conexão com o IP 0.0.0.0 foi bem-sucedida. Como? Por quê?

  • Qual processo é responsável pelo TCP no Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve