Upgrade to Pro — share decks privately, control downloads, hide ads and more …

goにおける コネクションプールの仕組み を軽く掘って見た

Avatar for aroon aroon
April 23, 2025
14

goにおける コネクションプールの仕組み を軽く掘って見た

Avatar for aroon

aroon

April 23, 2025
Tweet

Transcript

  1. 確立したコネクションをたくさん保持できるの? socket() creates an endpoint for communication and returns a

    file descriptor that refers to that endpoint. (linux man pageより引用) → ソケットAPIを利用するとファイルディスクリプタが生 成される
  2. Goのプールの正体 • sql.DB の内部: ◦ freeConn []*driverConn ◦ connRequests map[uint64]chan

    connRequest • conn():空いてる freeConn から取る • なければ connRequests に入れて待たせる
  3. フロー • sql.Open() → 構造体初期化 • Query() → conn() 呼び出し

    → 接続取得 • クエリ終わったら releaseConn() でプールに返す
  4. 実装で見たポイント • 接続は sql.Open() 時点では張らない(lazy) • conn() → 既存 or

    新規接続取得 • releaseConn() → プールに戻す • goroutine + channel + sync.Mutex で制御されてる
  5. 設計Tips(So What) • sql.Open() 毎回やるのは非推奨 ◦ init() メソッドを作成して1回だけ初期化するとか • SetMaxOpenConns()

    / SetMaxIdleConns() をチューニングしない とRDSの負荷がすごいことなるかも • lambdaではなくec2,ecsとかで制限しない場合はulimit -n の上限に 達すると、それ以上の接続・ファイルアクセスができずサーバーごと 動かなくなるかも
  6. まとめ • コネクションプール = OSレベルではFDの集合 • Goでは freeConn, connRequests で管理

    • 実装を読むことでコネクションプールに対する理解が 深まった
  7. 最後に・・・ • お茶を飲んでいるGopherの画像は、issanさんによってデザイ ンされ、CC0ライセンスで公開されています。 • カバー画像のGopherは、Renée Frenchさんによりデザインさ れ、CC BY 4.0ライセンスで配布されています。

    • 公式リポジトリ: golang/doc/gopher 本資料では、GoコミュニティにおけるGopherアートワークを活 用させていただきました。作者様、ライセンスに感謝します。
  8. 参考文献 - 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