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
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Unsuck your backbone
ammeep
672
58k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
240
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
1.7k
The Cult of Friendly URLs
andyhume
79
6.9k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
420
We Have a Design System, Now What?
morganepeng
55
8.2k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
210
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
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