docker コンテナで Too many open files が発生する

Eclipse Che

Eclipse Che の正式公開版をDockerコンテナで動作させようとして too many open files 状態に。。。とりあえず問題解決した手順を記す。

はじめに

「ショーンKってだれ?」な今日この頃 ( 最初 "ケインK(コスギ)" かと思った )、皆様いかがお過ごしですか?

ここ数日 クラウド IDE Eclipse Che を使ってみる という記事のアクセスが急増したのですが、Eclipse.org で正式公開されたらしく、これに関する記事が一部で書かれたりした事によるもののようです。

参考 : Eclipse Che Release: New IDE Platform Reimagines the Developer Workspace

という事で、

久々にコンテナを pull してみるか

と思って、最新版を docker pull して使ってみようとしたのですが、以前と同じ手順では動作しない状況に...

とりあえず、動作する状況 ( 実用レベルではない ) まで持っていったので記録を残しておきます。

事象

今回発生した事象に関して先ず書きます。

Eclipse Che が起動しなくなった

上述の通り正式公開された Eclipse Che を利用するべく最新を pull しました。

# docker pull codenvy/che

次に以前書いた手順で Eclipse Che を起動。

  1. docker container (codenvy/che) を run
    # ./run-docker.sh -a 192.168.1.77/24 codenvy/che che
    
  2. 起動したコンテナにアタッチ
    # docker attach che
    
  3. Eclipse Che の起動
    user@che:~/che/bin$ ./che.sh start
    

が起動しません。

ログの確認

Eclipse Che は tomcat 上で動作しているので tomcat log を確認します。

$ cd /home/user/che/tomcat/logs
$ view catalina.out

以下のように Too many open files でエラーが発生していました。

...
java.io.FileNotFoundException: /home/user/che/tomcat/work/Catalina/localhost/ide/org/apache/jsp/IDE_jsp.class (Too many open files)
...

docker コンテナ上で open files を確認します。

$ ulimit -n
1024

Linux のデフォルト設定が引き継がれているようです。docker ホスト上で確認した値も1024 でした。

Too many open files の解決手順

Too many open files が発生しないように open files 数を変更します。
 

試しにコンテナ上で ulimit -n で設定変更しようとすると以下のように怒られます。

$ ulimit -n 10000
bash: ulimit: open files: cannot modify limit: Operation not permitted

docker コンテナの open files を設定する場合、docker ホストで設定する必要があります。

/etc/security/limits.conf で設定するという方法

ファイルオープン数の上限を変更する場合、/etc/security/limits.conf で値を設定するという記事が見つかりますが、この方法だと問題があります。

※ここで値を設定した場合はアカウント毎の設定が変更される。

ここで設定を行った場合 pam ( 認証モジュール ) を通った場合にのみ設定が行われるため、自動起動されるサービスの場合、設定した値が有効になりません。

※docker は自動起動させずに必ずログインして手動で起動するというのであれば、/etc/security/limits.conf で設定でも構わないと思う

dockerの起動スクリプトで設定する

上記理由によりファイルオープン数の上限を変更するために、以下のようにします。

dockerの起動スクリプトを編集します

# vi /etc/init.d/docker

起動スクリプトの頭に ulimit -n xxxxx (xxxxx は設定する値) を追記します。

...
# Description: Daemon for docker.com
### END INIT INFO

ulimit -n 1000000

# Source function library.
...

上記変更を行ったら docker を再起動してdockerコンテナ上で設定が反映されるか確認してみましょう。指定した値で設定される事が確認できるはずです。( 手順は省略 )

# /etc/rc.d/init.d/docker restart

※起動スクリプト実行時に "ulimit: open files: cannot modify limit: 許可されていない操作です" というメッセージが出力される場合、設定不可の値を指定していると思われるので値を調整しましょう。

上記変更を行った後、Eclipse Che を再度起動したところ問題のエラーは発生せず tomcat が起動するところまで確認できました。

別の問題が発生した

とりあえず起動するところまでは漕ぎ着けたのですが、以前と比べてかなりリソース食いになっているようで、利用している dockerホスト ( VT非対応の昔のPC上に構築してある ) ではまともに動作しない状態に陥ってしまいました。

Too many open files に関しては以下で議論されていて

解決した風な感じで書いてあったりもするんですが、私の環境では Too many open files in system エラーが発生してしまいました。

Too many open files in system を解決する

上述したように Eclipse Che は起動したように見えたにも関わらず、別のエラーが発生するようになりました。ls 叩いただけで以下のような感じに

$ ls -la
bash: start_pipeline: pgrp pipe: Too many open files in system

とりあえず、以下手順で解決

システムのファイルオープン数上限を変更

ulimit でアカウント毎のファイルオープン数は設定しましたが、システム全体の設定に関しては確認していなかったのでこれを確認/設定しました。

システム全体のファイルオープン数は /etc/sysctl.conf で設定します。

  1. /etc/sysctl.conf を編集します。
    # vi /etc/sysctl.conf
    

    以下を追記します。

    fs.file-max=1000000
    
  2. 設定を反映します。
    # sysctl -p
    net.ipv4.ip_forward = 1
    net.ipv4.conf.default.rp_filter = 1
    net.ipv4.conf.default.accept_source_route = 0
    kernel.sysrq = 0
    kernel.core_uses_pid = 1
    net.ipv4.tcp_syncookies = 1
    net.bridge.bridge-nf-call-ip6tables = 0
    net.bridge.bridge-nf-call-iptables = 0
    net.bridge.bridge-nf-call-arptables = 0
    kernel.msgmnb = 65536
    kernel.msgmax = 65536
    kernel.shmmax = 68719476736
    kernel.shmall = 4294967296
    fs.file-max = 1000000
    

上記設定後、Eclipse Che を起動しなおして、ようやくエラーが発生しない形に

Eclipse Che 起動後、どの程度のファイルがオープンされたのか確認してみると

※/proc/sys/fs/file-nr を見る事でオープンした事のあるファイルの最大値, 現在値, 上限値を確認できる。

# cat /proc/sys/fs/file-nr
836736  0       1000000

836736

なんだこの数値...

設定変更前の値は桁が違っていた(数万)のでToo many open files in system がでるのも仕方ないとは思うのですが、にしても大きすぎないか?

Too many open files エラーは出なくなったようですが、私が使っていた環境では激重で使い物になりませんでした。

まとめ

最新の Eclipse Che を動かしてみようと始めた作業ですが、結局まともに動作する環境は作れていない状況です。
※これなら以前の記事でレビューした環境のが全然良かった。

Docker使わずに ネイティブなLinux環境で動作させれば違うのかもしれませんが、Eclipse Che 正式公開版はそこそこリソースに余裕のある環境でないと動作は難しいのかもしれません。

当初の目的 ( 最新のEclipse Che動作 ) は達成できてませんが、
「docker コンテナで too many open files が発生した場合の対応方法」
として使える記事にはなったのかも