結論
Docker 1.12 から --sysctl
オプションが指定できるようになり、本TIPS(もはやBK)はObsoluteです<8/18追記>
$ docker run -it --rm alpine sysctl net.core.somaxconn
net.core.somaxconn = 128
$ docker run -it --rm --sysctl net.core.somaxconn=65535 alpine sysctl net.core.somaxconn
net.core.somaxconn = 65535
--sysctl
は複数回指定可能です
$ docker run -it --rm --sysctl net.core.somaxconn=65535 \
--sysctl "net.ipv4.ip_local_port_range=10000 65000" alpine true
1.12以前の方は /proc
をマウントしてコンテナ内でいじってください
$ docker run --rm -it -v /proc:/wproc debian /bin/bash
root@9a1da1651135:/# echo 1024 > /wproc/sys/net/core/somaxconn
情報源
Refresh net.core.somaxcomm (or any sysctl property) for docker containers
解説
somaxconn
WEBサーバ等、大量コネクションを必要とするサーバ設定の定番チューニングは net.core.somaxconn
の調整です
somaxconnの概要は下記URLで見てください
Dockerコンテナ内のsomaxconnのデフォルト
一方、Dockerコンテナ内主要なimageのsomaxconnは128となっており、とても本番に投入できる状況ではありません
$ docker run --rm ubuntu sysctl net.core.somaxconn
net.core.somaxconn = 128
$ docker run --rm debian sysctl net.core.somaxconn
net.core.somaxconn = 128
Read-only file system
/proc/sys/net/core/somaxconn
に書き込もうとしても Read-only file system
とつれないメッセージが返り、書込みできません
$ docker run --rm -it debian /bin/bash
root@0dab1a51c6b2:/# echo 1024 > /proc/sys/net/core/somaxconn
bash: /proc/sys/net/core/somaxconn: Read-only file system
冒頭で紹介した方法は /proc
を volume でコンテナ内に渡して書き込めるようにする方法です
$ docker run --rm -it -v /proc:/wproc debian /bin/bash
root@9a1da1651135:/# sysctl net.core.somaxconn
net.core.somaxconn = 128
root@9a1da1651135:/# echo 1024 > /wproc/sys/net/core/somaxconn
root@9a1da1651135:/# sysctl net.core.somaxconn
net.core.somaxconn = 1024
これを行っても host 側の net.core.somaxconn が変更されることはなく、思い切って変更が出来ます
また、somaxconnに限らず、他のパラメータも調整できるようになりますので、sysctlをいじる必要が出てきたら、覚えておきたい方法です
Docker entrypoint
このような entrypoint.sh
を作って /wproc
が存在したら somaxconn
の調整を行うようにするのがよろしいでしょう
※ついでに ip_local_port_range
もいじっています
#!/bin/sh
PROCFS=${1:-"/wproc"}
if [ -d ${PROCFS} ]; then
echo -n "Tune of linux kernel params for "
echo 65535 > ${PROCFS}/sys/net/core/somaxconn
echo "1024 65535" > ${PROCFS}/sys/net/ipv4/ip_local_port_range
#net.unix.max_dgram_qlen = 10
;;
else
cat <<-EOT
WARN: Not found ${PROCFS} on this system
May be max concurrency is 100, due to somaxconn=128
please re-run "docker run -v /proc:/wproc"
EOT
fi
exec /usr/local/bin/supervisord -n -c /etc/supervisord/supervisord.conf
あとがき
こういうこと、やってくれる人、マジ募集