パフォーマンステストをはじめたい

# 自己紹介

- @mochizukikotaro 
- 会社は
    - AWS, Rails, CakePHP
    - Staging は docker + k8s + GCP
- 僕は
    - サーバサイド、フロントサイドのコードを書きます
    - インフラは全然わかりません
    - 開発環境を docker にするくらい

---
# きっかけ

- Rails バージョンアップ
    - memory 使用量が上がる
    - 速度が遅くなる
- 広告のブースト
    - アクセスできなくなる

---
# Types of performance testing

- load testing
- stress testing
- endurance/soak testing
- spike testing
- others...

---

- 性能テスト
    - 負荷テスト
    - ストレステスト
    - 耐久テスト
    - スパイクテスト
    - そのほかにも...

---

# Load testing

特定の負荷を処理できることを確認する

![load-testing.png](https://qiita-image-store.s3.amazonaws.com/0/45822/0f97c4e5-19a5-88b8-68b7-cf3b6c1f680b.png)


---

# Soak testing

継続的な負荷をあたえたときに、システムがどう動作するのか確認する

![soak-testing.png](https://qiita-image-store.s3.amazonaws.com/0/45822/199567a8-f6c9-9364-d7f9-87cad9204252.png)

---

# Spike testing

短期間大量アクセスの場合をしらべる

![spike-testing.png](https://qiita-image-store.s3.amazonaws.com/0/45822/b97957b8-6a62-6259-46b3-d05049c6abf6.png)


---
# Stress testing

負荷をあげていって限界をしらべる

![stress-testing.png](https://qiita-image-store.s3.amazonaws.com/0/45822/8e42a80c-f227-9226-e57b-8e8474dde6aa.png)


---

# 見る指標

- load average
- cpu
- memory
- Response time
- Request per second

---

# 見るツール

- top command
- AWS console
- mackerel

---

# top command

<img width="732" alt="スクリーンショット 2018-10-20 16.20.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/45822/857e3fd8-2613-d150-a355-fb6c1534e3ac.png">

---

# 有無を言わさずうつ key は

---

# z

---

# 色がつきます

![image.png](https://qiita-image-store.s3.amazonaws.com/0/45822/ae3edc55-8e2f-b96b-9e49-877a39d33256.png)

---

# z x c b

![image.png](https://qiita-image-store.s3.amazonaws.com/0/45822/d5d885f7-c1b4-90ec-be5f-8f197900bba7.png)

---

# htop command

最初から見やすい。とくにメモリ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/45822/3b4633b4-652a-2586-4c41-b91517ae76d5.png)

---

# 負荷のかけかた

- ab
- Apache JMeter™
- vegeta
- k6

---

# vegeta

- https://github.com/tsenart/vegeta
- over 9000 stars
- Golang

![vegeta.jpeg](https://qiita-image-store.s3.amazonaws.com/0/45822/e1c9d889-bf46-7de6-a5c8-fdbc11ce0385.jpeg)

---

# k6

- https://github.com/loadimpact/k6
- Golang で出来ていて、シナリオを ES6 でかける
- [Load Impact](https://loadimpact.com/) がつくっている

---

`ab -c 10 -n 100 url` のように `k6 run -v 10 -i 100 url` とすることもできますし、複雑なシナリオを（ES6で）書くこともできます。

サンプルシナリオを書いてみます。

```
最初は 同時接続 3 で、2秒かけて 5に　増やし、その後 4秒間で 8 まで増やし、その後...
```

```javascript:tgif-sample.js
import encoding from "k6/encoding";
import http from "k6/http";

export let options = {
    vus: 3,
    stages: [
        { duration: "2s", target: 5 },
        { duration: "4s", target: 8 },
        { duration: "3s", target: 0 },
    ]
};

export default function() {
    //let response = http.get("https://***.com/",  { headers: { "Authorization": "Basic " + encoding.b64encode("user:pw") }});
    let response = http.get("http://724c29d2.ngrok.io/");
};
```

実行は、 `k6 run script.js` です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/45822/beace714-a860-6083-fed2-97c3457b0d6e.png)


---

# k6 cloud


ベジータみたいにプロットされたデータが見れます。（一ヶ月無料トライアル... => https://loadimpact.com/pricing/）

コマンドは、 `k6 cloud` です。

```
$ k6 cloud tgif-sample.js

          /\      |‾‾|  /‾‾/  /‾/
     /\  /  \     |  |_/  /  / /
    /  \/    \    |      |  /  ‾‾\
   /          \   |  |‾\  \ | (_) |
  / __________ \  |__|  \__\ \___/ .io



     execution: cloud
     script: tgif-sample.js
     output: https://app.loadimpact.com/k6/runs/111735

     test status: Finished
```

`output` URL にアクセスすると以下を得られます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/45822/cd315cca-fff9-020a-8ebc-624c6e0c4794.png)

---

# おわり

ざっとですが、パフォーマンステストの種類、見る指標、負荷かけるツールなどを並べてみました。
運用に載せれるように、すこしずつ使って行きたいと思います。
具体的な数値の設計とかをちゃんと考えられるようになりたいです。