IOError:设备上没有剩余空间 - 哪个设备?

ABM*_*ABM 7 python werkzeug flask

我正在将一个小文件(8.5 Mb)上传到烧瓶测试服务器.

文件完成上传后,服务器将报告:

    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/wtforms/form.py", 
        line 212, in __call__
    return type.__call__(cls, *args, **kwargs)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/flask_wtf/form.py", line 49, in __init__
        formdata = request.form
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/local.py", 
        line 338, in __getattr__
    return getattr(self._get_current_object(), name)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/utils.py", 
         line 71, in __get__
    value = self.func(obj)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/wrappers.py", 
         line 484, in form
    self._load_form_data()
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/flask/wrappers.py", 
        line 165, in _load_form_data
    RequestBase._load_form_data(self)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/wrappers.py", 
        line 356, in _load_form_data
    mimetype, content_length, options)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/formparser.py", 
        line 193, in parse
    content_length, options)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/formparser.py",
        line 99, in wrapper
    return f(self, stream, *args, **kwargs)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/formparser.py",
        line 210, in _parse_multipart
    form, files = parser.parse(stream, boundary, content_length)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/formparser.py", 
        line 520, in parse
    return self.cls(form), self.cls(files)
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/datastructures.py", 
        line 373, in __init__
    for key, value in mapping or ():
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/formparser.py", 
        line 518, in <genexpr>
    form = (p[1] for p in formstream if p[0] == 'form')
    File "/home/ubuntu/.virtualenvs/eco_app/lib/python2.7/site-packages/werkzeug/formparser.py", 
        line 494, in parse_parts
        _write(ell)
IOError: [Errno 28] No space left on device
Run Code Online (Sandbox Code Playgroud)

现在,服务器有足够的可用空间 - 超过3Gb.

我查看了Werkzeug github repo,试图找到Werkzeug试图写入的位置,但无法追踪它.

我还检查了tempfile.gettempdir(),它将/ var/tmp作为临时文件目录,但是这个文件夹实际上是空的,所以我认为这不是创建问题的位置.

如何找到没有空间的设备?

ABM*_*ABM 14

@Tom Hunt的评论是在正确的轨道上.

这个unix SE答案解释了发生什么.

作为防止低磁盘空间的保护,如果根分区用尽磁盘空间,一些守护进程会自动用ram磁盘"遮蔽"当前/ tmp/dir.遗憾的是,一旦足够的磁盘空间再次释放,就不会自动恢复该过程.

我卸载/ tmp目录并遵循Nitesh的建议:

sudo umount /tmp
sudo echo 'MINTMPKB=0' > sudo /etc/default/mountoverflowtmp
Run Code Online (Sandbox Code Playgroud)

现在上传工作正常.

  • 在盲目应用此解决方案之前,有没有办法检查这是否真的是问题? (3认同)

Tom*_*unt 6

如果您可以在服务器上获取shell,请尝试键入df -h并查找显示Use%100%或Avail小于文件大小的任何条目.

  • 在这种情况下,最可能的情况是服务器通过某个中间步骤将数据存储在/ tmp上.如果可以,请增加该卷的大小; 如果没有,也许可以更彻底地调查数据路径,看看是否有办法改变它.在某些服务器上,/ var/tmp和/ tmp是相同的,通过绑定挂载,符号链接或其他机制; 检查是否是这种情况. (3认同)

Mar*_*ers 6

Werkzeug使用临时目录存储超过特定大小的文件tempfile.TemporaryFile(),但考虑到这些文件是为了安全而取消链接的.您不会在目录中看到它们.tempfile.gettempdir()是确定用于此目录的正确方法.

您的/var/tmp目录可能配置为较小的分区.检查df -h以查看该分区是否仍有足够的空间.你还需要检查免费的inode,用df -i.

也可能是一个进程(可能是你的)暂停这样的未链接文件太长时间并且还没有将空间返回到操作系统.您可以使用以下命令检查保留已删除文件的进程:

lsof -nP | grep '/var/tmp' | grep '(deleted)'
Run Code Online (Sandbox Code Playgroud)

要么

find /proc/*/fd -ls | grep '/var/tmp' | grep  '(deleted)'
Run Code Online (Sandbox Code Playgroud)