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
240
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
How to Ace a Technical Interview
jacobian
281
24k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
230
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
230
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Docker and Python
trallard
47
4k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
650
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