GremlinでLinuxのCPUに簡単に負荷をかけてみよう

#はじめに
今、カオスエンジニアリングについてキャッチアップしていて、そのメモの一部です。まずはわかりやすい`インフラ(Linux)`からです。

>カオスエンジニアリングとは実際に稼働している本番システムの一部に模擬障害を発生させて、自動復旧させる強いシステムを作り上げていく、障害発生に備える運用技術の手法です。

負荷試験でLinuxでCPUに負荷をかける場合は、 Linuxのターミナルで ` yes ` コマンドを使って、そして１回の実行では負荷が足りないので、` yes `コマンドを連打しますよね。

```console
yes > /dev/null &
yes > /dev/null &
・
・・
・・・
yes > /dev/null &
```

この投稿は、 ` yes ` コマンドの代わりにカオスエンジニアリングツールのGremlinを使ってLinuxのCPUに負荷をかけてみたという話になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/3d5b3f89-f592-b2be-7068-f570f23f26f2.png)

そして、負荷をかけた時の確認をこの投稿では ` htop `で確認します。

# 前提
以下の２つを準備

- Gremlinのアカウント
- Ubuntuの環境
- カオスエンジニアリングの簡単な理解   
  →以下のSpeakerDeckの「2.カオスエンジニアリング超入門」がわかりやすいと思います。    
https://speakerdeck.com/katahiro12345/2-dot-kasuenziniaringuchao-ru-men

# Gremlinのアカウントの作成

1. Gremlinのホームページにて、Free版でアカウントを作成 
   URL :  https://www.gremlin.com/

2. Gremlinに作成したアカウントでログイン

3. Team IDと Secret Keyの取得
この後、UbuntuにGremlinのDaemonをインストールする際に使用します。画像の①、②、③の順番にクリックして `Team ID` と `Secret Key`をコピーして保存しておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/56d3cc1a-bc17-053b-3b68-30e4bef967c4.png)

# Gremlin クライアントとデーモンのインストール

(参考) Ubuntu上にインストール
https://www.gremlin.com/community/tutorials/how-to-install-and-use-gremlin-on-ubuntu-18-04/

##手順

1 Gremlin リポジトリの追加   

```console
echo "deb https://deb.gremlin.com/ release non-free" | sudo tee /etc/apt/sources.list.d/gremlin.list
```

2 GPG keyのインポート   

```console
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 
```

3 Gremlinクライアントとデーモンのインストール   
 
```console
$ sudo apt-get update && sudo apt-get install -y gremlin gremlind
```

4 Gremlinの初期設定
`gremlin init`コマンドを実行して色設定を行います。
`Team ID` と `Team Secret`は Gremlinのアカウント作成した際にメモをとった`Team ID` と `Team Secret`の値を入力します。

```console
$ gremlin init
Metadata set for [ gremlin-client-version: 2.22.0 ]
Metadata set for [ os-type: Linux ]
Metadata set for [ os-name: Ubuntu ]
Metadata set for [ local-ip: IPアドレスが自動表示 ]
Metadata set for [ local-hostname: ホスト名が自動表示 ]
Please input your Team ID: "<チームIDを入力>
Please input your Team Secret: "<シークレットキーを入力>"
```

これで、Ubuntuに Gremlinのエージェントとデーモンのインストールが終了しました。

次は、Gremlinのポータル画面から、実際に　Ubuntuに対して、CPUの負荷をかけて攻撃してみましょう。

# Gremlinを使って UbuntuにCPUの負荷をかける実験をやってみる

1. Ubuntuの負荷の状況を確認   
まず、下図は、実験をする前のUbuntuで `htop`コマンドを実行すると、下図の上部の 1から16までは、全て 0.0%で　無風の状態であることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/5577afa8-f702-010f-603e-1be69c4bbf6f.png)

1. 下図の`Create Attack`ボタンをクリックして、攻撃を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/609323fd-a755-fa17-c1f4-3bf31c768505.png)

1. まず、攻撃対象を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/be90558d-0c0b-78e1-ef5a-9ed7957cfc69.png)
上図の`What do you want to target` で ①`Infrastrucre`、②`Hosts`を選択しホストの中から攻撃対象を選べるようにします。
次に、`Choose Hosts to target`をクリックし、今回は③`local-host`でホスト名で対象を選択しました。

1. 攻撃の種類を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/71262586-143e-1857-c09a-7f17e04d5563.png)
上図のCategoryの中から今回は①`Resource`と Atacksからは②`CPU`を選択しました。

1. 次にCPUで攻撃するための期間やコア数などの詳細を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/87c0728e-fbb7-2202-5e3b-0d202eca3b5e.png)  
ここでは上図の①から③の設定を以下の様にし、1日間、仮想マシンのCPU14コアに対して、90％負荷をかけるシナリオをにしました。
 - Length :  攻撃する期間 (秒）　ここでは1日 86,400秒を入力
 - CPU Capacity :  1コアあたりのCPUの使用率 ここでは90%を入力
 - Cores :  負荷をかける対象のコア数 ここでは14コアを入力   
 
1. これで、Ubuntuに攻撃をする準備が整いました。
下図の`Unleash Gremlin`ボタンをクリックして、Ubuntuへの攻撃を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/d60b8062-591a-9c3d-b9ef-c261ad3229d1.png)

1. Ubuntuへの攻撃が始まり、Gremlinのポータル画面では、CPU使用率のグラフが時系列順に表示される様になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/077fc630-c059-ec7b-d0e7-13127399430d.png)

1. Ubuntuの`htop`の画面では、負荷が掛かっているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/05e5e5b2-82d3-c08e-db70-1ab908ccb74f.png)
ポイントとして、
 - 赤枠①では、Gremlinのポータルで設定した１４コアに約90%の負荷がかかっています。
 - 赤枠②では、`gremlin attack cpu -l 86400 -c 14 -p 90`と GremlinのClientを使って負荷をかけているのがわかります。
 
これは、下図のGremlinのアーキテクチャを確認すると Linuxに導入したGremlinのdaemonが図の右側のGremlinのコントロールプレーンにハートビートを受信して、攻撃できる状態なのか確認し、可能なら、clientから実際の攻撃を行っている仕組みになってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/31d09267-fff6-9277-d1ea-96234769d56a.png)

- (参考1)Gremlin - Client Overview    
  https://www.gremlin.com/docs/clients/overview/
- (参考2)Gremlin -daemon-client-overview   
https://www.gremlin.com/docs/infrastructure-layer/daemon-client-overview/

# 最後に
この投稿では、カオスエンジニアリングのツールの１つであるGremlinを使って、UbuntuのCPUを負荷をかける実験を行いました。

Gremlinは、Gremlinのアカウントと負荷をかける対象にClientとDaemonをインストールするだけで、CPU負荷をかけることができます。
CPU以外にも攻撃の種類は用意されているので、ぜひお試しください。