agetty CPU 専有問題(docker のバグ?)

この記事は1年以上前に書かれたものです。 情報が古い可能性があります。

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 のときしか出ないのかよくわからない。

コメント

タイトルとURLをコピーしました