할 수 있을 듯 하기 어려운 리눅스 커널 튜닝
결국... 커널의 설정값을 적합하게 설정해줘야 한다는 뜻이죠..!
서버 소켓 : 서버 IP + 포트
클라이언트 소켓 : 클라이언트 IP + 임의의 포트 범위에서 정한 포트
$ sysctl net.ipv4.tcp_synack_retries
net.ipv4.tcp_synack_retries = 5
8888번 포트를 사용하는 자바 어플리케이션이 사용하는 소켓의 backlog 최대크기
$ ss -nl | grep <port>
# cat /proc/net/softnet_stat
00153085 00000000 00000484 ...
00148546 00000000 00000466 ...
001126aa 00000000 00000354 ...
그렇다면 대체 뭘 살펴봐야 할까..?
$ sysctl net.ipv4.tcp_syncookies
그러면 Accept 큐에 대한 설정은...?
참고로, 제가 사용한 서버의 설정은 지금 tcp_max_syn_backlog와 somaxconn 값 모두 10240으로 설정되어 있는데, 실제로 위에서 ss 명령어로 확인했던 8888번 포트를 리스닝하는 소켓의 Send-Q사이즈는 100으로 제한되어 있습니다. 이는 Spring boot를 사용하는 경우에는 기본적으로 tomcat을 내장 웹서버로 사용하는데, tomcat에서는 acceptCount 변수를 통해서 어플리케이션이 사용할 소켓의 backlog 값을 지정하실 수 있습니다. Apache Tomcat의 acceptCount 기본값이 100입니다.
$ cat /proc/sys/fs/file-nr
864 0 65536
$ ulimit -n
또는
$ cat /etc/security/limit.conf
(/etc/security/limits.d/ 아래에 있는 conf 파일에 있을 수도 있습니다.)
자원을 늘려 놓았으니 쓸 놈도 늘려야겠죠?