【问题标题】:aiohttp: how to best mitigate "OSError: Too many open files"aiohttp:如何最好地缓解“OSError:打开的文件太多”
【发布时间】:2018-12-02 07:39:21
【问题描述】:

我有一个带有 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服务器一次尝试处理的请求数量进行限制,让其他服务器排队等待?

【问题讨论】:

    标签: python-3.x python-asyncio aiohttp


    【解决方案1】:

    aiohttp接受所有传入的连接,这个好像我们也改不了,但是aiohttp前面的反向代理可以处理。

    例如Nginx 有a module

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多