소켓 통신에서 데이터 전송 속도가 상당히 느립니다.
클라이언트와의 소켓 통신에서 양이 많은 데이터의 전송 속도가 상당히 느립니다.
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));
이 부분은 어떤 목적으로 잡으셨나요?
}}}
Re:
클라이언트에서 ack 보내는 과정을 없애고 속도를 측정해 보세요.
댓글 달기