Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
AWS에서 docker를 쓸 때 high traffic server라면 이렇게

AWS에서 docker를 쓸 때 high traffic server라면 이렇게 하는 것이 좋겠다. amazon linux를 쓴다고 하자.

ulimit

ulimit를 올려주어야 한다. /etc/security/limit.conf 에서 고쳐주어도 docker에는 적용되지 않는다. limit.conf는 PAM을 통해서 로그인했을 때만 먹는 설정이라 그렇다. docker로 띄운 process의 pid를 찾고 cat /proc/<pid>/limits를 실행해서 보면 적용되었는지 아닌지 확실하게 알 수 있다. kernel에서 직접 그 프로세스에 어떤 ulimit이 적용되었는지 확인하는 방법이다.

그래서 /etc/sysconfig/docker 파일을 만들고 아래를 추가한다.

ulimit -n $NEW_MAX_LIMIT

그리고 다시 cat /proc/<pid>/limits로 확인해본다.

kernel parameter

Brendan Gregg의 발표자료에서 나왔듯이 kernel parameter를 조정한다.

net.core.somaxconn=1000
net.ipv4.netdev_max_backlog=5000
net.core.rmem_max=16777216
net.core.wmem_max=16777216

net.ipv4.tcp_rmem=4096 12582912 16777216
net.ipv4.tcp_wmem=4096 12582912 16777216
net.ipv4.tcp_max_syn_backlog=8096
net.ipv4.tcp_slow_start_after_idle=0
net.ipv4.tcp_tw_reuse=1
net.ipv4.ip_local_port_range=10240 65535
net.ipv4.tcp_abort_on_overflow = 1

# tcp_recycle은 위험하다는 이야기도 조금 있으니 default값으로 두고 건드리지 말자. (SHOW ME SOURCE)

거기에는 안 나왔지만 이것도 추가해보자.

net.ipv4.tcp_fin_timeout=10
net.ipv4.tcp_early_retrans=1

nf_conntrack 에서 병목이 생기지 않게 잘 한다

amazon linux에서 제공하는 docker image를 쓰면 (여튼 docker를 쓰면) 어느 순간에 nf_conntrack 커널 모듈이 올라간다. 이 nf_conntrack에서 병목이 생기는 경험을 했다.

nf_conntrack에서 병목이 생긴건지는 cat /proc/sys/net/netfilter/nf_conntrack_count 해서 숫자가 전혀 올라가지 않는 순간에 서버의 응답이 완전히 멈추거나 dmesg에 nf_conntrack: table full, dropping packet 이런 메세지가 남는 현상으로 확진할 수 있다.

docker를 쓰면 (제가 아는 한... 잘 못 알고 있는 것이면 알려주세요.) NAT를 쓰게 되어 있고 NAT를 쓰겠다고 Linux Distro가 nf_nat를 올리는 순간 nf_conntrack도 추가되기 시작한다. 해서 nf_conntrack을 안 쓰기는 힘들다. 적어도 나는 모른다.

해서 nf_conntrack의 max값을 잘 올려주는 것이 방법일지 모른다. 직접 해보지는 못했지만 여기 나온대로 하는 것이 가장 가능성있어 보인다. http://serverfault.com/a/482485/156877

max 값을 조정하지 않고 sysctl에서 다른 값을 조정해 주는 것도 방법인데 여기에 나온 net.netfilter.nf_conntrack_tcp_timeout_* 값을 조정해주는 것을 직접 해보았고 우리 환경에서는 잘 동작했다.

한데 이 값들은 /etc/sysctl.conf 에 넣는다고 reboot 하고 docker가 뜨고 나서 적용되어 있는 것은 아니라서 /etc/sysctl.conf에 추가하고 /etc/rc.d/rc.local의 마지막에 sysctl -p를 넣어주었다. 좋은 방법은 아닌 듯 하니 Amazon Linux의 관례(?)를 알고 계신 분은 알려주세요. T.T

docker 내부에서 sysctl을 실행해서 모든 파라미터가 먹은 것인지 본다.

docker 내부에서 somaxconn이 안 먹어 있더라도 host system의 nf_conntrack 제한을 넘어가면 첫 번째 병목은 넘어간 것이다. 어떻게 먹게 하는건지는 잘 모른다. 일단 docker exec bash -c "sudo sysctl -p; ...." 로 할 수 있다. (확실치 않다.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.