python - 如何从 asyncpg 库连接到 pgbouncer?
问题描述
我已经使用 asyncpg 实现了 pgbouncer 以及 asyncpg 本机池实现。虽然我可以通过 pgbouncer 发送许多并发请求,但是对于 1000 个并发请求,我的 p95 接近 8 秒,而与 asyncpg 本机池实现一样,p95 仅高于 1.5 秒。
为什么会有这么大的性能差异?这是从 asyncpg 连接到 pgbouncer 的正确方法吗?
代码示例:
- 使用 asyncpg 和 pgbouncer:
pgbouncer_creds = {
"user": "myuser",
"password": "password",
"host": "localhost",
"port": "16432",
"database": "db1"
}
async def test():
async def db():
start = time.time()
connection = await asyncpg.connect(**pgbouncer_creds)
await connection.fetchrow("SELECT * FROM test WHERE id=$1;", "5db03111822547b59c3edaa324e0f829")
await connection.close()
end = time.time()
times.append((end - start))
tasks = [db() for _ in range(1000)]
await asyncio.gather(*tasks)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(test())
loop.close()
- 本机 asyncp 池实现
creds = {
"user": "myuser",
"password": "password",
"host": "*.*.*.*",
"port": "5432",
"database": "db1"
}
async def test():
pool = await asyncpg.create_pool(**creds, max_size=100, min_size=100)
async def db():
start = time.time()
async with pool.acquire() as connection:
await connection.fetchrow("SELECT * FROM test WHERE id=$1;", "5db03111822547b59c3edaa324e0f829")
end = time.time()
times.append((end - start))
tasks = [db() for _ in range(1000)]
await asyncio.gather(*tasks)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(test())
loop.close()
pgbouncer.ini 文件:
[databases]
db1 = host=*.*.*.* dbname=db1
[pgbouncer]
listen_addr = *
listen_port = 16432
auth_type = plain
auth_file = userlist.txt
default_pool_size = 100
max_db_connections = 200
max_client_conn = 10000
max_user_connections = 200
pool_mode = session
解决方案
推荐阅读
- php - 使用 xpath 从页面上的所有 H2 标记中获取 H2 文本和 href 值?
- ruby - “[]”在以下上下文中代表什么?
- amazon-web-services - Boto3 AWS 查找有权访问类型资源的人员
- javascript - Lodash toString() 和 JavaScript 原生的 toString() 方法有什么区别?
- python - 将文本表结构转换为列表
- android - 使用 Magisk su 二进制列出 /data/data 的问题
- sql - 如何获取特定数字出现的次数
- javascript - 服务器错误类型错误:无法读取未定义的属性“地图”
- javascript - 用几个点替换多 HTML 文本的结尾
- javascript - 如何避免cypress中的重复代码