如何从asyncpg库连接到pgbouncer?

2024-05-16 05:19:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用asyncpg实现了pgbouncer,还实现了asyncpg本机池实现。虽然我能够通过pgbouncer发送许多并发请求,但对于1000个并发请求,我的p95接近8秒,而对于asyncpg本机池实现,p95略高于1.5秒

为什么会有这么大的性能差异?这是从asyncpg连接到pgbouncer的正确方法吗

代码示例:

  1. 使用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()
  1. 本机异步池实现
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

Tags: testloopdbasynctimedefpasswordawait