Edited at

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

More than 1 year has passed since last update.


はじめに

個人的には 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
H2
4.10.0

Gogs
SQLite3
v0.9.141_raspi2

Gitea
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
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

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


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

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

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

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

repo.png

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


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

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

issue.png

いずれもページ分割しているのだが、GitLab だけが線形増加しているように見える。

GitBucket が Gogs/Gitea に比べて結構遅いように思える。


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

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

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

comment.png

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

comment-nogl.png

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


リポジトリの clone 時間

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

http-push.png

http-clone.png

ssh-push.png

ssh-clone.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 を避ける必要は無いと思う。