문제

도와주세요! 가능한 한 실시간 처리에 가깝게 필요한 응용 프로그램이 있으며 TCP 및 UDP 모두 에서이 비정상적인 지연 문제가 계속 발생합니다. 지연은 시계처럼 발생하며 항상 같은 시간 (대부분 15 ~ 16ms)입니다. 모든 기계 (Eve Local) 및 모든 네트워크 (2 개가 있음)로 전송할 때 발생합니다.

문제의 빠른 실행 :

저는 항상 C ++에서 Winsock을 사용하고 있으며 VS 2008 Pro에서 컴파일되었지만 TCP 및 UDP를 사용하여 다양한 방법으로 보내고받을 수있는 여러 프로그램을 작성했습니다. 나는 항상 다양한 언어 (Matlab, C#, C ++)로 작성된 중간 프로그램 (로컬 또는 원격으로 실행)을 사용하여 한 프로그램에서 다른 프로그램으로 정보를 전달합니다. 두 Winsock 프로그램 모두 동일한 컴퓨터에서 실행되므로 동일한 시계에서 TX 및 RX 용 타임 스탬프를 표시합니다. 나는 패킷의 버스트가 전송되는 패턴이 계속 나타나고 다음 버스트가 프로그래밍되지 않더라도 다음 버스트 전에 약 15 ~ 16 밀리 초의 지연이 있습니다. 때로는 각 패킷 사이에 15 ~ 16ms 일 수 있습니다. 패킷의 버스트. 다른 시간 (드물게) ~ 47ms와 같이 길이 지연이 다릅니다. 나는 전송 된 버스트 사이에 동일한 지연 패턴이 나타나면서 전송되는 밀리 초 이내에 패킷을 항상받는 것 같습니다.

Winsock 또는 NIC가 각 전송 전에 버퍼링 패킷을 사용하고 있다는 의심이 있지만 증거를 찾지 못했습니다. 다양한 수준의 트래픽을 얻는 하나의 네트워크와 기가비트 연결이 있지만 (사용자가 적어도 사용자로부터) 비문 네트워크가있는 클러스터에서 중간 프로그램을 실행할 때도 동일한 것을 경험합니다 (최소한 사용자) 및 2 기가비트 연결. 중급 프로그램을 현지에서 로컬로 운영 할 때이 지연을 경험할 것입니다.

도움이 되었습니까?

해결책

오늘 아침 Java에서 서버를 다시 작성하는 동안 문제를 알아 냈습니다. 내 Windows 시스템 클럭의 해상도는 15 ~ 16 밀리 초입니다. 즉, 전송 시간과 동일한 밀리 초를 보여주는 모든 패킷은 실제로 16 밀리 초 간격으로 다른 밀리 초로 전송되고 있지만 내 타임 스탬프는 15 ~ 16 밀리 초마다 증가하므로 동일하게 나타납니다.

나는 내 질문에 답하기 위해 여기에 와서 프로그램의 우선 순위를 높이는 것에 대한 응답을 보았다. 그래서 나는 세 프로그램을 모두 시작했고, 작업 관리자에 들어갔고, 세 가지를 모두 "실시간"우선 순위로 올렸다 (다른 프로세스는 없었던). 나는 15 ~ 16 밀리 초 간격을 얻었습니다.

그래도 답변 해 주셔서 감사합니다.

다른 팁

항상 버퍼링이 관련되어 있으며 하드웨어/드라이버/OS 등에 따라 다릅니다. 패킷 스케줄러도 큰 역할을합니다.

"하드 실시간"보증을 원한다면 아마도 창문에서 멀리 떨어져 있어야합니다 ...

아마도 당신이보고있는 것은 스케줄러 지연입니다. 응용 프로그램이 다른 프로세스가 타임 슬라이스를 완료하고 CPU를 포기하기를 기다리고 있습니다. 멀티 프로세서 창의 표준 시간은 15m ~ 180ms입니다.

응용 프로그램/스레드의 우선 순위를 높일 수 있습니다.

오 예, 무슨 말인지 알아요. Windows와 버퍼 ... Sender에서 SO_SNDBUF의 값을 조정하고 Reciever 측에서 SO_RCVBUF를 조정하십시오. 또한 포함 된 네트워킹 하드웨어 (라우터, 스위치, 미디어 게이트웨이)를 점검합니다. 대기 시간을 피하기 위해 기계간에 가능한 한 많은 것을 제거하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top