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

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

Avatar for aroon aroon
April 23, 2025
6

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