env:Django 4.1.3 drf 3.14.0 psycopg2 2.9.5 postgres 14.7 gunicorn 21.2.0 eventlet 0.33.3
我对django框架进行了基本的压力测试,我的观点如下
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:application -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部署数据库,并使用源代码编译和安装数据库。当并发性很高时会出现此问题。
1条答案
按热度按时间x759pob21#
也许我暂时解决了这个问题。
我更改了Django数据库连接的有效时间。
为Django添加CONN_MAX_AGE。
这似乎是由于频繁的创建和销毁连接造成的。
1.gunicorn + eventlet(10 worker)
要创建和删除的大量连接。
数量在几百到几千之间波动。
这种方法仍然会导致上述错误的发生。
2.gunicorn + gthread(20 worker,40 threads)
已创建有限数量的数据库连接。
max_connections = worker * threads = 800
这个方法很有效.