Pergunta

AJUDA POR FAVOR! Tenho uma aplicação que necessidades como perto de processamento em tempo real quanto possível e eu continuo correndo para esta questão atraso incomum com TCP e UDP. O atraso ocorre como um relógio e é sempre o mesmo comprimento de tempo (principalmente de 15 a 16 ms). Ela ocorre quando a transmissão a qualquer máquina (véspera local) e em qualquer rede (temos dois).

Um rápido correr para baixo do problema:

Estou sempre usando winsock em C ++, compilado no VS 2008 Pro, mas eu ter escrito vários programas para enviar e receber de várias maneiras usando TCP e UDP. Eu sempre uso um programa intermediário (rodando localmente ou remotamente) escrito em várias línguas (Matlab, C #, C ++) de transmitir a informação de um programa para o outro. Ambos os programas winsock executado na mesma máquina para que eles exibir marcas de tempo para TX e RX do mesmo relógio. Eu continuo vendo um padrão emergir, onde uma explosão de pacotes vai ser transmitido e, em seguida, há um atraso de cerca de 15 a 16 milissegundos antes da próxima explosão, apesar de nenhum atraso sendo programada. Às vezes, pode ser de 15 a 16 ms entre cada pacote, em vez de uma explosão de pacotes. Outras vezes (raramente) I terá um atraso de comprimento diferente, como ~ 47 ms. Eu sempre parecem para receber os pacotes de volta dentro de um milésimo de segundo deles sendo transmitida embora com o mesmo padrão de atraso a ser exibido entre as rajadas transmitidas.

Eu tenho uma suspeita de que winsock ou o NIC é amortecer os pacotes antes de cada transmissão, mas eu não encontrei nenhuma prova. Eu tenho uma conexão Gigabit a uma rede que recebe vários níveis de tráfego, mas também experimentar a mesma coisa durante a execução do programa intermediário em um cluster que tem uma rede privada, sem tráfego (de usuários, pelo menos) e uma conexão de 2 Gigabit. Vou até mesmo experimentar este atraso durante a execução do programa intermediário localmente com o envio e recepção de programas.

Foi útil?

Solução

Eu descobri o problema esta manhã durante a substituição do servidor em Java. A resolução do meu relógio do sistema Windows é entre 15 e 16 milissegundos. Isso significa que todos os pacotes que mostra o mesmo milissegundo como seu tempo de transmissão está realmente sendo enviados em diferentes milissegundos em um intervalo de 16 milissegundos, mas meu timestamps única incrementar a cada 15 a 16 milissegundos para que eles apareçam na mesma.

Eu vim aqui para responder a minha pergunta e eu vi a resposta sobre o aumento da prioridade do meu programa. Então eu comecei a todos os três programas, entrou em gerenciador de tarefas, levantou todos os três para prioridade "tempo real" (que nenhum outro processo estava em) e correu-los. Eu tenho os mesmos 15 a 16 milisegundos intervalos.

Obrigado pelas respostas embora.

Outras dicas

Há sempre buffer envolvido e que varia entre hardware / drivers / OS, etc Os programadores de pacotes também desempenham um grande papel.

Se você quer garantias "duro em tempo real", você provavelmente deve ficar longe de janelas ...

O que você provavelmente está vendo é um atraso programador - o aplicativo está esperando por outro processo (s) para terminar a sua fatia de tempo e desistir da CPU. timeslices padrão em multiprocessador Windows são de 15ms a 180ms.

Você poderia tentar elevar a prioridade da sua aplicação / thread.

Oh sim, eu sei que você quer dizer. Windows e seus buffers ... tente ajustar os valores de SO_SNDBUF no remetente e SO_RCVBUF no lado receptor. Além disso, verifique hardware de rede envolvida (roteadores, switches, gateways de mídia.) - eliminar o maior número possível entre as máquinas para evitar a latência

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top