[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H0DM8FR7B1C1YSFECWXH7M":3,"skill-same:01M6H0DM8FR7B1C1YSFECWXH7M":80},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":16,"sourceHtmlUrl":17,"categories":18,"keywords":24,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":46,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":49,"ownerDescription":50,"updatedAt":51,"install":52,"resources":65},"01M6H0DM8FR7B1C1YSFECWXH7M","size-a-connection-pool-to-the-database-limit",null,"Use when many app instances exhaust the database's connection slots — size each pool from the database's real ceiling, not from request concurrency.","jiayaoqijia\u002Fcryptoskill","jiayaoqijia","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1453879?v=4","01M6GMYTX7Q7S504VC6E756ENR","YQ","01M6GMYV1QKJ1CC75MTTGT9PR0",81,"MIT","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-size-a-connection-pool-to-the-database-limit\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-size-a-connection-pool-to-the-database-limit\u002FSKILL.md",[19],{"categoryNo":20,"categoryName":21,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[25,26,27,28,29,30,31,32,33,34,35,36,37],"database","connection","limit","size","pool","size a connection pool to the database limit","concurrency","use","instances","app","slots","request","when","2026-11-10 10:12:30",false,"---\nname: size-a-connection-pool-to-the-database-limit\ndescription: Use when many app instances exhaust the database's connection slots — size each pool from the database's real ceiling, not from request concurrency.\n---\n\n# Size a connection pool to the database limit\n\nEvery app process that opens N connections multiplies against every replica. Ten pods at pool=20 is 200 connections against a database that serves far fewer useful ones. Size the pool from the database's capacity and keep the fleet total under `max_connections`.\n\n## Procedure\n\n1. Read the ceiling and the current usage:\n```sql\nSHOW max_connections;                    -- e.g. 100\nSELECT count(*) FROM pg_stat_activity;\n```\n   Count the three superuser-reserved slots and admin sessions as unavailable.\n2. Budget across all clients: `total_pool = max_connections - reserves`. Divide by the number of app instances to get the per-instance size.\n3. Use the classic sizing rule as the useful target, not the maximum: `connections ≈ (cores * 2) + effective_spindle_count`. Past ~4x cores, extra connections thrash and raise latency.\n4. Set an application pool with a hard maximum and a bounded wait:\n```python\nengine = create_engine(url, pool_size=10, max_overflow=5, pool_timeout=5, pool_recycle=1800)\n```\n   `pool_timeout` must be shorter than the request timeout so a starved request fails fast instead of hanging.\n5. Put PgBouncer in `transaction` mode in front when the app opens many more connections than the database serves; the app then holds cheap connections to the pooler.\n6. Watch both failure modes: `pg_stat_activity` at `max_connections` (exhaustion) and latency rising with connection count (thrash). Both reduce throughput.\n7. Set `statement_timeout` and `idle_in_transaction_session_timeout` so a leaked-in-transaction connection is reclaimed rather than held.\n\n## Pitfalls\n\n- Sizing the pool from peak request concurrency; the database, not the app, is the bottleneck.\n- Leaving `pool_timeout` unset so requests queue indefinitely and every client times out together.\n- PgBouncer in `session` mode, which pins a server connection per client and defeats the purpose.\n- `pool_recycle` longer than the DB or proxy idle timeout, handing out dead sockets.\n- A serverless function each opening its own pool; use RDS Proxy or a shared pooler.\n- Counting connections only on the primary when read replicas have their own lower limits.\n\n## Verification\n\n    psql -c \"SELECT state, count(*) FROM pg_stat_activity GROUP BY state;\"\n    psql -c \"SHOW max_connections;\"\n    # pass: total connections \u003C max_connections - 3, no 'idle in transaction' pileup\n\nReport per-instance pool size, instance count, the computed fleet total against `max_connections`, and `pg_stat_activity` by state under load.\n","# Size a connection pool to the database limit\n\nEvery app process that opens N connections multiplies against every replica. Ten pods at pool=20 is 200 connections against a database that serves far fewer useful ones. Size the pool from the database's capacity and keep the fleet total under `max_connections`.\n\n## Procedure\n\n1. Read the ceiling and the current usage:\n```sql\nSHOW max_connections;                    -- e.g. 100\nSELECT count(*) FROM pg_stat_activity;\n```\n   Count the three superuser-reserved slots and admin sessions as unavailable.\n2. Budget across all clients: `total_pool = max_connections - reserves`. Divide by the number of app instances to get the per-instance size.\n3. Use the classic sizing rule as the useful target, not the maximum: `connections ≈ (cores * 2) + effective_spindle_count`. Past ~4x cores, extra connections thrash and raise latency.\n4. Set an application pool with a hard maximum and a bounded wait:\n```python\nengine = create_engine(url, pool_size=10, max_overflow=5, pool_timeout=5, pool_recycle=1800)\n```\n   `pool_timeout` must be shorter than the request timeout so a starved request fails fast instead of hanging.\n5. Put PgBouncer in `transaction` mode in front when the app opens many more connections than the database serves; the app then holds cheap connections to the pooler.\n6. Watch both failure modes: `pg_stat_activity` at `max_connections` (exhaustion) and latency rising with connection count (thrash). Both reduce throughput.\n7. Set `statement_timeout` and `idle_in_transaction_session_timeout` so a leaked-in-transaction connection is reclaimed rather than held.\n\n## Pitfalls\n\n- Sizing the pool from peak request concurrency; the database, not the app, is the bottleneck.\n- Leaving `pool_timeout` unset so requests queue indefinitely and every client times out together.\n- PgBouncer in `session` mode, which pins a server connection per client and defeats the purpose.\n- `pool_recycle` longer than the DB or proxy idle timeout, handing out dead sockets.\n- A serverless function each opening its own pool; use RDS Proxy or a shared pooler.\n- Counting connections only on the primary when read replicas have their own lower limits.\n\n## Verification\n\n    psql -c \"SELECT state, count(*) FROM pg_stat_activity GROUP BY state;\"\n    psql -c \"SHOW max_connections;\"\n    # pass: total connections \u003C max_connections - 3, no 'idle in transaction' pileup\n\nReport per-instance pool size, instance count, the computed fleet total against `max_connections`, and `pg_stat_activity` by state under load.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-size-a-connection-pool-to-the-database-limit",17,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia","https:\u002F\u002Feth2030.com","Hardcore infra. Building @alt-research and applied cryptography.","2026-11-15 02:28:10",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill size-a-connection-pool-to-the-database-limit",{"tool":58,"command":59},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill size-a-connection-pool-to-the-database-limit",{"tool":61,"command":62},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill size-a-connection-pool-to-the-database-limit","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-size-a-connection-pool-to-the-database-limit\u002FSKILL.md",true,[66,70,76],{"path":67,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"SOURCE.md","REFERENCE","参考文档",370,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-size-a-connection-pool-to-the-database-limit\u002FSOURCE.md",{"path":77,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":78,"sourceHtmlUrl":79},"TRUST.auto.yaml",2217,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-size-a-connection-pool-to-the-database-limit\u002FTRUST.auto.yaml",[81,108,131,149,162,172],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":85,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":38},"01M712C436EQYE43342Q4E7GG1","recipe-performance","Diagnose a specific MetaMask user flow's real-app performance and Sentry critical-user-flow telemetry with deterministic mm-harness recipes. Use for CUF boundaries, cold\u002Fwarm\u002Fbackground-resume behavior, latency regressions, lifecycle tags, duplicate or blocking network requests, long tasks, layout\u002Fpaint cost, screen redraws, React rerenders, or browser trace analysis where tests alone cannot prove the real app.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FSKILL.md",[],[89,90,91,92,93,94,34,95,96,97,98,99,100,101,102,103,104,105,106,107],"performance","recipe performance","recipe","mm","sentry","harness","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":112,"licenseFileUrl":113,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":38},"01M70XT2F8A5CQZ81JBP98KSW3","mexc-spot-websocket","MEXC Spot WebSocket workflows for public streams, protobuf handling, depth maintenance, listen keys, and private streams without exposing API keys.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FSKILL.md",[],[117,118,119,120,121,122,123,124,125,126,127,128,129,130],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":112,"licenseFileUrl":135,"sourceHtmlUrl":136,"categories":137,"keywords":138,"publishedAt":38},"01M70XT0MBXN3WZY1BKN0CPNKR","mexc-spot-rest","MEXC Spot REST workflows for public data, signed account requests, orders, wallet\u002Fadmin actions, and secure signing without exposing API keys.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FSKILL.md",[],[139,118,140,141,142,143,144,128,127,126,145,146,147,122,148,121,120],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data","orders",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":112,"licenseFileUrl":153,"sourceHtmlUrl":154,"categories":155,"keywords":156,"publishedAt":38},"01M70XSYSVZ2N0N91XCAR2CAK0","mexc-futures-websocket","MEXC Futures WebSocket workflows for public streams, private account\u002Forder\u002Fposition streams, ping\u002Fpong, subscriptions, and depth maintenance.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FSKILL.md",[],[157,158,119,159,160,129,127,161,125,124,122,121],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":163,"name":164,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":165,"sourceHtmlUrl":166,"categories":167,"keywords":168,"publishedAt":38},"01M6H0ZWHVE5W04WG2DKQE2SQC","0xklen-version-and-refresh-sanctions-lists","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FSKILL.md",[],[169,170,171],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":173,"name":174,"nameZh":6,"description":175,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":176,"sourceHtmlUrl":177,"categories":178,"keywords":179,"publishedAt":38},"01M6H0Z28Q3R8J0S799GJQWXM3","verify-tests-cover-changed-lines","Use when a PR adds code that the existing suite may not exercise. Measures patch coverage — the share of newly changed lines hit by tests — before approving.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FSKILL.md",[],[180,181,182,183,184,185,186,32,187,188,189],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]