개요

리눅스를 설치하면 범용 용도로 기본 설정이 되어 있으므로 웹 서버등 네트워크 서버로 사용하려면 커널 파라미터 튜닝이 필요합니다.

리눅스 커널 튜닝은 네트워크와 시스템에 대한 고급 지식을 필요로 하고 여러 가지 파라미터를 직접 적용해 보면서 확인해야 합니다.


저도 네트워크 전문가가 아닌지라 이해가 부족한 상태에서 그동안 다양한 채널에서 수집한 정보를 기반으로 커널을 설정해서 사용해 왔는데 조금 더 이해를 높이고 잘 활용하고자 복기 차원에서 다시 정리해 봅니다.


리눅스 커널 설정은 /etc/sysctl.conf 에서 항목별로 할수 있으며 변경한 설정은 커널 파라미터를 설정하는 명령어에 sysctl 에 -p 옵션을 주고 실행하면 반영할 수 있습니다.

-p 옵션은 커널 파라미터 설정 파일의 경로를 받으며 생략할 경우 /etc/sysctl.conf 를 사용합니다.


즉 아래 2 명령은 동일한 기능을 수행합니다

$ sysctl -p
$ sysctl -p /etc/sysctl.conf 


현재 커널 파라미터 설정을 확인하려면 출력 옵션인 -a 를 주어서 확인할 수 있습니다.


예로 최대 오픈 파일을 확인하려면 다음 명령어를 실행하면 됩니다.

$ sysctl -a | grep file-max


또는 커널의 proc file system 을 통해서 알수 있으며 "필드.세부설정" 에서 . 을 / 로 바꾸고 /proc/sys 에서 찾아보면 됩니다. 예로 fs.file-max 필드 설정은 /proc/sys/fs/file-max  을 조회하면 됩니다.

cat /proc/sys/fs/file-max


많은 연결을 처리하기 위한 network 설정

somaxconn


client 의 연결 요청은 accept() 를 호출하기 전에 queue 에 쌓이게 됩니다. queue 가 작으면 client 의 연결 요청이 drop 될 수 있으므로 다음 항목을 크게 설정해 주어야 합니다.


net.core.somaxconn = 65535


기본 설정값은 128 입니다.

$ cat /proc/sys/net/core/somaxconn 

128


tcp_max_syn_backlog

TCP 의 three way hand shaking 시 서버가 SYN 을 받으면 상태를 SYN_RECV 로 변경하며 queue 에 저장합니다.  tcp_max_syn_backlog 는 이 패킷을 쌓아두는 queue 의 크기로 너무 작으면 Syn flooding 공격등에 취약할 수 있고 동시에 client 가 연결을 시도할 경우 문제가 될수 있으므로 키워줍니다.

net.ipv4.tcp_max_syn_backlog = 30000


tcp_syncookies

Syn cookies 가 설정되어 있으면 동일 client 에서 새로운 SYN 패킷을 받아도 syn backlog 큐에 쌓지 않습니다.

net.ipv4.tcp_syncookies = 1


netdev_max_backlog

NIC(Network Interface Card) 에서 패킷이 들어오면 커널은 처리하기 전에 ring buffer 라는 큐에 쌓아 놓습니다. 이 값이 작을 경우 패킷이 dorp 될수 있으므로 적당한 값으로 키워줍니다.

net.core.netdev_max_backlog = 5000


max open file

모든 네트워크 소켓도 파일이므로 연결이 많을 경우 file descriptor 가 부족해서 오류가 날 수 있습니다. 현재 값은 아래 설정을 통해 알 수 있습니다.

cat /proc/sys/fs/file-max


설정을 바꾸려면 sysctl 에 file-max 항목을 설정해 주면 됩니다.

fs.file-max = 100000
$ sysctl -p


추가로 사용자별로 hard 와 soft limit 를 수정해야 하니 리눅스 최대 열수 있는 파일 갯수 수정하기(Linux increase the max open files per user) 를 참고하세요.


같이 보기

Ref




blog comments powered by Disqus