fork爆弾爆発中のロードアベレージを見る ※fork爆弾を安易に実行する行為を推奨するものではありません。実行したことによる責任は誰も取りません
FORK爆弾爆発中のロードアベレージを⾒る@第30回シェル芸勉強会 ⼤阪サテライト (2017/08/26)1 msr-i386 / slide_20170826_cgroup
View Slide
⽬次前回の復習、今回の⽬標fork爆弾爆発中のロードアベレージの取り⽅を考えるデモまとめ2 msr-i386 / slide_20170826_cgroup
⾃⼰紹介ハンドルネーム: MSRWebブラウザ の作者Twitter ID: @msr386Tungsten3 msr-i386 / slide_20170826_cgroup
前回の復習fork爆弾実⾏時のロードアベレージ取得に成功した※SysRqキーでカーネルパニックを起こし、クラッシュダンプを解析⾼ロードアベレージを記録するには1時間回せば⼗分24時間回しただけ無駄だった4 msr-i386 / slide_20170826_cgroup
今回の⽬標fork爆弾爆発中のロードアベレージをリアルタイムで⾒たい5 msr-i386 / slide_20170826_cgroup
ロードアベレージを⾒る⽅法uptime / wtopカーネルダンプの解析6 msr-i386 / slide_20170826_cgroup
UPTIME実⾏時点の稼働時間、ロードアベレージを表⽰Wuptimeの結果+ログインユーザー⼀覧を表⽰7 msr-i386 / slide_20170826_cgroup
TOPロードアベレージだけでなくプロセス⼀覧、CPU使⽤率、メモリ使⽤率を⼀定間隔で更新して表⽰⼀⾔で⾔えば「多機能だが重い」カーネルダンプの解析ダンプした時点のuptime情報も同時に記録されている何度もダンプできないので、リアルタイム計測は不可能8 msr-i386 / slide_20170826_cgroup
FORK爆弾実⾏中にリアルタイムでロードアベレージを⾒る⼤きな壁CPU / メモリ リソースはfork爆弾によるプロセス⽣成ですぐに枯渇するからプロセスの起動もままならないのでuptimeやwは使⽤不能topでも割り当てられるCPUリソースがなくなるので応答停⽌9 msr-i386 / slide_20170826_cgroup
⼤きな壁を越える⼿段:CGROUP10 msr-i386 / slide_20170826_cgroup
CGROUPLinuxカーネルに搭載されている強⼒なリソース制御機能※CPUリソースは、優先度設定で使われるnice値とは⽐べものにならないほど強⼒Linuxカーネル 2.6.24から標準搭載リソース制限の対象: CPU、メモリ、ディスクI/O、ネットワーク・・・コンテナ仮想化で重要な機能11 msr-i386 / slide_20170826_cgroup
できることの⼀例特定のユーザーのリソースの制限特定ユーザーの特定プロセスに対するリソースの制限→fork爆弾が発⽣しても制限が可能になる12 msr-i386 / slide_20170826_cgroup
CGROUP設定⽅針fork爆弾でCPUリソースを埋め尽くさないよう、1コアだけ使⽤しないようにする※CPU使⽤率で制御するより単純︕fork爆弾でメモリを埋め尽くさないよう、メモリ上限を設定する13 msr-i386 / slide_20170826_cgroup
デモ環境CPU: 4コア (VM)メモリ: 16GBOS: CentOS 714 msr-i386 / slide_20170826_cgroup
インストール※⾃動起動を有効にする場合は以下を実⾏# yum install libcgroup# yum install libcgroup-tools# systemctl enable cgconfig# systemctl enable cgred15 msr-i386 / slide_20170826_cgroup
設定例/etc/cgconfig.conf/etc/cgrules.confgroup forkbomb {cpuset {# 使⽤するCPUコアの指定cpuset.cpus = "0-2";# 使⽤するメモリノードの指定(NUMAでなければ0でよい。必須)cpuset.mems = "0";}memory {# 上限1GBmemory.limit_in_bytes = 1073741824;}}root:bash cpuset,memory /forkbomb16 msr-i386 / slide_20170826_cgroup
設定の反映対象プロセスの確認# systemctl restart cgconfig# systemctl restart cgred$ cat /sys/fs/cgroup/cpuset/forkbomb/tasks17 msr-i386 / slide_20170826_cgroup
<デモンストレーション>18 msr-i386 / slide_20170826_cgroup
設定上の注意cgconfig.confによる設定はCentOS7では⾮推奨とされているfork爆弾実⾏時のシェルと、ログインで使⽤するシェルは別にしなければならないメモリ制限に引っかかりcgroupがシェルを強制終了させるから(デモではcgroup制御対象はbash、ログインシェルはzsh)19 msr-i386 / slide_20170826_cgroup
まとめCPUやメモリを⾷い尽くすfork爆弾の制御はcgroupで!20 msr-i386 / slide_20170826_cgroup
参考「Red Hat Enterprise Linux 7 リソース管理ガイド」「cgroupsを利⽤したリソースコントロール⼊⾨ — | サイhttps://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/pdf/Resource_Mana7-Resource_Management_Guide-ja-JP.pdfhttps://oss.sios.com/yorozu-blog/cgroups-2015070821 msr-i386 / slide_20170826_cgroup