Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
goにおける コネクションプールの仕組み を軽く掘って見た
Search
aroon
April 23, 2025
270
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
goにおける コネクションプールの仕組み を軽く掘って見た
aroon
April 23, 2025
More Decks by aroon
See All by aroon
ちょこっとdive gorm.DB.Updates()
aronokuyama
0
200
Featured
See All Featured
Balancing Empowerment & Direction
lara
6
1.3k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
530
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Optimising Largest Contentful Paint
csswizardry
37
4k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Rails Girls Zürich Keynote
gr2m
96
14k
GraphQLとの向き合い方2022年版
quramy
50
15k
From π to Pie charts
rasagy
1
380
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Scaling GitHub
holman
464
140k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Transcript
goにおける コネクションプールの仕組み を軽く掘って見た aroon
前提 • MySQLとLinuxOSが前提です
背景と問題意識(Why) • Lambda + RDS Proxy使っててふと思った。 • 「え、そもそもGoってコネクションプールどうやってん の?」 ◦
RDSProxy使う以前にコネクションプールよくわ かってないのモヤる
目的(Goal) • Goのコネクションプールがどう動いてるかを • 実際のコードレベルで把握して • 実務での設計判断(最大接続数・アイドル数の調整) に役立てる!
コネクションプールとは? • 一度確立したDB接続をプール(再利用)する仕組み • 疑問: ◦ 接続って何? ◦ どうやって保持してんの? ◦
いっぱい持つと何が起きる?
「接続」とは何か? • MySQLへの接続 = TCP ◦ port: 3306 ◦ 認証(ユーザー/パスワード)
• 認証完了 = コネクション確立!
参考:mysqlクライアントとサーバーの接続フロー MySQL SourceCode DocumentationのConnection Phaseより引用 https://dev.mysql.com/doc/dev/mysql-server/9.1.0/page_protocol_connection_phase.html
確立したコネクションを保持するとは? • TCPの3ウェイハンドシェイクが完了した後、MySQLプロトコル 上でユーザー名・パスワードなどの認証処理が行われる • 認証に成功すれば、MySQLとのセッションが確立された状態 になる • その後、クライアント or
サーバーからFINを送らない限り、接 続は維持される
確立したコネクションをたくさん保持できるの? その前に・・・ • TCPコネクションはどんな手段で(HOW)確立するの か? ◦ 答えは「POSIXソケットAPIを使う」
確立したコネクションをたくさん保持できるの? socket() creates an endpoint for communication and returns a
file descriptor that refers to that endpoint. (linux man pageより引用) → ソケットAPIを利用するとファイルディスクリプタが生 成される
つまり、OSレイヤで何が起きてる? • socket() → ファイルディスクリプタ (FD) を生成 • FDを通じてプロセスがTCP通信する •
コネクションが多い = FDが多い
FDが多すぎると? • OSリソース制限(ulimit)に達する(だろう) ◦ ulimit -n とかで確認できます • メモリ・CPU消費 • 開きっぱなしのソケットがたまって事故る
Goのプールの正体 • sql.DB の内部: ◦ freeConn []*driverConn ◦ connRequests map[uint64]chan
connRequest • conn():空いてる freeConn から取る • なければ connRequests に入れて待たせる
フロー • sql.Open() → 構造体初期化 • Query() → conn() 呼び出し
→ 接続取得 • クエリ終わったら releaseConn() でプールに返す
実装で見たポイント • 接続は sql.Open() 時点では張らない(lazy) • conn() → 既存 or
新規接続取得 • releaseConn() → プールに戻す • goroutine + channel + sync.Mutex で制御されてる
設計Tips(So What) • sql.Open() 毎回やるのは非推奨 ◦ init() メソッドを作成して1回だけ初期化するとか • SetMaxOpenConns()
/ SetMaxIdleConns() をチューニングしない とRDSの負荷がすごいことなるかも • lambdaではなくec2,ecsとかで制限しない場合はulimit -n の上限に 達すると、それ以上の接続・ファイルアクセスができずサーバーごと 動かなくなるかも
まとめ • コネクションプール = OSレベルではFDの集合 • Goでは freeConn, connRequests で管理
• 実装を読むことでコネクションプールに対する理解が 深まった
最後に・・・ • お茶を飲んでいるGopherの画像は、issanさんによってデザイ ンされ、CC0ライセンスで公開されています。 • カバー画像のGopherは、Renée Frenchさんによりデザインさ れ、CC BY 4.0ライセンスで配布されています。
• 公式リポジトリ: golang/doc/gopher 本資料では、GoコミュニティにおけるGopherアートワークを活 用させていただきました。作者様、ライセンスに感謝します。
参考文献 - mita2db. “MySQL Connection Pooling と Persistent Connections はチョット違うという話
” .はてなブロ グ. 2020-08-02. https://mita2db.hateblo.jp/entry/2020/08/02/162024. 2025-03-12 - 不明. “Managing connections”. go doc. 不明. https://go.dev/doc/database/manage-connections. 2025-03-12 - Michael Kerrisk. “socket(2) — Linux manual page”. man7.org. 2024-07-23. https://man7.org/linux/man-pages/man2/socket.2.html 2025-03-16 - 不明. “MySQL 9.1.0 Source Code Documentation Connection Phase”. “MySQL 9.1.0 Source Code Documentation”. 不明. https://dev.mysql.com/doc/dev/mysql-server/9.1.0/page_protocol_connection_phase.html 2025-03-19 - Kosei Moriyama.”Go の sql.DB がコネクションプールを管理する仕組み ”. “Please Sleep”. 2020-06-30. https://please-sleep.cou929.nu/go-sql-db-connection-pool.html 2025-03-20
cloneして読んだコード • go-sql-driver/mysql https://github.com/go-sql-driver/mysql • database/go go version go1.22.5 darwin/arm64