2015-02-18 10 views
6

मैं एक छोटी फ़ाइल (8.5 एमबी) को एक फ्लास्क परीक्षण सर्वर पर अपलोड कर रहा हूं।IOError: डिवाइस पर कोई स्थान नहीं छोड़ा गया - कौन सा डिवाइस?

जब फ़ाइल को अपलोड करना समाप्त कर ले, सर्वर रिपोर्ट: - 3 जीबी से अधिक

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 

अब, सर्वर मुक्त अंतरिक्ष के बहुत सारे है।

मैंने Werkzeug github repo को उस स्थान को खोजने का प्रयास करने के लिए देखा है जो Werkzeug लिखने का प्रयास कर रहा है, लेकिन इसे ट्रैक नहीं कर सकता।

मैंने tempfile.gettempdir() भी चेक किया है जो अस्थायी फ़ाइल निर्देशिका के रूप में/var/tmp देता है, लेकिन यह फ़ोल्डर व्यावहारिक रूप से खाली है, इसलिए मुझे नहीं लगता कि यह समस्या है जो समस्या बना रही है।

मैं उस डिवाइस को कैसे ढूंढूं जिसमें कोई स्थान नहीं है?

+1

क्या आपने अभी तक 'df -h' चलाने का प्रयास किया है? –

+0

हां। इस तरह मुझे पता है कि बहुत सारी खाली जगह उपलब्ध है। – ABM

उत्तर

14

@ टॉम हंट की टिप्पणी सही रास्ते पर थी।

यह यूनिक्स एसई उत्तर what happened बताता है।

As a protection against low disc space, some daemons automatically "shadows" the current /tmp/ dir with a ram disc if the the root partition runs out of disc space. Sadly there's no automatic reversion of that process once enough disc space is free again.

मैं अनमाउंट/tmp निर्देशिका और नितेश के सुझाव का पालन किया:

sudo umount /tmp 
sudo echo 'MINTMPKB=0' > sudo /etc/default/mountoverflowtmp 

और अब अपलोड ठीक से काम कर रहे हैं।

+0

है यह जांचने का एक तरीका है कि इस समाधान को अंधाधुंध रूप से लागू करने से पहले यह वास्तव में समस्या है? – aze

6

आप सर्वर पर एक खोल मिल सकता है, df -h टाइपिंग और किसी भी प्रविष्टियों जो दिखाने के लिए 100% की Use%, या अपने से कम फ़ाइल आकार के Avail के लिए देखने का प्रयास करें।

+0

केवल/tmp दिखाता है 100% उपयोग – ABM

+3

इस मामले में, सबसे अधिक संभावना परिदृश्य यह है कि सर्वर कुछ मध्यवर्ती चरण के माध्यम से/tmp पर डेटा संग्रहीत करता है। यदि आप कर सकते हैं, उस मात्रा के आकार में वृद्धि; यदि नहीं, तो शायद डेटा पथ की अधिक अच्छी तरह से जांच करें और देखें कि इसमें बदलाव करने का कोई तरीका है या नहीं। कुछ सर्वरों पर,/var/tmp और/tmp समान माउंट्स, सिम्लिंक या अन्य तंत्र के माध्यम से समान होते हैं; जांचें कि यह मामला है या नहीं। –

6

WERKZEUG भंडार tempfile.TemporaryFile() का उपयोग कर अपने अस्थायी निर्देशिका में एक निश्चित आकार से अधिक फाइलें, लेकिन ध्यान में रखना है कि उन फ़ाइलों की सुरक्षा के लिए लिंक रद्द हैं। आप उन्हें निर्देशिका में सूचीबद्ध नहीं देख पाएंगे। tempfile.gettempdir() इसके लिए उपयोग की गई निर्देशिका का निर्धारण करने का सही तरीका है।

आपकी /var/tmp निर्देशिका शायद छोटे विभाजन के लिए कॉन्फ़िगर किया गया है। यह देखने के लिए कि क्या विभाजन में अभी भी पर्याप्त स्थान शेष है, df -h के साथ जांचें। df -i के साथ आपको इनोड्स पर भी जांच करने की आवश्यकता है।

यह भी हो सकता है कि एक प्रक्रिया (संभवतः आपका) ऐसी अनलिंक फ़ाइलों पर लटका रही है और अंतरिक्ष अभी तक ओएस में वापस नहीं किया गया है। आप प्रक्रियाओं के साथ हटाई गई फ़ाइलों पर पर आयोजित करने के लिए जाँच कर सकते हैं:

lsof -nP | grep '/var/tmp' | grep '(deleted)' 

या

find /proc/*/fd -ls | grep '/var/tmp' | grep '(deleted)' 
+1

डीएफ-एच/var/tmp 3 जीबी उपलब्ध – ABM

+0

@ABM पर दिखाता है: और इनोड की गणना करता है? –

+1

आईयूएसई प्रतिशत 24% – ABM

3

df -i प्रयास करें, हो सकता है कि वहाँ कोई मुक्त inodes हैं।

संपादित करें:

एक और विकल्प, WERKZEUG पीआईडी ​​लगता है, यह 777 हो

  • रन एक फ़ाइल
  • रोक strace
  • कि लगता है अपलोड करने के लिए strace -p 777 &> /tmp/strace_log
  • कोशिश No space left on device संदेश , यह write(1, "blah blah ..."..., 57) = -1 ENOSPC (No space left on device) लिखने वाला पहला तर्क होगा एक फ़ाइल वर्णनकर्ता
  • बढ़ जाती हैं और विशिष्ट open(... = X syscall का पता लगाने का प्रयास करते हैं, कि एक्स एक फ़ाइल जानकारी, जिसका

सुंदर बोझिल, मुझे पता है "लिखने" syscall चरण में असफल हो जायेगी है, लेकिन उस डिबगिंग है।

+0

इनोड्स का उपयोग 24% – ABM

संबंधित मुद्दे

 संबंधित मुद्दे