Go Conference 2018 Autumn 大規模ウェブサービスにおけるコード レビュー観点
DeNA では Google App Engine Standard Environment (GAE SE) を用い、マイクロサービスとして大規模なトラフィックをさばくウェブサービスを開発・運用しています。 GAE SE は強力なPaaSですが、1インスタンスあたりのメモリ使用量が限られるという制約もあります。本発表では、GAE SE 上で高ハイパフォーマンスを実現するために、日々開発現場で用いているメモリ最適化手法を中心に、コードレビュー観点をご紹介します。
2018 DeNA Co.,Ltd. All Rights Reserved. 1 大規模ウェブサービスにおけるコード レビュー観点 Go Conference 2018 Autumn Sponsor Session #4 Nov 25, 2018 井本 裕 ゲーム・エンターテインメント事業本部DeNA Co., Ltd.
main() { var b []byte = []byte{1} h := fnv.New32() go func() { for { h.Write(b) } }() // Gosched yields the processor, allowing other goroutines to run runtime.Gosched() fmt.Println("GC Start") runtime.GC() fmt.Println("GC Done") } $ go run main.go GC Start - GC は全 goroutine がプロセッサーを明け渡 すまで、ブロックする
詳しくは Goroutines: the dark side of the runtime - Roberto Clapis - https://talks.godoc.org/github.com/empijei/gotalks/gophercon.slide#1 - (弊社の国際学会派遣制度を利用し、golab.io 2018 の現地で参加して聞いていました) 12
(net.TCPConn) - go1.11でのアップデート - net.TCPConn - “The net package now automatically uses the splice system call on Linux when copying data between TCP connections in TCPConn.ReadFrom, as called by io.Copy. The result is faster, more efficient TCP proxying.” - https://golang.org/doc/go1.11 - https://github.com/golang/go/issues/10948 - “splice(2) は、カーネルアドレス空間とユーザーアドレス空間との間のコピーを伴わずに、 2 つのファ イルディスクリプター間でデータの移動を行う。” - https://linuxjm.osdn.jp/html/LDP_man-pages/man2/splice.2.html - TCP プロキシ がより早く、効率的になる 22 func proxy(upstream, downstream net.TCPConn) { defer downstream.Close() defer upstream.Close() go io.Copy(upstream, downstream) io.Copy(downstream, upstream) // using splice(2) }
AndAppにおけるGCP活用事例 - https://www.slideshare.net/dena_tech/andappgcp-88366004 - Go 1.11 Release Notes - https://golang.org/doc/go1.11 - Goroutines: the dark side of the runtime - Roberto Clapis - https://talks.godoc.org/github.com/empijei/gotalks/gophercon.slide#1 - Effective Streaming in Golang - https://speakerdeck.com/avvmoto/effective-streaming-in-golang - The Go scheduler - https://morsmachine.dk/go-scheduler - io - https://golang.org/pkg/io/ - Some codes in this slide is licensed under a BSD License (https://golang.org/LICENSE). 25