(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Docker】pids-limitをかけたコンテナでプロセス数上限を超過させる

スポンサーリンク

はじめに

コンテナ内のプロセス数の上限を制限するdocker runのオプション--pids-limitを利用するハンズオンです。

--pids-limit int  Tune container pids limit (set -1 for unlimited)

個人利用では指定することはないと思いますが、本番システムのコンテナのプロセスを無限に作成することでホスト側に悪影響を与えてしまうので本番環境で利用する場合は誤作動を考慮して大きな値を指定しておくという利用方法はあります。

環境情報
  • Debian GNU/Linux 9
  • Docker Version:19.03.5

コンテナ内のプロセスを制限する

以下の文法で起動したコンテナで

# docker run -it --pids-limit 3 ubuntu /bin/bash

プロセス数を確認するpsコマンドを押下すると2つのプロセスが確認できます。

root@9f7bffcf2398:/# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
    9 pts/0    00:00:00 ps

ここでsleepを投入してプロセス数を増やして確認すると合計3つとなります。

root@9f7bffcf2398:/# sleep 60 &
[1] 11
root@9f7bffcf2398:/# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
   11 pts/0    00:00:00 sleep
   12 pts/0    00:00:00 ps

これをもう一度行うとプロセス数が上限を超えた4つになりpsコマンドが失敗します。

root@9f7bffcf2398:/# sleep 60 &
[2] 13
root@9f7bffcf2398:/# ps
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable

ちなみにユーザ名を変えても同じ機構が利用できました。

# docker run -it --user 8 --pids-limit 3 ubuntu /bin/bash
mail@a87400da0d44:/$ ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
    7 pts/0    00:00:00 ps
mail@a87400da0d44:/$ sleep 60 &
[1] 8
mail@a87400da0d44:/$ sleep 60 &
[2] 9
mail@a87400da0d44:/$ ps
bash: fork: retry: Resource temporarily unavailable
...
bash: fork: Resource temporarily unavailable

終わりに

プロセス数が上限に達するとforkシステムコールが失敗していることが分かります。
滅多に見ないエラーですが、コンテナ内で制限をかけているとたまに見かけるので覚えておくと役立ちます。

以上、ご参考になれば幸いです。