전송률 측정 방법에 관한 질문입니다.

kimtakeun의 이미지

안녕하세요.
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 프로그램에서는 어떻게 전송률을 측정하게 되는지 좀 알려주세요.

jika의 이미지

정확한 시간을 측정하기 위해서라면

long start time 과 long end time 사이에서는

컨텍스트 스위치가 발생하지 않아야 합니다.

인터럽트를 막던지 스케줄을 막던지 하는 방법을 쓸수 있는지

모르겠지만 어쨌든 막아야 정확한 시간이 나오겠네요..

근데 또 질문 하신 문제가 이문제는 아니군요..

cpu 가 잠시 딴짓하고 오건 말건 측정시간은 실제 수행시간보다

길어질수는 있지만 짧아질수는 없는것이니까요..

그렇타면 남은 문제는 n 이네요..

n의 자료형이 char 인지 모르겠습니다만..

n 의 단위가 무었인지 다시한번 확인해보세요..

bit, byte, kb

익명 사용자의 이미지

통신에서의 전송시간은 latency로 보통 측정합니다.
보내는 측만 보지 않고, 로컬송신+원격지수신+원격지처리/연산+원격지송신+로컬수신으로 말입니다.

* iperf 가 좋은 참고자료 같습니다.
http://dast.nlanr.net/Projects/Iperf/
아울러, 관련링크를 잘~ 따라다니면, 좋은 정보 많이 얻으실것 같습니다.

ssehoony의 이미지

질문자님의 오차는 소켓의 send 버퍼에 의해 생기는 오차입니다.

write 함수를 실행하고 빠져나오는 시간은 실제 데이터가 사용자에게 전달 됐을 때가 아니고 소켓의 송신 버퍼에 송신할려는 데이터가 복사가 완료되면 함수를 빠져 나오기 때문에 그렇습니다.
실제 데이터는 그 이후에 커널에서 백그라운드로 알아서 보내줍니다.
그래서 원질문자님의 방식(소켓은 당연히 블럭모드겠죠?)으로 하면 소켓의 send 버퍼 사이즈를 많이 상회하는 자료량을 송신하면 거의 송신속도 근사치로 값을 알아낼 수 있습니다. - 소켓 버퍼 사이즈를 디폴트로 놓고 1Mb 정도를 한번에 송신해 보세요.

위와 같은 이유로 일반적인 ftp client 프로그램에서 파일은 송신한후 송신속도를 보면 1K 정도의 작은 파일들은 실제 회선 대역폭보다 크게 상회하는 값이 나오는데 위와 같은 이유에서 입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.