Gremlinを使ってCPU負荷を注入する

記事タイトルとURLをコピーする

Gremlinというカオスエンジニアリングサービスを使ってみました。

Gremlinの概要

公式ドキュメントの説明

Turn failure into resilience. Gremlin provides you with the framework to safely, securely, and simply simulate real outages with an ever-growing library of attacks. Using Chaos Engineering to improve system resilience, Gremlin’s “Failure as a Service” makes it easy to find weaknesses in your system before they cause problems for your customers. We offer several categories of attacks to inject faults into your system:

Google翻訳

障害を回復力に変えます。 Gremlinは、増え続ける攻撃のライブラリを使用して、実際の停止を安全かつ安全に簡単にシミュレートするフレームワークを提供します。 Chaos Engineeringを使用してシステムの復元力を向上させるGremlinの「サービスとしての失敗」は、顧客に問題を引き起こす前にシステムの弱点を簡単に見つけることを可能にします。 システムに障害を注入するために、いくつかのカテゴリの攻撃を提供しています。

今回の構成

f:id:swx-watanabe:20210208105709p:plain

Gremlinのプラン

Gremlinには、FreeプランとProプランがあります。 Freeプランだと、対象ホスト数は5台まで、できる攻撃も3種類(Shutdown、CPU、Blackhole)と機能が限定されますが、今回はFreeプランで試してみました。

f:id:swx-watanabe:20210208105850j:plain

https://www.gremlin.com/pricing/

Gremlinのアカウントを準備

GremlinはSaaSサービスなので、アカウントを作成する必要があります。

メールアドレス、名前の登録

サインアップページにアクセスし、メールアドレス名前を入力します。

f:id:swx-watanabe:20210208105721j:plain

パスワード、Role、会社名、チーム名の設定

f:id:swx-watanabe:20210208105949j:plain

f:id:swx-watanabe:20210208110006j:plain

Gremlin管理画面

アカウント作成に成功すると、管理画面に遷移します。

f:id:swx-watanabe:20210208110027j:plain

Team ID、Secret Keyの確認

管理対象ホストでGremlinデーモンを起動する際にTeam IDとSecret Keyが必要になります。
Gremlinの管理画面で確認をしましょう。

まず、アカウント名のところをクリックします。

f:id:swx-watanabe:20210208110042j:plain

次にCompany Settingsをクリックします。

f:id:swx-watanabe:20210208110053j:plain

次にTeams > 作成したTeam名 > Configuration の順にクリックしていきます。

f:id:swx-watanabe:20210208110109j:plain

Team IDが確認できます。
Secret KeyはResetボタンをクリックして作成する必要があります。

ホストへGremlin Daemonのインストール

今回はEC2インスタンス(Amazon Linux 2)にGremlin Daemonをインストールしました。

参考にしたページ

iproute-tcのインストール

$ sudo yum install -y iproute-tc

Gremlinリポジトリのインストール

$ sudo curl https://rpm.gremlin.com/gremlin.repo -o /etc/yum.repos.d/gremlin.repo

Gremlin Daemonのインストール

$ sudo yum install -y gremlin gremlind

Gremlin Daemonの起動

ここでTeam IDとSecret Keyが必要になります。

$ sudo gremlin init
Please input your Team ID:
ダッシュボードで確認した自分のTeam IDを入力します。
Please input your Team Secret:
ダッシュボードで確認した自分のSecret Keyを入力します。
Metadata set for [ gremlin-client-version: 2.12.25 ]
Metadata set for [ os-type: Unknown ]
AWS metadata may be present
Metadata set for [ instance-id: i-0695731fe62dc9add ]
Metadata set for [ local-hostname: ip-10-200-10-27.ap-northeast-1.compute.internal ]
Metadata set for [ local-ip: 10.200.10.27 ]
Metadata set for [ public-hostname: ec2-13-231-133-222.ap-northeast-1.compute.amazonaws.com ]
Metadata set for [ public-ip: 13.231.133.222 ]
Metadata set for [ cloud: AWS ]
Metadata set for [ image-id: ami-0af1df87db7b650f4 ]
Metadata set for [ instance-type: t2.micro ]
Metadata set for [ region: ap-northeast-1 ]
Metadata set for [ zone: ap-northeast-1a ]
Azure metadata may be present
Using xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx for Team Id
Using 10.200.10.27 for Gremlin identifier

ホストの登録を確認

管理画面 > Clients を見ると、EC2インスタンスがClientsとして登録されているのがわかります。
なお、初期状態では2つのデモ用ホストも登録されていますが、初めてのAttackが完了すると、これらは自動的に削除されるようです。

f:id:swx-watanabe:20210208110225j:plain

Attackの作成

管理画面 > Attacks > New Attack をクリックします。

f:id:swx-watanabe:20210208110242j:plain

Choose Hosts target

攻撃対象にするEC2インスタンスを選択します。

f:id:swx-watanabe:20210208110258j:plain

Choose a Gremlin

どのような攻撃をするのか定義します。
Freeプランの場合は、鍵マークがある項目は選択できません。

今回は下記のように、「CPU:80%が300秒続く攻撃」を定義してみました。

  • Resource > CPU
  • Length(攻撃秒数): 300
  • CPU Capacity(CPU Coreあたりでアクティブにするパーセンテージ): 80%
  • Cores(いくつのCoreをターゲットにするか): 1

Coresは、数字だけでなく、「All Cores」 という指定も可能です。 ただ、今回の対象ホストは、t2.microでコアは1つだけなので、「1」でも「All Cores」でも結果は同じになるはずです。

f:id:swx-watanabe:20210208110320j:plain

Run the Attack

Attackのスケジューリングをします。
「Only Once」という、その場で1回だけ実行もありますが、今回は少し複雑なスケジュールを作成してみます。

  • 攻撃する曜日は、土曜日と日曜日
  • 1日あたりの攻撃回数は、20回
  • 攻撃する時間帯は、16時〜20時

f:id:swx-watanabe:20210208110344j:plain

Unleash Gremlin

Unleash Gremlinボタンを押すと、設定が確定されます。

f:id:swx-watanabe:20210208110412j:plain

Unleashは「解き放つ」という意味です。
Gremlinが解き放たれました!

Gremlinが暴れるのを観察

指定した時間帯のCloudWatchは、下記のようになりました。
CPU使用率がスパイクしているのがわかります。
t2.microなので、CPUクレジットがギリギリでした。

f:id:swx-watanabe:20210208110426j:plain

攻撃発生中にLinuxのtopコマンドを打ってみると、gremlinがCPU消費しているのがわかります。

$ top - 07:35:03 up  1:39,  0 users,  load average: 0.96, 0.29, 0.10
Tasks:  85 total,   1 running,  47 sleeping,   0 stopped,   0 zombie
%Cpu(s): 96.3 us,  0.7 sy,  0.0 ni,  3.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1006968 total,   485772 free,    86828 used,   434368 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   772604 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
  704 gremlin   20   0   26148   6928   6604 S 49.2  0.7   0:54.44 gremlin
  713 gremlin   20   0   26128   6988   6668 S 47.5  0.7   0:13.66 gremlin
    1 root      20   0  125488   5436   3984 S  0.0  0.5   0:01.46 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd
    4 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 kworker/0:0H
    6 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 mm_percpu_wq
    7 root      20   0       0      0      0 S  0.0  0.0   0:00.15 ksoftirqd/0
    8 root      20   0       0      0      0 I  0.0  0.0   0:00.22 rcu_sched

管理画面で実行ログが見れます。

f:id:swx-watanabe:20210208110440j:plain

感想

Gremlinの導入は、想像よりも簡単でした。
管理画面も使いやすく、完成度が高いように感じます。
今回のケースだと単純にCPU使用率でしたが、Proプランにすれば、ネットワークのLatency等いろいろできて良さげです。

渡辺 信秀(記事一覧)

2017年入社 / 地味な内容を丁寧に書きたい