docker のホストにしているマシンのリソースモニタ見てたら 100% に張り付いたままのコアがあったので原因を探ることに。
環境
ホストマシン: Ubuntu 16.04 LTS
docker: version 17.05.0-ce
コンテナ: 6 個くらい
まずは top コマンドで見てみた。
top - 03:44:10 up 8 days, 28 min, 2 users, load average: 2.22, 2.12, 2.07 Tasks: 292 total, 4 running, 288 sleeping, 0 stopped, 0 zombie %Cpu(s): 14.2 us, 36.6 sy, 0.0 ni, 48.4 id, 0.8 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 3742680 total, 385980 free, 1543540 used, 1813160 buff/cache KiB Swap: 3883004 total, 3699612 free, 183392 used. 1817712 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4138 root 20 0 16956 1800 1656 R 99.7 0.0 5820:16 agetty 31244 root 20 0 9860 1760 1640 R 99.7 0.0 5819:36 agetty 1132 root 20 0 389036 55372 43940 S 1.3 1.5 63:55.92 Xorg 6647 alice 20 0 1542664 236920 72232 S 1.0 6.3 137:04.41 compiz 6902 alice 20 0 643120 76012 38644 R 1.0 2.0 50:28.59 gnome-syst+ 1442 root 20 0 859300 53164 27416 S 0.3 1.4 12:15.67 dockerd
agetty というのが2つも何かやってるらしい。
agetty ってなに?
https://manpages.debian.org/jessie/manpages-ja/agetty.8.ja.htmlによると以下のようなものらしい。
agetty は tty ポートをオープンし、ログイン名を求めるプロンプトを出し、 /bin/login コマンドを起動する。通常 agetty は init(8) から 起動される。
いまいち何で使われてるのかわからないんだけど、ログインのプロンプトのよう(な気がする)。
それがログイン後にそれも複数動いてるのはやっぱりおかしいはず。
たぶん Docker 周りだろうと思ってググるとすぐにヒット!
http://blog.nekonekonekko.net/?p=374
によると、
ホストサーバからtopコマンドで確認したら、agettyのCPU使用率が異様に高くなっていた。
調べるとdockerのバグ?の模様。Bug 1046469 – docker privileged mode with cmd /sbin/init – agetty & high cpu
docker runで–privileged, /sbin/initしてると発生するみたい。
解決方法としては、対象のコンテナにログインして、
agetty.targetとsystemd-udevd.serviceを停止,自動起動無効にする。
これで暴走しなくなった。
とあり、docker のバグの模様。
親切に直し方も書いてくれててたいへん助かるのだが、問題のコンテナがどれかわからない(笑)
なにせ Centos7 のコンテナはほとんどすべて –privilleged, /sbin/init してるもんだから(^_^;)
あとはねこむねこさんのページ通りにコンテナに入り、サービスを停止すれば OK。
# systemctl stop agetty.target # systemctl disable agetty.target # systemctl stop systemd-udevd.service # systemctl disable systemd-udevd.service
ちなみにもとのレポートではコンテナ内では使わないので、agetty.target と systemd-udevd.service を消してもいいとなっている。
rm -f /lib/systemd/system/systemd*udev*; rm -f /lib/systemd/system/getty.target;
なんで udev を止めるのか不明。udev は何もしていないサイトもあるので要検証。
あと、ホスト側からプロセスを Kill してコンテナ再起動したら、また出てくると思ったけど再現されなかった。
再現されたら、udev から止めているのか試してみようと思ったけど断念。
時間がたったら再び出てくるのか、docker run のときしか出ないのかよくわからない。
コメント