Dockerを利用していていると稀に遭遇する問題を書き起こしてみました。
正直何が原因で何をすれば改善出来るのかはっきりとわかっておりません。
自分の備忘録的な意味合いが強い記事ですがもしかしたら現在進行形で困ってる方のヒントになれば幸いです:)
事象
- Dockerコンテナを複数台連続で立ち上げ
- ホスト機でTOPを確認するとagettyがCPU使用率100%で張り付く
top - 14:07:38 up 4 days, 22:31, 1 user, load average: 5.69, 2.38, 2.94
Tasks: 208 total, 4 running, 204 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 0.0 id, 98.9 wa, 0.0 hi, 0.9 si, 0.0 st
KiB Mem : 8011232 total, 5015324 free, 559104 used, 2436804 buff/cache
KiB Swap: 2113532 total, 2113512 free, 20 used. 7119736 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8296 root 0 0 0 0 0 R 100.0 0.0 23:03.09 agetty/tty
3 root 20 0 0 0 0 R 71.4 0.0 23:03.09 ksoftirqd/0
340 root 0 -20 0 0 0 S 19.9 0.0 5:00.85 kworker/0:1H
場合によっては複数agettyプロセスが張り付くこともあります。
- ホスト機の動作が全体的にスローダウン
agettyとは何者か?
agetty は tty ポートをオープンし、ログイン名を求めるプロンプトを出し、 /bin/login コマンドを起動する。通常 agetty は init(8) から 起動される。
agetty はいくつか非標準な機能を持っており、直結ラインやダイアルインの ラインに便利になっている。
参考:https://linuxjm.osdn.jp/html/util-linux/man8/agetty.8.html
要するにログインプロンプトだと理解している。
問題が発生した環境
OS | CentOS7.2 |
---|---|
Kernel | 3.10.0 |
Docker | 1.8.2 |
Container | CentOS7.2 |
コンテナ起動プロセス | /sbin/init |
問題が起こり得る状況
私の環境では以下の状況で起こりやすいです。
- コンテナを連続で作成した時
- コンテナを連続で起動した時
- サーバが別の負荷が発生している時
サーバが忙しい状態やコンテナ起動の処理が終わってないウチに別コンテナを起動するとなるようです。
原因は?
完全に予想ではあるが、コンテナ立ち上げ時にコンテナに対してagettyのログインプロンプトが割り当てられる。
割り当てが完了し、排他制御が出来るまでに次のコンテナが立ち上がるとagettyが重複して割り当てらる事によってプロセスが暴走している(ように見える)。
対処法
- gettyサービスを停止する
systemctlのリストをgettyで検索し、出てきたgettyプロセスを停止することでagettyが暴走するのを防ぎます。
(コンテナは正常に上がるがその他の影響については未調査)
systemctl list-units *getty*
systemctl stop getty@tty1.service
systemctl stop system-getty.slice
systemctl stop getty.target
- 暴走したagettyプロセスをkillする
TOPコマンドで暴走しているagettyプロセスIDを検出し、そのプロセスをKillする方法。
killしてもコンテナは稼働しています。
kill [agetty プロセスID]