我有一台带有HTTP端点的aiohttp(3.4.4)服务器,该端点将文件作为输入(客户端发出多部分形式的POST)。我有一个测试客户端,可以向端点进行10K POST。服务器端点看起来像这样:
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服务器立即尝试处理的请求数量,并使其他服务器排队等待?