2015-02-18 19 views
6

Przesyłam mały plik (8,5 Mb) do serwera testowego do kolb.IOError: Brak miejsca na urządzeniu - jakie urządzenie?

Po zakończeniu przesyłania plików, raporty serwera:

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 

Teraz serwer ma dużo wolnej przestrzeni - powyżej 3 GB.

Spojrzałem na Werkzeug github repo, aby znaleźć lokalizację, do której próbuje się napisać Werkzeug, ale nie można go wyśledzić.

Sprawdziłem również tempfile.gettempdir(), który nadaje/var/tmp jako tymczasowy katalog plików, ale ten folder jest praktycznie pusty, więc nie sądzę, że jest to lokalizacja powodująca problem.

Jak znaleźć urządzenie, które nie ma wolnego miejsca?

+1

Czy próbowałeś już uruchomić 'df -h'? –

+0

Tak. W ten sposób wiem, że jest mnóstwo wolnego miejsca. – ABM

Odpowiedz

14

@ Komentarz Toma Hunta był na dobrej drodze.

Ta odpowiedź unix SE wyjaśnia 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.

I odłączony katalogu/tmp i następnie Nitesh za sugestię:

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

i teraz przesłane działają prawidłowo.

+0

Czy istnieje sposób sprawdzenia, czy to naprawdę problem przed ślepo stosowanym rozwiązaniem? – aze

6

Jeśli można uzyskać powłokę na serwerze, spróbuj wpisać df -h i szuka wszelkich wpisów, które pokazują Use% 100% lub Avail mniejszy niż rozmiar pliku.

+0

only/tmp pokazuje 100% wykorzystania – ABM

+3

W tym przypadku najbardziej prawdopodobnym scenariuszem jest to, że serwer przechowuje, poprzez pewien pośredni krok, dane na/tmp. Jeśli możesz, zwiększ rozmiar tej objętości; jeśli nie, może lepiej zbadaj ścieżkę danych i sprawdź, czy istnieje sposób na jej zmianę. Na niektórych serwerach,/var/tmp i/tmp są takie same, przez mocowania bindów, dowiązania symboliczne lub inny mechanizm; sprawdź, czy tak jest. –

6

Firma Werkzeug przechowuje pliki o określonym rozmiarze w katalogu tymczasowym przy użyciu numeru tempfile.TemporaryFile(), ale weź pod uwagę, że dla bezpieczeństwa pliki te są niepowiązane z. Nie zobaczysz ich w katalogu. tempfile.gettempdir() to poprawna metoda określania katalogu używanego do tego.

Katalog /var/tmp jest prawdopodobnie skonfigurowany dla mniejszej partycji. Sprawdź pod numerem df -h, czy na tej partycji pozostało wystarczająco dużo miejsca. Musisz również sprawdzić za darmo i-węzłów, z df -i.

Może się również zdarzyć, że proces (prawdopodobnie twój) będzie zawieszony na takich niepowiązanych plikach zbyt długo i przestrzeń nie zostanie jeszcze zwrócona do systemu operacyjnego. Można sprawdzić na procesy trzymając się usuniętych plików z:

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

lub

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

df -h/var/tmp pokazuje ponad 3Gb dostępne – ABM

+0

@ABM: i liczy się i-węzeł? –

+1

IUse procent wynosi 24% – ABM

3

Spróbuj df -i, może nie ma wolnych i-węzłów.

EDIT:

innej opcji, znajdź Werkzeug PID, niech to będzie 777,

  • prowadzony strace -p 777 &> /tmp/strace_log
  • spróbować załadować plik
  • przystanek strace
  • uważają, że No space left on device wiadomość , to będzie jak pierwszy argument do napisania to deskryptor pliku
  • udać się i spróbować zlokalizować konkretny open(... = X syscall, że X jest deskryptor pliku, że nie uda się „pisać” krok syscall

Dość kłopotliwe, wiem, ale to debugowanie.

+0

i-węzły są w 24% wykorzystane – ABM