SlideShare ist ein Scribd-Unternehmen logo
1 von 87
EchoやGinはなぜ速いのか?
~Goで高速なHTTP routerを作るコツ~
1
自己紹介
Nakamura Keisuke (@N9tE9:ネクテック)
Gopher 5年生
GoConference mini 2022 Autumn in Sendai LT登壇
静的解析/HTTP Router/gRPCコンパイラ(最近)
好きな標準パッケージ
sync net/http
DMM.com 22年度新卒入社
→ DMMプラットフォーム内におけるGoの認証SDKを開発
DMM.go の運営
2
Short Session の内容
- 本セッションで扱う HTTP Router について
- HTTP Router の実装のお話
- よく使われる sync.Pool
○ GoでHTTP Routerを実装するには?
○ 機能とパフォーマンスを落とさず提供する
- Router内部で高速に文字列処理を扱う方法
- EchoやGinで工夫されているところ
3
本セッションで扱う HTTP Router について
1. 静的ルーティング (/health などURLのパスが変わらないもの)
2. パスパラメータルーティング (/:user のような動的に値が変わるもの)
4
一般的な HTTP Router の内部実装
Trie Tree や Radix Tree といった木構造をベースに実装されている
/ h e a l t h
/ health
5
一般的な HTTP Router の内部実装
Trie Tree や Radix Tree といった木構造をベースに実装されている
6
“/health”
/ h e a l t h
/ health
一般的な HTTP Router の内部実装
Trie Tree や Radix Tree といった木構造をベースに実装されている
7
“/health”
/ h e a l t h
/ health
一般的な HTTP Router の内部実装
Trie Tree や Radix Tree といった木構造をベースに実装されている
8
“/health”
/ h e a l t h
/ health
/health のハンドラ
HTTP Routerで使われている sync.Pool
sync.Poolの仕様 (https://pkg.go.dev/sync#Pool より)
1. スレッドセーフである
2. sync.Pool はGCによって削除される可能性がある
3. Poolが足りない場合は都度アロケートされる
9
HTTP Routerで使われている sync.Pool
sync.Poolの仕様 (https://pkg.go.dev/sync#Pool より)
1. スレッドセーフである
2. sync.Pool はGCによって削除される可能性がある
3. Poolが足りない場合は都度アロケートされる
→ HTTP Routerのユースケースとの相性がいいの?
10
GoでHTTP Routerを実装すると?
リクエスト → レスポンスを制御する箇所にルーティングのロジックを呼び出す
11
type Handler interface {
ServeHTTP(ReponseWriter, *Request)
}
リクエスト → レスポンスを制御する箇所にルーティングのロジックを呼び出す
→ http.Handler インターフェースを実装する
12
GoでHTTP Routerを実装すると?
リクエスト → レスポンスを制御する箇所にルーティングのロジックを呼び出す
→ http.Handler インターフェースを実装する
type Handler interface {
ServeHTTP(ReponseWriter, *Request)
}
→ ServeHTTPメソッドをRouterの構造体に実装すれば良い
13
GoでHTTP Routerを実装すると?
14
リクエスト *Router.ServeHTTP()
/health
*Router.Search()
レスポンス
/health handler
handler 実行
GoでHTTP Routerを実装すると?
15
リクエスト *Router.ServeHTTP()
/health
*Router.Search()
レスポンス
/health handler
handler 実行
*RouterをHTTP Serverとして動かしたい
→ ServeHTTPメソッドを実装したRouterの構造体をhttp.ListenAndServeなどに渡す
GoでHTTP Routerを実装すると?
(*http.Server).Serve() の挙動
16
(*http.Server).Serve() の挙動
for {
// 中略
if cc := srv.ConnContext; cc != nil {
connCtx = cc(connCtx, rw)
if connCtx == nil {
panic("ConnContext returned nil")
}
}
tempDelay = 0
c := srv.newConn(rw)
c.setState(c.rwc, StateNew, runHooks) // before Serve can return
go c.serve(connCtx)
}
参考: https://github.com/golang/go/blob/master/src/net/http/server.go
17
(*http.Server).Serve() の挙動
for {
// 中略
if cc := srv.ConnContext; cc != nil {
connCtx = cc(connCtx, rw)
if connCtx == nil {
panic("ConnContext returned nil")
}
}
tempDelay = 0
c := srv.newConn(rw)
c.setState(c.rwc, StateNew, runHooks) // before Serve can return
go c.serve(connCtx)
}
18
参考: https://github.com/golang/go/blob/master/src/net/http/server.go
(*http.Server).Serve() の挙動
for {
// 中略
if cc := srv.ConnContext; cc != nil {
connCtx = cc(connCtx, rw)
if connCtx == nil {
panic("ConnContext returned nil")
}
}
tempDelay = 0
c := srv.newConn(rw)
c.setState(c.rwc, StateNew, runHooks) // before Serve can return
go c.serve(connCtx)
}
1 リクエスト毎にgoroutineを起動してそう
19
参考: https://github.com/golang/go/blob/master/src/net/http/server.go
1リクエストごとにgoroutineが起動するか確認する
どう確認する?
20
1リクエストごとにgoroutineが起動するか確認する
どう確認する?
→ goroutineは内部でIDが振られている (goroutineID)
Handler内でgoroutineIDを出力すれば良い
21
Handler内でgoroutineIDを出力する
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
goroutineID := []byte(strings.Split(string(debug.Stack()), "¥n")[0])
w.WriteHeader(http.StatusOK)
// write goroutine id as response
w.Write(goroutineID)
})
srv := &http.Server{
Handler: mux,
}
srv.Addr = ":8001"
srv.ListenAndServe()
}
22
Handler内でgoroutineIDを出力する
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
goroutineID := []byte(strings.Split(string(debug.Stack()), "¥n")[0])
w.WriteHeader(http.StatusOK)
// write goroutine id as response
w.Write(goroutineID)
})
srv := &http.Server{
Handler: mux,
}
srv.Addr = ":8001"
srv.ListenAndServe()
}
23
debug.Stack()
goroutine 18 [running]:
runtime/debug.Stack()
/usr/local/Cellar/go/1.20.2/libexec/src/runtime/debug/stack.go:24 +0x65
…
created by net/http.(*Server).Serve
/usr/local/Cellar/go/1.20.2/libexec/src/net/http/server.go:3089 +0x5ed
24
debug.Stack()
goroutine 18 [running]:
runtime/debug.Stack()
/usr/local/Cellar/go/1.20.2/libexec/src/runtime/debug/stack.go:24 +0x65
…
created by net/http.(*Server).Serve
/usr/local/Cellar/go/1.20.2/libexec/src/net/http/server.go:3089 +0x5ed
25
リクエストを送って確認する
リクエストごとに異なる goroutine で処理されている
26
go のリクエスト → レスポンス
27
リクエスト待機
リクエスト待機
go のリクエスト → レスポンス
28
goroutine起動
リクエスト待機
リクエスト
goroutine起動
リクエスト待機
go のリクエスト → レスポンス
29
goroutine起動 リクエスト待機
リクエスト待機
リクエスト
go のリクエスト → レスポンス
30
ハンドラ処理 レスポンス
リクエスト
goroutine起動 リクエスト待機
リクエスト待機
go のリクエスト → レスポンス
31
ハンドラ処理 レスポンス
リクエスト
goroutine起動 リクエスト待機
リクエスト待機
ハンドラ処理 レスポンス
…
go のリクエスト → レスポンス
32
ハンドラ処理 レスポンス
リクエスト
goroutine起動 リクエスト待機
リクエスト待機
ハンドラ処理 レスポンス
…
Router側で提供したい共通の機能やデータは?
go のリクエスト → レスポンス
33
ハンドラ処理 レスポンス
リクエスト
goroutine起動 リクエスト待機
リクエスト待機
ハンドラ処理 レスポンス
…
理想
Router側で提供したい共通の機能やデータは?
go のリクエスト → レスポンス
34
ハンドラ処理 レスポンス
リクエスト
goroutine起動 リクエスト待機
リクエスト待機
ハンドラ処理 レスポンス
…
メモリプール
理想
Router側で提供したい共通の機能やデータは?
go のリクエスト → レスポンス
35
ハンドラ処理 レスポンス
リクエスト
goroutine起動 リクエスト待機
リクエスト待機
ハンドラ処理 レスポンス
…
メモリプール
スレッドセーフの必要がある
理想
Router側で提供したい共通の機能やデータは?
複数ハンドラから共通の機能を参照したい時
goroutine毎に機能に必要なメモリをアロケートする必要がある
36
複数ハンドラから共通の機能を参照したい時
goroutine毎に機能に必要なメモリをアロケートする必要がある
e.g.)
1. パスパラメータ値を保持するスライスやマップ
2. NotFound時の共通ハンドラ
3. カスタマイズした ResponseWriter (io.Writer)
…
37
複数ハンドラから共通の機能を参照したい時
goroutine毎に機能に必要なメモリをアロケートする必要がある
e.g.)
1. パスパラメータ値を保持するスライスやマップ
2. NotFound時の共通ハンドラ
3. カスタマイズした ResponseWriter (io.Writer)
…
使いまわせるので Pool したい...
38
複数ハンドラから共通の機能を参照したい時
goroutine毎に機能に必要なメモリをアロケートする必要がある
e.g.)
1. パスパラメータ値を保持するスライスやマップ
2. NotFound時の共通ハンドラ
3. カスタマイズした ResponseWriter (io.Writer)
…
使いまわせるので Pool したい...
→ sync.Poolを使う
39
sync.Pool を使う
sync.Poolの仕様 (https://pkg.go.dev/sync#Pool より)
1. スレッドセーフである
2. sync.Pool はGCによって削除される可能性がある
3. Poolが足りない場合は都度アロケートされる
40
sync.Pool を使う
sync.Poolの仕様 (https://pkg.go.dev/sync#Pool より)
1. スレッドセーフである
2. sync.Pool はGCによって削除される可能性がある
3. Poolが足りない場合は都度アロケートされる
HTTP Routerのユースケースとの相性がいいの?
→ HTTP Router のユースケースと相性が良い
41
sync.Pool を使う
sync.Poolの仕様 (https://pkg.go.dev/sync#Pool より)
1. スレッドセーフである
2. sync.Pool はGCによって削除される可能性がある
3. Poolが足りない場合は都度アロケートされる
HTTP Routerのユースケースとの相性がいいの?
→ HTTP Router のユースケースと相性が良い
42
sync.Pool を使う
sync.Poolの仕様 (https://pkg.go.dev/sync#Pool より)
1. スレッドセーフである
2. sync.Pool はGCによって削除される可能性がある
3. Poolが足りない場合は都度アロケートされる
HTTP Routerのユースケースとの相性がいいの?
→ HTTP Router のユースケースと相性が良い
43
sync.Pool を使った/使わない場合のパフォーマンス差
ベンチマーク対象コード: https://github.com/lkeix/myrouter/tree/add-sync-pool
poolする構造体
type Param struct {
key string
value string
}
type Context struct {
params []*Param
w http.ResponseWriter
r *http.Request
}
44
sync.Pool を使った/使わない場合のパフォーマンス差
ベンチマーク対象コード: https://github.com/lkeix/myrouter/tree/add-sync-pool
poolする構造体
type Param struct {
key string
value string
}
type Context struct {
params []*Param
w http.ResponseWriter
r *http.Request
}
45
sync.Poolを使った場合
sync.Poolを使わない場合
46
sync.Poolを使った場合
sync.Poolを使わない場合
47
sync.Poolを使った場合
sync.Poolを使わない場合
48
sync.Poolを使った場合
sync.Poolを使わない場合
49
sync.Poolのベンチマーク比較
構造体がそこまで大きくなくても、sync.Poolを使うことで...
1. アロケーションの回数は1/2に
2. メモリのアロケーションの容量(B/op)は1/5に
3. 速度は1.3倍程度速くなる
50
sync.Poolのベンチマーク比較
構造体がそこまで大きくなくても、sync.Poolを使うことで...
1. アロケーションの回数は1/2に
2. メモリのアロケーションの容量(B/op)は1/5に
3. 速度は1.3倍程度速くなる
51
高機能になると構造体が大きくなるので sync.Pool を使うことの恩恵が大きくなる
→ 高機能な HTTP Router を作る際にはsync.Poolが必要になる
HTTP Routing において高速に文字列を扱う
HTTP Routing における文字列マッチング
1. 木構造に登録されているノードとの文字列の部分一致
2. 登録されているパスパラメータの抽出
52
HTTP Routing において高速に文字列を扱う
HTTP Routing における文字列マッチング
1. 木構造に登録されているノードとの文字列の部分一致
2. 登録されているパスパラメータの抽出
→ 文字列の部分一致と結合
53
EchoやGinはどうやって実装している?
54
/ health
fuga
EchoやGinはどうやって実装している?
55
/ health
fuga
“/health”
EchoやGinはどうやって実装している?
56
/ health
fuga
“health” 一致箇所を空文字にする
EchoやGinはどうやって実装している?
57
/ health
“health”
fuga
どっちに進むべき?
EchoやGinはどうやって実装している?
58
/ health
“health”
fuga
頭文字のhをインデックスとして移動する
EchoやGinはどうやって実装している?
59
/ health
“health”
fuga
頭文字のhをインデックスとして移動する
※ 文字列一致の検証はノード移動後に行う
移動すべきノードの検索について (N9tE9案)
60
/ health
“health”
fuga
この段階で文字列一致を検証した場合は?
ノード移動後の検証処理を省ける
比較してみる
ベンチマークしたコード
https://github.com/lkeix/myrouter/blob/compare-string-process/compare/bench_test.go
- Trie Tree
- Echo/Gin Radix Tree (インデックスでの移動)
- N9tE9 Radix Tree (移動前に子ノードの文字列一致をする)
静的ルーティングにおける速度を比較する
61
62
速度
1. Trie
2. Radix (インデックスでの移動)
3. N9tE9 Radix Tree (移動前に子ノードの文字列一致をする)
63
速度
1. Trie
2. Radix (インデックスでの移動)
3. N9tE9 Radix Tree (移動前に子ノードの文字列一致をする)
パスパラメータルーティング
64
パスパラメータルーティング
65
/ health
:hogehoge
/ health
:hogehoge
パスパラメータルーティング
66
/ health
*http.Request.URL.Path = “/healthy”
:hogehoge
“/healthy”
パスパラメータルーティング
67
/ health
*http.Request.URL.Path = “/healthy”
:hogehoge
“y”
パスパラメータルーティング
68
/ health
*http.Request.URL.Path = “/healthy”
y が残り探索に失敗する
:hogehoge
“y”
パスパラメータルーティング
69
/ health
*http.Request.URL.Path = “/healthy”
:hogehoge
“healthy”
パスパラメータルーティング
70
/ health
*http.Request.URL.Path = “/healthy”
パスパラメータノードがあるノードまで戻る
→ バックトラック
Trieだとhealthの6ノード分戻る必要がある
:hogehoge
“healthy”
パスパラメータルーティング
71
/ health
*http.Request.URL.Path = “/healthy”
:hogehoge
“healthy”
パスパラメータノードがあるノードまで戻る
→ バックトラック
Trieだとhealthの6ノード分戻る必要がある
パスパラメータルーティング
72
/ health
:hogehoge
*http.Request.URL.Path = “/healthy”
healthy をパスパラメータとして抽出する
パスパラメータの抽出
73
次の ‘/’ または 空文字 までの文字列を抽出する
1. 一文字ずつ += で文字列結合する
2. bytes.Buffer.WriteString() を使って文字列結合する
3. スライスのインデックスで文字列を抽出する
4. 正規表現で抽出する
ベンチマーク
74
速度
1. インデックスから抽出
2. WriteStringでの結合
3. += で結合
4. 正規表現
HTTP Routing で高速に文字列を扱うには?
75
1. 次のノードの探索はインデックスを使って検索する
→ Echo や Gin では頭文字をインデックスとして扱っている
2. 文字列(パスパラメータ)の抽出はスライスを利用する
ただし、標準パッケージの最適化によって変わる可能性はある
1. データ構造の長所/短所を考慮しながら実装する
e.g.)
- Trie Treeはバックトラックに弱い
- Radix Treeは実装が複雑になる
Echo や Gin で工夫されているところ
76
1. sync.Poolで必要になる分は予めアロケートしておく
2. パスパラメータは独自のcontextで持つ
3. 関数呼び出しを減らす
Echo や Gin で工夫されているところ
77
sync.Poolで必要になる分は予めアロケートしておく
Echo や Gin で工夫されているところ
78
sync.Poolで必要になる分は予めアロケートしておく
Echo → パスパラメータのスライス、NotFound時のハンドラ、...
Gin → パスパラメータのスライス
Echo や Gin で工夫されているところ
79
sync.Poolで必要になる分は予めアロケートしておく
Echo → パスパラメータのスライス、NotFound時のハンドラ、...
Gin → パスパラメータのスライス
パスパラメータのスライスは共通して最大長アロケートしている
e.g.) “/:hoge/:fuga/:piyo” → 長さ3のスライスを用意する
→ スライスのappendは速度面からするとコストがかかる
Echo や Gin で工夫されているところ
80
パスパラメータは独自Contextで持つ
Echo や Gin で工夫されているところ
81
パスパラメータは独自Contextで持つ
リクエストのcontext.Contextに持たせることもできる
→ chi はこの実装でパスパラメータを格納している
context.Contextに格納する場合は速度面でかなり遅くなる
Echo や Gin で工夫されているところ
82
パスパラメータは独自Contextで持つ
リクエストのcontext.Contextに持たせることもできる
→ chi はこの実装でパスパラメータを格納している
context.Contextに格納する場合は速度面でかなり遅くなる
フレームワーク 設計思想 パフォーマンス
chi 標準net/httpパッケージに準拠 比較的遅い
Echo/Gin 内部はnet/httpをベースでパフォーマンスも求める まずまず
fasthttp 独自実装でパフォーマンスを求める 比較的速い
Echo や Gin で工夫されているところ
83
関数呼び出しを減らす
Echo や Gin で工夫されているところ
84
関数呼び出しを減らす
Echo → ルーティングの一部で goto 文が利用されている
Gin → ルーティングアルゴリズムは大きなトランザクションスクリプトで実装
Echo や Gin で工夫されているところ
85
関数呼び出しを減らす
Echo → ルーティングの一部で goto 文が利用されている
Gin → ルーティングアルゴリズムは大きなトランザクションスクリプトで実装
goto 文だとロジックを追いづらくならない?
→ goto 文が内部での関数呼び出しのようになっていて寧ろ読みやすい
個人的には Gin のトランザクションスクリプトの方が読みづらい
高機能で高速なHTTP Routerを作るコツ (まとめ)
86
→ sync.Pool でハンドラ共通で利用する機能はPoolする
小さな構造体でもパフォーマンスが向上する
予め使う分は先にアロケートしておく
→ Routingの文字列操作は以下のようにする
1. 次の探索ノードはインデックスを使う
2. パスパラメータの抽出はスライスで抽出する
→ ルーティングにおいて、関数呼び出しは減らす
可読性 x パフォーマンス のトレードオフなので、実装者がここを見極める必要がある
→ どのようにAPIを提供したいかによってパフォーマンスも変わってくる
ご清聴ありがとうございました

Weitere ähnliche Inhalte

Ähnlich wie EchoyaGinhanazeSu_inoka.pptx

2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料Yasutaka Hamada
 
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪Kunihiro TANAKA
 
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps OnlineGKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps OnlineGoogle Cloud Platform - Japan
 
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionYoshifumi Kawai
 
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...さくらインターネット株式会社
 
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50Preferred Networks
 
FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係moai kids
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングKiwamu Okabe
 
Firefox OS and Web server
Firefox OS and Web serverFirefox OS and Web server
Firefox OS and Web serverTomoaki Konno
 
WebRTC meetup Tokyo 1
WebRTC meetup  Tokyo 1WebRTC meetup  Tokyo 1
WebRTC meetup Tokyo 1mganeko
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Masahiro Nagano
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略Hiroshi SHIBATA
 
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜Masaya Aoyama
 
OpenContrailのソースコードを探検しよう!
OpenContrailのソースコードを探検しよう!OpenContrailのソースコードを探検しよう!
OpenContrailのソースコードを探検しよう!Takashi Sogabe
 
AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境Katsutoshi Nagaoka
 
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 SpringGoでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 SpringYahoo!デベロッパーネットワーク
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発Yuta Matsumura
 

Ähnlich wie EchoyaGinhanazeSu_inoka.pptx (20)

2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
 
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
 
osoljp 2011.08
osoljp 2011.08osoljp 2011.08
osoljp 2011.08
 
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps OnlineGKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
 
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnion
 
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
 
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
 
FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミング
 
ProjectAtomic-and-geard
ProjectAtomic-and-geardProjectAtomic-and-geard
ProjectAtomic-and-geard
 
Firefox OS and Web server
Firefox OS and Web serverFirefox OS and Web server
Firefox OS and Web server
 
WebRTC meetup Tokyo 1
WebRTC meetup  Tokyo 1WebRTC meetup  Tokyo 1
WebRTC meetup Tokyo 1
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
 
20201127 .NET 5
20201127 .NET 520201127 .NET 5
20201127 .NET 5
 
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
 
OpenContrailのソースコードを探検しよう!
OpenContrailのソースコードを探検しよう!OpenContrailのソースコードを探検しよう!
OpenContrailのソースコードを探検しよう!
 
AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境
 
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 SpringGoでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発
 

EchoyaGinhanazeSu_inoka.pptx

Hinweis der Redaktion

  1. http.ListenAndServeやhttp.Server.ListenAndServeは、http.Server.Serveのラッパー関数のようなものなので、http.Server.Serveの挙動について説明します
  2. http.ListenAndServeやhttp.Server.ListenAndServeは、http.Server.Serveのラッパー関数のようなものなので、http.Server.Serveの挙動について説明します
  3. http.ListenAndServeやhttp.Server.ListenAndServeは、http.Server.Serveのラッパー関数のようなものなので、http.Server.Serveの挙動について説明します
  4. http.ListenAndServeやhttp.Server.ListenAndServeは、http.Server.Serveのラッパー関数のようなものなので、http.Server.Serveの挙動について説明します
  5. http.ListenAndServeやhttp.Server.ListenAndServeは、http.Server.Serveのラッパー関数のようなものなので、http.Server.Serveの挙動について説明します
  6. http.ListenAndServeやhttp.Server.ListenAndServeは、http.Server.Serveのラッパー関数のようなものなので、http.Server.Serveの挙動について説明します
  7. http.ListenAndServeやhttp.Server.ListenAndServeは、http.Server.Serveのラッパー関数のようなものなので、http.Server.Serveの挙動について説明します
  8. http.ListenAndServeやhttp.Server.ListenAndServeは、http.Server.Serveのラッパー関数のようなものなので、http.Server.Serveの挙動について説明します
  9. http.ListenAndServeやhttp.Server.ListenAndServeは、http.Server.Serveのラッパー関数のようなものなので、http.Server.Serveの挙動について説明します
  10. http.ListenAndServeやhttp.Server.ListenAndServeは、http.Server.Serveのラッパー関数のようなものなので、http.Server.Serveの挙動について説明します
  11. http.ListenAndServeやhttp.Server.ListenAndServeは、http.Server.Serveのラッパー関数のようなものなので、http.Server.Serveの挙動について説明します
  12. 1リクエスト毎1goroutineで処理するため、スレッドセーフの必要がある
  13. エンドポイントやリクエスト毎にBodyやHeaderの大きさが違うので、足りない場合はアロケートされる 同じような大きさのリクエストがきた時にプールから取得するためメモリのアロケーションが必要なくなる
  14. 構造体が大きくなるとアロケーションのコストも大きくなる EchoやGinはそこまでsync.Poolを最適化して使っていない 雑に使ってもそれなりのパフォーマンスチューニングが可能 fasthttpはこのあたりのプーリングの機構を独自に持っていてかなり最適化がされている