Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
goにおける コネクションプールの仕組み を軽く掘って見た
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
aroon
April 23, 2025
230
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
190
Featured
See All Featured
The Curious Case for Waylosing
cassininazir
1
410
The browser strikes back
jonoalderson
0
1.3k
Six Lessons from altMBA
skipperchong
29
4.3k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
400
Building AI with AI
inesmontani
PRO
1
1.1k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
170
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
170
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
The SEO Collaboration Effect
kristinabergwall1
1
490
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