짧은시간마다 UDP Data를 전송하는 방법. (nanosleep, usleep..)

thisnome의 이미지

기존에 제작한 서버의 부하 테스트를 위한 패킷 제너레이터를 만들어보고 있습니다.

서버가 UDP Data를 취급하므로.. UDP 소켓을 열고, 500 bytes 정도의 데이터를 짧은 시간마다 몇천~몇만개정도 보내어, 어느정도를 처리하고 응답을 보내주는지를 알기위해 작업하는중에..

UDP Send 부분을 다음과 같이 해놨는데..

for(.. ; .. ; ..)
{
    sendto(fd, snd_buf, snd_buf_len, 0, ..., ...);
    usleep(1);
}

usleep(0)으로 하더라도 실제 usleep()에서 걸리는 시간이 (앞뒤로 gettimeofday() 로 체크하여 뺀시간) 10ms 이하로는 안 내려가네요..
nanosleep 도 마찬가지입니다.

시스템 사양이 펜3 1G 듀얼인데..
이정도가 정상인가요?

그렇다고 usleep을 빼자니, 거의 10 us (마이크로 세크) 정도로 전송이 되서 대부분의 UDP Data가 유실되어버리고.. 10ms 로 보내면 멀쩡하게 버티니.. 그 사이의 간격으로 send 할 수 있는 방법이 있을까요..?

eungkyu의 이미지

한 타임에 여러개 보내면 안될까요?

byteme의 이미지

그런 용도로는 linux kernel 2.6대에 포함되어 있는 Packet Generator가 딱입니다.
자세한건 Documentation/networking/pktgen.txt 를 참고하세요.

thisnome의 이미지

eungkyu wrote:
한 타임에 여러개 보내면 안될까요?

말씀하신대로 for loop 안에 두번 이상의 sendto를 실행시키게끔 하면 가능하겠네요..
근데 일반적으로 이런상황에서는 그렇게 처리하나요? :)

그리고, 더 작은 인터벌을 갖는 방법은 없다고 봐야 하는건가요?

eungkyu의 이미지

thisnome wrote:
eungkyu wrote:
한 타임에 여러개 보내면 안될까요?

말씀하신대로 for loop 안에 두번 이상의 sendto를 실행시키게끔 하면 가능하겠네요..
근데 일반적으로 이런상황에서는 그렇게 처리하나요? :)

그리고, 더 작은 인터벌을 갖는 방법은 없다고 봐야 하는건가요?

일단 nanosleep 함수만 가지고는 더 작은 인터벌을 갖기는 어려울 것입니다. 다만 다른 방법을 커널 내에서 제공한다면 가능할 것도 같은데 byteme님이 말하신 것에 그러한 것을 포함할 수도 있겠네요. 아니면 커널 2.6에 뭔가 정교한 타이머가 들어갔다고 하는데, 그걸 살펴보면 될 수도 있고...

모두 정확한 정보는 아닙니다 ^^;;

datamind의 이미지

적당한 delay 함수를 만드세요..

void delay(unsigned long ss)
{
    while( ss-- );
}
eungkyu의 이미지

datamind wrote:
적당한 delay 함수를 만드세요..

void delay(unsigned long ss)
{
    while( ss-- );
}

이런거 안쓰는 방법을 찾고 있었던거 아니었나요? :shock:

leilei의 이미지

어떤 평션을 사용하던 타임 레졸루션이 그렇게 높지 않다고 알고 있습니다만..
어디 다른 곳에서 읽었던거 같은데.. 찾자니 귀차니즘이 발동을 :oops:

어느 정도로 내려가다 보면 정확한 측정이나 정확한 sleep이
어렵지 않나요?

msec 이하 단위보단 충분히 큰 단위에서
처리되는 패킷양을 측정하셔서 계산을 해 보심이 더 좋을 것 같습니다..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.