首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sanic web框架性能

Sanic web框架性能
EN

Stack Overflow用户
提问于 2020-02-13 18:44:07
回答 1查看 692关注 0票数 2

我有一个关于sanic / asyncpg性能的问题要问。

在测试过程中,奇怪的事情不断发生(可能是设计出来的)。

首先,让我解释一下测试过程。这很简单。

我使用locust通过设置最大用户数来尽可能多地推送服务器。

测试脚本为:

代码语言:javascript
复制
from locust import HttpLocust, TaskSet, task, between


class UserActions(TaskSet):
    @task(1)
    def test_point_1(self):
        self.client.get(
            '/json_1',
            headers={'Content-Type': 'application/json'}
        )

    @task(2)
    def test_point_2(self):
        self.client.get(
            '/json_2',
            headers={'Content-Type': 'application/json'}
        )


class ApplicationUser(HttpLocust):
    task_set = UserActions
    wait_time = between(0, 0)

它用于测试以下代码。注意asyncpg正在调用potgresql睡眠函数来模拟负载:

代码语言:javascript
复制
import asyncio
import uvloop
from asyncpg import create_pool
from sanic import Sanic, response
from sanic.log import logger
import aiotask_context as context

app = Sanic(__name__)

DATABASE = {
    'type': 'postgresql',
    'host': '127.0.0.1',
    'user': 'test_user',
    'port': '5432',
    'password': 'test_password',
    'database': 'test_database'
}

conn_uri = '{0}://{1}:{2}@{3}:{4}/{5}'.format(
            'postgres',
            DATABASE['user'], DATABASE['password'], DATABASE['host'],
            DATABASE['port'], DATABASE['database'])


@app.route("/json_1")
async def handler_json_1(request):
    async with request.app.pg.acquire() as connection:
        await connection.fetchrow('SELECT pg_sleep(0.85);')
    return response.json({"foo": "bar"})


@app.route("/json_2")
async def handler_json_2(request):
    async with request.app.pg.acquire() as connection:
        await connection.fetchrow('SELECT pg_sleep(0.2);')
    return response.json({"foo": "bar"})


@app.listener("before_server_start")
async def listener_before_server_start(*args, **kwargs):
    try:

        pg_pool = await create_pool(
            conn_uri, min_size=2, max_size=10,
            server_settings={'application_name': 'test_backend'})
        app.pg = pg_pool

    except Exception as bss_error:
        logger.error('before_server_start_test erred with :{}'.format(bss_error))
        app.pg = None


@app.listener("after_server_start")
async def listener_after_server_start(*args, **kwargs):
    # print("after_server_start")
    pass


@app.listener("before_server_stop")
async def listener_before_server_stop(*args, **kwargs):
    # print("before_server_stop")
    pass


@app.listener("after_server_stop")
async def listener_after_server_stop(*args, **kwargs):
    # print("after_server_stop")
    pass


if __name__ == '__main__':
    asyncio.set_event_loop(uvloop.new_event_loop())
    server = app.create_server(host="0.0.0.0", port=8282, return_asyncio_server=True)
    loop = asyncio.get_event_loop()
    loop.set_task_factory(context.task_factory)
    task = asyncio.ensure_future(server)
    try:
        loop.run_forever()
    except Exception as lerr:
        logger.error('Loop run error: {}'.format(lerr))
        loop.stop()

问题是,在随机时间量之后,服务器对cca变得无响应(不返回503或任何其他代码)。60秒进程也会挂起(我可以用ps aux看到它,但CTRL+C不能杀死它。)

这可能是有问题的,因为它很难检测,也很难确定我们可以向服务器发送请求的速率。

这会不会是配置(sanic/asyncpg)的问题?

设置nginx / sanic请求超时是绕过这个问题的唯一选择吗?

EN

回答 1

Stack Overflow用户

发布于 2020-02-19 22:42:13

您的aiopg池限制为10个连接。因此,每次最多10个请求,每个请求需要0.2秒,您的最大可能负载是1秒/ 0.2秒* 10池大小= 50 RPS。在此之后,所有传入的请求都将等待连接,而要服务的请求队列的增长速度将远远超过您的服务能力,并且您的服务器将变得无响应。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60205945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档