ラベル GitlabPerformanceTool の投稿を表示しています。 すべての投稿を表示
ラベル GitlabPerformanceTool の投稿を表示しています。 すべての投稿を表示

2021年5月28日金曜日

Gitlab Performance Tool を使ってみた

Gitlab Performance Tool を使ってみた

概要

Gitlab Performance Tool (gpt) はその名の通り Gitlab のパフォーマンスを測ることができるツールです オンプレで構築した Gitlab がどれくらいの規模まで耐えられるかなどテストすることができます docker でどちらもサクット実行することができます

環境

  • Gitlab 13.11.3
  • Gitlab helm chart 4.12.0
  • docker 19.03.6
    • gpt-data-generator 1.0.21
    • gitlab-performance-tool

流れと仕組み

GPT は Gitlab API を使って「テストデータの 作成」と「負荷テスト」を行います なので要件としては

  • API をコールするためのアクセストークンの取得
  • Gitlab の API のエンドポイントにアクセスできる

の 2 つを満たしていれば基本的にはどんな Gitlab 環境にも実行することはできます もし動作しない場合は Gitlab の構築ミスか Gitlab 側のバグになります

root ユーザでパーソナルアクセストークンを作成する

GPT は Gitlab の API を使って負荷テストをします また管理者ユーザ権限が必要になるのでデフォルトで作成される root ユーザを使います

GUI にログインしてユーザの設定からパーソナルアクセストークンを作成しましょう トークンのスコープはすべてオンにします

テストデータの生成

まずは Gitlab にテスト用のプロジェクトやグループを作成します テストデータを作成するためのツールも用意されているのでそれを使います

設定ファイルの作成

GPT は規模に応じてテストのケースを変更することができます 例えば一番小さなテストであれば 1k.json を使います

これをダウンロードして url の部分を変更しましょう それ以外は特に変更の必要はありません

  • mkdir config/environments
  • vim config/environments/1k.json
{
  "environment": {
    "name": "1k",
    "url": "https://gitlab.example.com",
    "user": "root",
    "config": {
      "latency": "0"
    },
    "storage_nodes": ["default"]
  },
  "gpt_data": {
    "root_group": "gpt",
    "large_projects": {
      "group": "large_projects",
      "project": "gitlabhq"
    },
    "many_groups_and_projects": {
      "group": "many_groups_and_projects",
      "subgroups": 250,
      "subgroup_prefix": "gpt-subgroup-",
      "projects": 10,
      "project_prefix": "gpt-project-"
    }
  }
}

実行する

ではテストデータの作成用のコンテナを実行します ACCESS_TOKEN に作成した root ユーザのパーソナルアクセストークンを指定します

いくつか質問されますがすべて Yes で OK です また冒頭にも説明しましたが Gitlab の API をコールするので先程 url に指定した Gitlab へはアクセスできる環境で実行してください

  • mkdir results
docker run --rm -it \
-e ACCESS_TOKEN=xxxxx \
-v $(pwd)/config:/config \
-v $(pwd)/results:/results \
gitlab/gpt-data-generator --environment 1k.json

成功するとグループやプロジェクトが Gitlab 上に作成されているのが GUI 上でも確認できると思います

注意点としては大きいファイルをアップロードする処理があります そこで nginx など 413 に引っかかる可能性があるので注意しましょう

また大きいプロジェクトのインポートには時間がかかるため 504 が返ってくることがあります 504 が返ってきてもインポートは進んでいるので完了するまで待ちましょう 環境にもよりますが 30 分から 1 時間ほどかかります 504 はリバプロ側の nginx であれば以下で回避できます (server ディレクティブに以下を追記)

send_timeout 3600;
proxy_connect_timeout 3600;
proxy_read_timeout    3600;
proxy_send_timeout    3600;

それでも大きなプロジェクトのインポートに失敗する場合は GUI から tar ファイルを指定して gitlabhq1 という名前のプロジェクト名でインポートしてください またグループを gpt/large_projects 配下に移動してください

helm chart の Gitlab を使っている場合は

nginx-ingress の proxy-body-size の設定を変更する必要があります

--set global.ingress.annotations."nginx\.ingress\.kubernetes\.io/proxy-body-size"=0
  • kubectl get ingress gitlab-webservice-default -n gitlab -o jsonpath={.metadata.annotations."nginx\.ingress\.kubernetes\.io/proxy-body-size"}

で 0 になっていれば OK です

トラブルシューティング: gitlab-runner がいるとテスト用のパイプラインをインポートできない?

どうやら runner のあるなしは関係なさそうです

パイプラインも 11 個インポートするのですが gitlab-runner がいるとパイプラインが走ってしまうためインポートしてくれません なので specific-runner/shared-runner はオフにしておきましょう

- Project metadata validation failed: pipelines count '0' should be '11' or higher as specified in the Project Config file.

トラブルシューティング: スペックが足りない

インポートがうまくいかない場合は sidekiq と webservice のメモリと CPU の割当を増やしてみましょう 自分が成功し始めたのはそれぞれに 3GB のメモリを割り当ててから成功するようになりました

そもそもノードに 3GB 以上のメモリがない場合はホストのスペックを上げてから再度試してみてください

負荷の設定ファイルを作成

データの量に合わせて負荷の設定も変えられます 一応おすすめの組み合わせがあるようなので今回はそれに従います

  • 1k - 60s_20rps.json (今回はここ)
  • 2k - 60s_40rps.json
  • 3k - 60s_60rps.json
  • 5k - 60s_100rps.json
  • 10k - 60s_200rps.json
  • 25k - 60s_500rps.json
  • 50k - 60s_1000rps.json

設定ファイルはこちらにあるのでダウンロードしましょう 特に編集するところはありません

  • mkdir config/options
  • vim config/options/60s_20rps.json
{
  "stages": [
    { "duration": "5s", "target": 20 },
    { "duration": "50s", "target": 20 },
    { "duration": "5s", "target": 0 }
  ],
  "rps": 20,
  "batchPerHost": 0
}

パフォーマンステストの実行

ではパフォーマンステストを実行します

  • mkdir tests
docker run --rm -it \
-e ACCESS_TOKEN=xxxxx \
-v $(pwd)/tests:/tests \
-v $(pwd)/config:/config \
-v $(pwd)/results:/results \
gitlab/gitlab-performance-tool --environment 1k.json --options 60s_20rps.json -u

1 時間ほどかかるので待ちましょう 結果は results ディレクトリ配下にあります

ポイントとしては最後の「-u」オプションです これがないと git_push テストなどが行われないのでフルテストを行いたい場合は付与しましょう

結果の見方

Overrall Results Score という値があるのでこれが 100% になっていれば今回テストした規模のユーザ数 (1k.json) はクリアしていることになります

最後に

テストデータを入れるところで今回はハマりました helm chart 版の Gitlab を使ったのですがその場合は MinIO がデフォルトで使われるのでそれの影響かもしれません

参考サイト