네트워크 연결 최대 개수
[출처] : http://techpad.tistory.com/62
하나의 서버가 얼마나 많은 연결을 제한하고 있는지 궁금하시나요? 이 글을 통해 그 답을 얻을 수 있기를 바랍니다.
listen (sockfd, backlog)
흔히 소켓(Socket) 을 이용한 서버 프로그램은 listen(sockfd, backlog) 함수를 이용하여 클라이언트의 접속을 기다리고 있게 됩니다. 첫 번째 파라미터인 sockfd 는 파일의 최대 개수와 관련이 있고, 두 번째 파라미터인 backlog 는 연결되지 않은 요청을 큐에 넣을 수 있는 최대 큐의 길이와 관련하고 있습니다. 큐가 가득찼다면ECONNREFUSED 에러를 발생합니다.
SOCKFD
sockfd 는 ulimit -a 명령어로 확인할 수 있습니다.
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
BACKLOG
backlog 의 최대값은 <sys/socket.h> 에 정의된 SOMAXCONN 을 참조합니다. 아래와 같이 sysctl 명령어를 이용하면 값을 확인하고 원하는 개수로 수정할 수 있습니다. 참고로 SOMAXCONN 은 socket max connection 의 약어입니다. 아래는 각 운영체제 별로 SOMAXCONN 값을 확인할 수 있는 방법입니다.
OS | Command to specify the backlog | Notes |
AIX | /usr/sbin/no -o somaxconn=1024 | Default=1024 |
Solaris | /usr/sbin/ndd -set /dev/tcp tcp_conn_req_max_q 1024 | Default=128 |
Windows | HKLM \System \CurrentControlSet \Services \NetBt \Parameters MaxConnBacklog (REG_DWORD) | Default=1000 |
Linux Kernel 2.2 | # SOMAXCONN 값 확인하기 /sbin/sysctl -a | grep soma # SOMAXCONN 값 변경하기 /sbin/sysctl -w net.core.somaxconn = 2048 | 메모리가 128MB 보다 작을 경우 128일 기본이고 클 경우 1024가 기본이다. |
참고로 SOMAXCONN은 listen 큐를 크게 하는 것은 조금 더 많은 RAM 의 비용을 지불하게 만드는 DoS 공격을 피하기위해 보다 좋은 작업이라고 합니다.
참고)
Network Tuning and Performance Guide
https://calomel.org/network_performance.html
Linux: Increasing the number of open file descriptors
https://cs.uwaterloo.ca/~brecht/servers/openfiles.html