LoginSignup
33
29

More than 5 years have passed since last update.

Dockerコンテナ内のnet.core.somaxconnをいじる方法

Last updated at Posted at 2015-09-09

結論

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 もいじっています

/entrypoint.sh
#!/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

あとがき

こういうこと、やってくれる人、マジ募集

33
29
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
29