Web压力测试,pg遇到异常,5432端口上的TCP/IP连接?

问题描述 投票:0回答:1

环境: 姜戈4.1.3 drf 3.14.0 psycopg2 2.9.5 postgres 14.7 枪角兽21.2.0 eventlet 0.33.3

我对django框架进行了基本的压力测试,我的View如下

class HealthCheckView(APIView):
    def get(self, request, *args, **kwargs):
        try:
            Role.objects.filter().count()
        except Exception as e:
            return Response(status=499)
        return Response(status=status.HTTP_200_OK)

我使用以下命令来启动Web服务:

gunicorn myapp.wsgi:应用程序-c myapp/settings/gunicorn.conf.py

gunicorn.conf.py内容如下:

bind = f'0.0.0.0:{GUNICORN_PORT}'
worker_class = 'eventlet'
workers = 6

然后我使用ab工具进行压力测试:

ab -n 10000 -c 500 https://10.30.7.7/api/v1/healthz/

并发数为500时,效果不错。

当我继续增加并发请求数时,有些无法连接数据库。

django.db.utils.OperationalError: could not connect to server: Cannot assign requested address
        Is the server running on host "10.30.7.7" and accepting
        TCP/IP connections on port 5432?

数据库配置文件如下:

max_connections = 4096
shared_buffers = 16GB
effective_cache_size = 48GB
maintenance_work_mem = 2GB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 100
random_page_cost = 4
effective_io_concurrency = 2
work_mem = 1MB
huge_pages = try
min_wal_size = 1GB
max_wal_size = 4GB
max_worker_processes = 20
max_parallel_workers_per_gather = 4
max_parallel_workers = 20
max_parallel_maintenance_workers = 4

我该如何进行调查?

减少并发请求数可以避免出现问题,但500个并发请求显然不多。 同时我也尝试过使用Docker部署数据库以及使用源码编译安装数据库。并发高的时候就会出现这个问题。

django postgresql django-rest-framework stress-testing python-3.11
1个回答
0
投票

也许我暂时解决了这个问题。

我更改了Django的数据库连接的有效期。

为 Django 添加 CONN_MAX_AGE

看来是频繁创建和销毁连接导致的。

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': POSTGRES_DB,
    'USER': POSTGRES_USER,
    'PASSWORD': POSTGRES_PASSWORD,
    'HOST': POSTGRES_HOST,
    'PORT': POSTGRES_PORT,
    'CONN_MAX_AGE': 600}
}

1.gunicorn + eventlet(10个工人)

需要创建和删除大量 CNC 连接。

数量在几百到几千之间波动。

这种方法仍然会导致出现上述错误。

2.gunicorn + gthread(20个工人,40个线程)

已创建有限数量的数据库连接。

最大连接数 = 工作人员 * 线程数 = 800

这个方法效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.