전송률 측정 방법에 관한 질문입니다.
글쓴이: kimtakeun / 작성시간: 금, 2005/08/12 - 12:06오전
안녕하세요.
FTP 비슷한 프로그램을 만들고 있는데, 전송률을 측정해서 전송하는데 걸리는 시간을 측정하고 싶은데 잘 되지가 않네요.
제가 측정한 방법은 다음과 같이 write() 하기 전후로 시간을 측정하고, write 하는 bytes 수에 시간 차이를 나누어서 계산을 하였습니다.
long start_time = System.currentTimeMillis();
write(buf, 0, n);
long end_time = System.currentTimeMillis();
long 전송률 = n / (end_time - start_time);
뭔가 계산은 되는데, 전송률이 터무니 없이 높게 나옵니다. 대략 260M/sec 정도가 나오는데 말이 안됩니다. 자바 document 에 보면 currentTimeMills 함수가 OS 마다 틀릴 수도 있다고 했는데 제가 따로 측정해보니 정확하게 millisecond 단위로 나오구요.
전송률을 꼭 측정해야 하는데 어떻게 하면 될까요? 그리고 보통의 FTP client 프로그램에서는 어떻게 전송률을 측정하게 되는지 좀 알려주세요.
Forums:
정확한 시간을 측정하기 위해서라면long start time 과
정확한 시간을 측정하기 위해서라면
long start time 과 long end time 사이에서는
컨텍스트 스위치가 발생하지 않아야 합니다.
인터럽트를 막던지 스케줄을 막던지 하는 방법을 쓸수 있는지
모르겠지만 어쨌든 막아야 정확한 시간이 나오겠네요..
근데 또 질문 하신 문제가 이문제는 아니군요..
cpu 가 잠시 딴짓하고 오건 말건 측정시간은 실제 수행시간보다
길어질수는 있지만 짧아질수는 없는것이니까요..
그렇타면 남은 문제는 n 이네요..
n의 자료형이 char 인지 모르겠습니다만..
n 의 단위가 무었인지 다시한번 확인해보세요..
bit, byte, kb
통신에서의 전송시간은 latency로 보통 측정합니다.보내는 측만 보
통신에서의 전송시간은 latency로 보통 측정합니다.
보내는 측만 보지 않고, 로컬송신+원격지수신+원격지처리/연산+원격지송신+로컬수신으로 말입니다.
* iperf 가 좋은 참고자료 같습니다.
http://dast.nlanr.net/Projects/Iperf/
아울러, 관련링크를 잘~ 따라다니면, 좋은 정보 많이 얻으실것 같습니다.
질문자님의 오차는 소켓의 send 버퍼에 의해 생기는 오차입니다.
질문자님의 오차는 소켓의 send 버퍼에 의해 생기는 오차입니다.
write 함수를 실행하고 빠져나오는 시간은 실제 데이터가 사용자에게 전달 됐을 때가 아니고 소켓의 송신 버퍼에 송신할려는 데이터가 복사가 완료되면 함수를 빠져 나오기 때문에 그렇습니다.
실제 데이터는 그 이후에 커널에서 백그라운드로 알아서 보내줍니다.
그래서 원질문자님의 방식(소켓은 당연히 블럭모드겠죠?)으로 하면 소켓의 send 버퍼 사이즈를 많이 상회하는 자료량을 송신하면 거의 송신속도 근사치로 값을 알아낼 수 있습니다. - 소켓 버퍼 사이즈를 디폴트로 놓고 1Mb 정도를 한번에 송신해 보세요.
위와 같은 이유로 일반적인 ftp client 프로그램에서 파일은 송신한후 송신속도를 보면 1K 정도의 작은 파일들은 실제 회선 대역폭보다 크게 상회하는 값이 나오는데 위와 같은 이유에서 입니다.
댓글 달기