婚活・恋活・再婚マッチング【マリッシュ(marrish)】
Skypeを使用しない独自のシステム【ECCオンラインレッスン】
リゾートバイト派遣業界No1の求人サイト【リゾバ.com】
次はあなたが出会う番です♡【ラブサーチ】

Go lang Ginフレームワーク ベンチマーク 秒間リクエスト 10000超え!

SPA用のAPIサーバーサイドをGoで開発するにあたりベンチマークとります。
テストとと言ってもただローカルでどれくらい捌けるか試します。
サーバー側でやることはGETでJSONを返すのみです。

やること:
1:GETリクエストされたら、簡単なJSONを返すだけのGo Ginサーバー設置
2:秒間リクエストをどれくらい捌けるかベンチマークテスト

3:DataStoreをNoSQLとRDBにした場合のベンチマークテスト

4:Viewテンプレートを使ったHTMLのSSR時のRequests/sec

環境:
Intel Core i7-8750H 2.2GHz 6コア
Mem 16G
PCIE SSD
MacOS側カーネル設定、mysql、Go net/httpの同一ホストアクセス制限解除、などチューニング済

今回使うGo Ginのコード
これをコンパイルして$GOPATHに置いて起動します。

これをベースにmongoDBやMysql でGorm ORMを使ったケースなどを試して行きたいと思います。

package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run()
}

GinでStaticなjsonを返すだけの処理

100リクエストを100同時接続。
RequestPerSecは16479です。

Ginの実行中のログ出力では1リクエストマイクロ秒単位で処理しているようです。

ApacheBenchの結果は下記の通りです。
100リクエストを100同時接続。
RequestPerSecは11390です。

GinとMondoDBでApacheBench

json返してるだけなので早いのは当たり前ですが、NoSQLと組み合わせたデータ構造も試しました。

NoSQLはmondoDBで5万件のユーザーデータから一件抽出しJSONを返すもので、
データはuserとscoreのみで軽量なjsonを5万件作成。
こちらもかなりの処理速度が出ています。

Ginのログ

ApacheBench
ReqPerSec: 9424

 

Gin Gorm ORM Mysqlで5万件から一件取得

RequestPerSecond: 3352

Ginでgorm ORM、DBから10件取得SSR。

100リクエストを100同時接続。

Requests per second: 3284

1000リクエストを100同時接続。
Requests per second: 4143

ginの処理時間

当たり前ですがレンダリングが入るとかなり遅くなりますね。

ついでなので、同じ構成で10件のjson返すだけも試しました。
Requests per second: 4245
100リクエストを100同時接続。

1000リクエストを100同時接続。
Requests per second: 5267

同時接続数を増やすとサーバーのスループットは落ちますが、なかなか良い結果が出てます。

本番サーバー環境ネットワーク速度などもあるのでレスポンスタイムなどはもう少し悪化するはずですが、golangの処理部分の速度はわかったので検証はここまでにします。

立ち上げ中のプロジェクトではハードウェアリソースを有効活用できるのと並列処理、メモリ節約などメリットが多いのでGolangを使って行こうと思います。

婚活・恋活・再婚マッチング【マリッシュ(marrish)】
Skypeを使用しない独自のシステム【ECCオンラインレッスン】
リゾートバイト派遣業界No1の求人サイト【リゾバ.com】
次はあなたが出会う番です♡【ラブサーチ】