GitBucket / Gogs / Gitea / GitLab のベンチマーク on Raspberry Pi 3

# はじめに

個人的には GitBucket 押しなのだが、Gogs/Gitea が Go で書かれているから速そうだ、とか GitLab の圧倒的な開発力とかが気になっていた。
ならばきちんとベンチマークを取ろうと思ってやってみたので公開する。

なお、環境としてはどこのご家庭にもありがちなマシンということで Raspberry Pi 3B を使ったが、これらのサーバを Raspberry Pi で提供することをオススメしているわけではないのでご注意を（SDカードメディアでリポジトリの管理とか無茶だと思う･･･）。Raspberry Pi だと SD カードのイメージをコピーしておくだけで環境をすぐ元に戻せるのが実験には都合良かった。


# 環境

|名称|Raspberry Pi 3 Model B|
|----|----|
|SoC|Broadcom BCM2837|
|CPU|ARM Cortex-A53(1.2GHz クアッドコア)|
|RAM|1GB|
|SDカード|TOSHIBA EXCERIA 16GB (MU-F016GX)|
|ネットワーク|IEEE802.11n 2.4GHz|
|OSイメージ|Raspbian Jessie Lite 2017-03-03|

クライアントとしては同じ無線LANにぶらさがった Macbook (New Macbook)を使用した。

# 比較対象

|名称|DB|バージョン|
|----|----|----|
|[GitBucket](https://github.com/gitbucket/gitbucket/)|H2|4.10.0|
|[Gogs](https://gogs.io/)|SQLite3|v0.9.141_raspi2|
|[Gitea](https://gitea.io)|SQLite3|1.1-linux-arm-7|
|GitBucket+pg|PostgreSQL|4.10.0|
|Gogs+pg|PostgreSQL|v0.9.141_raspi2|
|Gitea+pg|PostgreSQL|1.1-linux-arm-7|
|[GitLab](https://about.gitlab.com/)|PostgreSQL|9.0.0-rc7.ce.0|

MySQL は GitBucket に必要な 5.7 以上が Raspbiean Jessie のパッケージに無かったため今回は見送り。別マシンで DB を提供するパターンも興味があったがちょっと手間なので見送り。

# 初期設定

GitBucket, Gogs, Gitea はイメージを共用にして、H2/SQLite3 バージョンと PostgreSQL バージョンの2種類のイメージを作成した。それぞれ、1枚の SDカードに
GitBucket, Gogs, Gitea を入れて管理者アカウント・テストアカウントの2つのアカウントを作り、テストアカウントでアクセストークンを発行したところで SDカードのバックアップを取ってベンチマークの起点とした。
GitLab は別のSDカードを使い、同様にアカウント・アクセストークンを作成したところで起点のイメージを作成した。

GitLab はインストール時点でデーモンとして設定されるのでそのまま使ったが、GitBucket, Gogs, Gitea はスタンドアロン起動で実験した。

# 実験結果

## メモリ使用状況

起動後、Web/SSH 等のアクセスなしで `free -m` の結果を比較する。

起動前

```
pi@raspberrypi:~ $ free -m
             total       used       free     shared    buffers     cached
Mem:           925         79        845          6          6         39
-/+ buffers/cache:         34        891
Swap:           99          0         99
```

GitBucket

```
pi@raspberrypi:~ $ free -m
             total       used       free     shared    buffers     cached
Mem:           925        289        636          6          7        172
-/+ buffers/cache:        108        816
Swap:           99          0         99
```

Gogs

```
pi@raspberrypi:~ $ free -m
             total       used       free     shared    buffers     cached
Mem:           925        181        744          6          7        122
-/+ buffers/cache:         50        875
Swap:           99          0         99
```

Gitea

```
pi@raspberrypi:~ $ free -m
             total       used       free     shared    buffers     cached
Mem:           925        201        723          6          8        141
-/+ buffers/cache:         51        873
Swap:           99          0         99
```

pg 起動前

```
pi@raspberrypi:~ $ free -m
             total       used       free     shared    buffers     cached
Mem:           925        109        815         17          8         64
-/+ buffers/cache:         37        888
Swap:           99          0         99
```

GitBucket+pg

```
pi@raspberrypi:~ $ free -m
             total       used       free     shared    buffers     cached
Mem:           925        333        592         18          9        199
-/+ buffers/cache:        124        801
Swap:           99          0         99
```

Gogs+pg

```
pi@raspberrypi:~ $ free -m
             total       used       free     shared    buffers     cached
Mem:           925        216        709         19          9        152
-/+ buffers/cache:         53        871
Swap:           99          0         99
```

Gitea+pg

```
pi@raspberrypi:~ $ free -m
             total       used       free     shared    buffers     cached
Mem:           925        242        683         21          9        175
-/+ buffers/cache:         57        868
Swap:           99          0         99
```

GitLab

```
pi@raspberrypi:~ $ free -m
             total       used       free     shared    buffers     cached
Mem:           925        820        104         26         27        214
-/+ buffers/cache:        579        346
Swap:           99          0         99
```

## 設定直後の初期状態でのログイン後のトップページ表示時間

まずは簡単にログイン後のトップページの表示にかかる時間を計測する。
サーバによって表示する内容も異なるので参考までに。
Macbook の Chrome で5回くらいリロードを事前に行ってから、検証の Network タブで Finish と Load までの時間を計測（さらに5回計測して平均を取る）。
計測方法は以下も同じ。トップページ以外ではグラフは Finish だけを作成した。

![toppage.png](https://qiita-image-store.s3.amazonaws.com/0/53147/e33d4c2e-661d-e8f2-fac3-44044bd7d64f.png)

GitLab が遅いが、他は似たような感じ。

## リポジトリ数によるユーザページの表示時間

テストユーザにn個のリポジトリを作成してユーザページの表示時間を計測する(n=1, 10, 50, 100)。

GitBucket はリポジトリ全部を表示するが、Gogs/Gitea/GitLab はページ分割している。

Gogs/Gitea では API によるリポジトリ作成と、ブラウザでの表示のためのアクセスが同時になると、リポジトリ作成側で 500 Internal Server Error が発生するという問題があった。

![repo.png](https://qiita-image-store.s3.amazonaws.com/0/53147/2c7a2600-8ced-6c2d-cc51-a2d9dd4dd519.png)


GitBucket だけがリポジトリを全て表示していて、他はページ分割されている。GitBucket はそのせいで線形に増加しているのだろう。


## Issue 数による Issue 一覧ページの表示時間

テストユーザに1個のリポジトリを作成して、n個の Issue を作成して Issue 一覧ページの表示時間を計測する(n=1, 10, 50, 100)。

![issue.png](https://qiita-image-store.s3.amazonaws.com/0/53147/1f47ed6f-d7a4-8c18-6d0a-93f103e549d1.png)


いずれもページ分割しているのだが、GitLab だけが線形増加しているように見える。
GitBucket が Gogs/Gitea に比べて結構遅いように思える。

## Issue のコメント数による Issue ページ表示時間

テストユーザに1個のリポジトリを作成し、1個の Issue を作成してn個のコメントを付けて、Issue のページを表示する時間を計測する(n=1, 10, 50, 100)。

Gogsでコメントすると500返ってくるけどコメントできてる・・・

![comment.png](https://qiita-image-store.s3.amazonaws.com/0/53147/182c2f9c-848d-dc7a-d433-6ab3431fe0ae.png)

GitLab が極端に遅い。特にコメント数が増えると極端に遅くなる。他の比較が出来ないので、GitLab を除外してグラフを作り直してみる。

![comment-nogl.png](https://qiita-image-store.s3.amazonaws.com/0/53147/b734c14f-880e-4062-4e7d-4885793edb59.png)

Issue と比べて GitBucket が健闘しているように見える。ただ、Gogs/GitBucket は若干の右肩上がりだが、Gitea はほぼ横ばいなのでコメント数がさらに増えると逆転するのかもしれない。


## リポジトリの clone 時間

gitbucket/gitbucket リポジトリを clone しておいたものを push する時間、それを再び clone してくるときの時間を計測する。それぞれ HTTP/SSH の両方で計測した。この計測だけは1回しか行わなかった。

![http-push.png](https://qiita-image-store.s3.amazonaws.com/0/53147/3af7a504-568a-28f0-1e95-c610ff46a116.png)

![http-clone.png](https://qiita-image-store.s3.amazonaws.com/0/53147/8f4b11ee-4cc3-e8c5-26e9-8935bc1bbcb3.png)

![ssh-push.png](https://qiita-image-store.s3.amazonaws.com/0/53147/602e9010-6d8d-2700-35ef-d0d0a2b9a3af.png)

![ssh-clone.png](https://qiita-image-store.s3.amazonaws.com/0/53147/256d24d3-d296-8772-fea0-7656a2a25246.png)

HTTP での push は GitLab が極端に悪い他は横並び。clone は GitLab も含めて横並び。

SSH では push/clone どちらも GitLab が遅い。Gogs が良いように見えるが、Gitea との差があるところなのか不明なこと、PostgreSQL にすると大差ないことから誤差なのではないかと思われる。

Gitea だけ、push するとエラーメッセージが出ていたが特に問題なく動いていたような･･･


# まとめ

GitLab 遅い。Raspberry Pi だと 3B でもきついんじゃないかなぁ。

Gogs と Gitea は明確な差は無い。ただ、リポジトリの作成のときに Web でアクセスしながらだとエラーが出ていたので安定性に難あり？　多分 SQLite3 なのが悪いのだろうとは思う。

GitBucket はもうちょっと Gogs/Gitea と差がつくかと思っていたのだが、意外と良い結果だった。パフォーマンスを理由に GitBucket を避ける必要は無いと思う。