소켓 통신에서 데이터 전송 속도가 상당히 느립니다.

삽질토비의 이미지

클라이언트와의 소켓 통신에서 양이 많은 데이터의 전송 속도가 상당히 느립니다.
4096바이트씩 1024번 전송했을 때,
물론 서버에서 클라이언트로 4096바이트 보내고, 클라이언트에서는 서버로 ack를 보내는 것을 1024번 반복합니다.
이때 소요된 시간은 154초나 걸립니다.

송수신 버퍼를 클라이언트쪽도 서버 쪽도 64KB씩 늘려 놓았고, Nagle 알고리즘도 disable 시켰습니다.

속도를 향상 시킬 조언좀 부탁드립니다.
아래 코드는 소켓 서버 소스 입니다.

-- 아래 --
:
:

// TCP 서버 소켓 생성
sock_fd = socket(AF_INET, SOCK_STREAM, 0);

int bufSize = 64*1024;
int on = 1;

// 소켓의 송수신 버퍼 설정
setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, (char*)&bufSize, sizeof(bufSize));
setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, (char*)&bufSize, sizeof(bufSize));

// Nagle 알고리즘 disable
setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on));

// 서버 소켓 설정
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT);

// 서버 소켓 바인딩
bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr) );

// 서버 소켓 리스닝
listen(sock_fd,1);

signal(SIGCHLD, SIG_IGN);

client_len = sizeof(client_addr);

while(1){
client_socket_fd = accept(sock_fd, (struct sockaddr *)&client_addr, (socklen_t *)&client_len);
:
:
:
}

모지리의 이미지

제가 지금 테스트 해보진 않았지만 저 정도의 양이면 순식간에 처리 되어야 정상일겁니다. 소켓에서 데이터를 전송하는 루틴은 아무리 크게 보내도 한번에 MTU 크기 만큼만 전송이 됩니다. 한번에 4096 바이트를 전송하고자 하신다면 약 4번 정도에 나뉘어서 전송이 될겁니다. 정확히 얼마나 짤리는지는 전송시에 덤프를 떠서 보시면 헤더 부분에 몇번으로 나뉘어 지는지 나올겁니다.

제 생각에는 송수신 부분에서 한번 확인해보시면 어떨까 생각됩니다. 예를 들면 송수신 버퍼를 너무 커다랗게 잡아 놓고 그 버퍼가 다 들어 올때까지 기다리는지는 않는지 한번 확인해보면 좋을거 같습니다.

{{{

int bufSize = 64*1024; <--- 너무 크게 잡으시는거 같아요.

// 소켓의 송수신 버퍼 설정
setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, (char*)&bufSize, sizeof(bufSize));
setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, (char*)&bufSize, sizeof(bufSize));

// Nagle 알고리즘 disable
setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on));

이 부분은 어떤 목적으로 잡으셨나요?

}}}

kslee80의 이미지

클라이언트에서 ack 보내는 과정을 없애고 속도를 측정해 보세요.

댓글 달기

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