aiohttp: how to best mitigate "OSError: Too many open files"
aiohttp: how to best mitigate "OSError: Too many open files"
我有一个带有 HTTP 端点的 aiohttp (3.4.4) 服务器,它将文件作为输入(客户端发出多部分表单 POST)。我有一个测试客户端,它使 10K POSTs 到端点。服务器端点看起来像这样:
async def event_handler(request):
files = await request.post()
file_field = files['file_from_client']
file_contents = file_field.file.read()
间歇性地,当我的端点尝试查看 POST 负载中提供的文件时,我收到以下异常:
"~/venv/python3.7/site-packages/aiohttp/web_protocol.py", line 390, in start
"~/venv/python3.7/site-packages/aiohttp/web_app.py", line 366, in _handle
"~/projects/my_project/controllers.py", line 58, in event_handler
"~/venv/python3.7/site-packages/aiohttp/web_request.py", line 585, in post
"~/venv/python3.7/tempfile.py", line 618, in TemporaryFile
"~/venv/python3.7/tempfile.py", line 258, in _mkstemp_inner
OSError: [Errno 24] Too many open files: '/tmp/tmpjnt4eu_k'
(注意:event_handler 的第 58 行是 "await request.post()" 行)
我知道是什么原因造成的。我的进程的文件描述符限制设置为默认值 1024,我的客户端向我的服务器发出的请求超过了该限制。我的问题是我不确定最好的服务器缓解措施是什么。
This article提到了这个问题,有两个可能的解决方案:增加服务器进程的文件描述符的数量,或者在客户端引入信号量以确保永远不会向服务器发送许多请求.后者对于测试问题很好,但我不控制生产中的客户端。前者很容易完成,并减轻了这个特定问题,但它似乎只是提高了上限 - 如果有足够多的请求,这个问题似乎仍然可能发生。
是否可以对一个 aiohttp 服务器尝试同时处理的请求数量施加限制,并让其他服务器排队等候?
aiohttp 接受所有传入的连接,看来我们无法改变这一点,但是 aiohttp 前面的反向代理可以处理它。
例如Nginx 有 a module 。
我有一个带有 HTTP 端点的 aiohttp (3.4.4) 服务器,它将文件作为输入(客户端发出多部分表单 POST)。我有一个测试客户端,它使 10K POSTs 到端点。服务器端点看起来像这样:
async def event_handler(request):
files = await request.post()
file_field = files['file_from_client']
file_contents = file_field.file.read()
间歇性地,当我的端点尝试查看 POST 负载中提供的文件时,我收到以下异常:
"~/venv/python3.7/site-packages/aiohttp/web_protocol.py", line 390, in start
"~/venv/python3.7/site-packages/aiohttp/web_app.py", line 366, in _handle
"~/projects/my_project/controllers.py", line 58, in event_handler
"~/venv/python3.7/site-packages/aiohttp/web_request.py", line 585, in post
"~/venv/python3.7/tempfile.py", line 618, in TemporaryFile
"~/venv/python3.7/tempfile.py", line 258, in _mkstemp_inner
OSError: [Errno 24] Too many open files: '/tmp/tmpjnt4eu_k'
(注意:event_handler 的第 58 行是 "await request.post()" 行)
我知道是什么原因造成的。我的进程的文件描述符限制设置为默认值 1024,我的客户端向我的服务器发出的请求超过了该限制。我的问题是我不确定最好的服务器缓解措施是什么。
This article提到了这个问题,有两个可能的解决方案:增加服务器进程的文件描述符的数量,或者在客户端引入信号量以确保永远不会向服务器发送许多请求.后者对于测试问题很好,但我不控制生产中的客户端。前者很容易完成,并减轻了这个特定问题,但它似乎只是提高了上限 - 如果有足够多的请求,这个问题似乎仍然可能发生。
是否可以对一个 aiohttp 服务器尝试同时处理的请求数量施加限制,并让其他服务器排队等候?
aiohttp 接受所有传入的连接,看来我们无法改变这一点,但是 aiohttp 前面的反向代理可以处理它。
例如Nginx 有 a module 。