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
aroon
April 23, 2025
250
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 GitHub (no longer) Works
holman
316
150k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
210
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
500
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
680
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
480
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
RailsConf 2023
tenderlove
30
1.5k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
970
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
470
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