기계가 패킷을 수신하여 처리하고 응답을 돌려주는 데 걸리는 시간을 확인하려고합니다.수면을 사용하면 측정 된 네트워크 대기 시간이 왜 변경됩니까?
이 기계는, I '는 서버의 전화거야, 다른 버퍼는 버퍼에 복사 수신 된 콘텐츠 (memcpy(3)
)를 패킷 (recv(2)
)를 수신하고, 피드백 패킷을 전송하는 매우 간단한 프로그램 (send(2)
실행). 서버는 NetBSD 5.1.2를 실행합니다. 내가 오류 검사 및 명확성을 위해 다른 사소한 것들을 제거
struct timespec start, end;
for(i = 0; i < pkt_count; ++i)
{
printf("%d ", i+1);
clock_gettime(CLOCK_MONOTONIC, &start);
send(sock, send_buf, pkt_size, 0);
recv(sock, recv_buf, pkt_size, 0);
clock_gettime(CLOCK_MONOTONIC, &end);
//struct timespec nsleep = {.tv_sec = 0, .tv_nsec = 100000};
//nanosleep(&nsleep, NULL);
printf("%.3f ", timespec_diff_usec(&end, &start));
}
:
내 클라이언트는 왕복 시간을 번 (pkt_count
)를 측정한다. 클라이언트는 Ubuntu 12.04 64 비트에서 실행됩니다. Ubuntu 커널 만 실시간 (-rt)이지만 두 프로그램 모두 실시간 우선 순위로 실행됩니다. 프로그램 간의 연결은 TCP입니다. 이것은 잘 작동하고 저에게 평균 750 마이크로 초를줍니다.
그러나 (100μs의 슬립으로) 주석 처리 된 nanosleep 호출을 활성화하면 평균 측정 값이 100μs가되어 평균 650μs가됩니다. 200μs 동안 잠을 자면 대책이 550μs로 떨어집니다. 이것은 600μs의 수면이 될 때까지 올라가며 평균 150μs가됩니다. 그런 다음, 수면을 700 μs로 올리면 측정 값은 평균 800 μs까지 올라갑니다. Wireshark로 프로그램의 조치를 확인했습니다.
나는 무슨 일이 일어나는지 알 수 없다. 클라이언트와 서버 모두에서 이미 TCP_NODELAY 소켓 옵션을 설정했지만 차이점은 없습니다. UDP를 사용했지만 차이점은 없습니다 (동일한 동작). 그래서이 행동은 Nagle 알고리즘 때문이 아니라고 생각합니다. 뭐가 될수 있었는지?
[UPDATE]는
여기서 와이어 샤크와 함께 클라이언트의 출력의 스크린 샷이다. 이제 다른 서버에서 서버를 실행했습니다. 동일한 구성의 동일한 OS (펜 드라이브의 라이브 시스템)를 사용했지만 하드웨어가 다릅니다. 이 동작이 나타나지 않아 모든 것이 예상대로 작동했습니다. 하지만 문제는 여전히 남아 있습니다 : 이전 하드웨어에서 왜 그런 일이 발생합니까?
[업데이트 2 : 자세한 정보는] 내가 전에 말했듯이
, 나는 두 개의 서로 다른 서버 컴퓨터에 프로그램 내 쌍 (클라이언트/서버)를 테스트했다. 나는 두 가지 결과를 얻었다.
제 서버 (이상한 일)는 1Gbps의 이더넷 인터페이스하는 RTD Single Board Computer이다. 두 번째 서버 (정상적인 서버)는 100Mbps 이더넷 인터페이스가있는 Diamond Single Board Computer입니다. 둘 다 SAME pendrive에서 SAME OS (NetBSD 5.1.2)를 실행합니다. 이러한 결과에서
는,이 동작은 드라이버 또는이 NIC 자체가, 그런 일이 왜 아직 ... 상상도 할 수 있지만에
"wireshark를 사용하여 프로그램의 조치를 확인했습니다"라고 말하면 분명히 확인한 내용을 명확히 할 수 있습니까? 이것이 회의적으로 들리는 경우 사과 드리지만, 나노 슬립 호출이 패킷의 RTT에 실제로 영향을 주어야한다는 단순한 두뇌가 생각할 이유가 전혀 없습니다. Afterall, 그것은 당신의 recv 호출 후 온다 ... 나는 당신이 RTT를 측정하기 위해 사용하고있는 코드에 더 많은 이슈가 될 것이라고 생각한다. Wireshark가 실제로보고있는 결과를 검증한다면 내 이론은 창 밖으로 나옵니다. – 2to1mux
Wireshark가 실행되는 동안 프로그램을 수천 번 반복 실행합니다. 프로그램이 끝나면 Wireshark 로그를 조사하고 거기에서 측정 한 내용을 내 프로그램에서 인쇄 된 것과 비교합니다. 그들은 매우 유사합니다. 나는 스크린 캡쳐를 붙일 수 있었다 ... 솔직히 이유를 생각할 수 없기 때문에 이것은 나에게도 미치겠다 ... 문제는 서버에있을 수 있는가? – bsmartins
화면 캡처를 게시 하시겠습니까? 나는 이론을 가지고 .. – 2to1mux