Jak uwolnić użycie i-węzła?

275

Mam napęd dyskowy, na którym użycie i-węzła wynosi 100% (za pomocą df -ipolecenia). Jednak po znacznym usunięciu plików użycie pozostaje w 100%.

Jaki jest zatem właściwy sposób na zrobienie tego?

Jak to możliwe, że napęd dyskowy o mniejszym zużyciu miejsca na dysku może mieć większe użycie i-węzła niż dysk o wyższym zużyciu miejsca na dysku?

Czy to możliwe, jeśli skompresuję wiele plików, co zmniejszyłoby liczbę używanych i-węzłów?

Neversaint
źródło
4
Chcę dać ci 50 punktów za to pytanie. Jak mogę to zrobić! :)
Sophy
@Sophy Nie rób tego. dostaniesz automatyczne zbanowanie
Steven Lu
1
@StevenLu Dziękujemy za informacje! Chcę mu podziękować, ponieważ spędziłem kilka dni, aby rozwiązać problem. Ale ten problem może mi pomóc. Jeszcze raz dziękuję
Sophy
1
@Sophy: po co nagradzać coś nie-tematycznego dla SO? :) To zdecydowanie nie jest pytanie programistyczne, bez względu na to, ile głosów zyskuje.
zadzwonić
Puste katalogi również zużywają i-węzły. Usunięcie ich może zwolnić niektóre i-węzły. Liczba może być znacząca w niektórych przypadkach użycia. Możesz usunąć puste katalogi za pomocą: find. -type d -empty -delete
Ruchit Patel

Odpowiedzi:

170

Dysk może mieć dużą liczbę i-węzłów, nawet jeśli dysk nie jest bardzo pełny.

I-węzeł jest przypisany do pliku, więc jeśli masz gazilliony plików, każdy 1 bajt, zabraknie i-węzłów na długo przed zabraknięciem dysku.

Możliwe jest również, że usunięcie plików nie zmniejszy liczby i-węzłów, jeśli pliki mają wiele twardych łączy. Jak powiedziałem, i-węzły należą do pliku, a nie do pozycji katalogu. Jeśli do pliku są połączone dwa wpisy katalogu, usunięcie jednego nie zwalnia i-węzła.

Ponadto można usunąć pozycję katalogu, ale jeśli uruchomiony proces nadal ma otwarty plik, i-węzeł nie zostanie zwolniony.

Moją wstępną radą byłoby usunięcie wszystkich plików, które możesz, a następnie zrestartowanie skrzynki, aby upewnić się, że żadne procesy nie pozostawiają otwartych plików.

Jeśli to zrobisz i nadal będziesz mieć problem, daj nam znać.

Nawiasem mówiąc, jeśli szukasz katalogów zawierających wiele plików, ten skrypt może pomóc:

#!/bin/bash
# count_em - count files in all subdirectories under current directory.
echo 'echo $(ls -a "$1" | wc -l) $1' >/tmp/count_em_$$
chmod 700 /tmp/count_em_$$
find . -mount -type d -print0 | xargs -0 -n1 /tmp/count_em_$$ | sort -n
rm -f /tmp/count_em_$$
paxdiablo
źródło
12
Oczywiście >/tmp/count_em_$$zadziała tylko wtedy, gdy masz na to miejsce ... jeśli tak jest, zobacz odpowiedź @ simon.
alxndr,
1
@alxndr, dlatego często dobrym pomysłem jest oddzielenie systemów plików - w ten sposób wypełnienie czegoś podobnego /tmpnie wpłynie na inne systemy plików.
paxdiablo,
Twoja odpowiedź jest całkowicie odpowiednia dla „system nie pozostanie użyje pliku po ponownym uruchomieniu, jeśli zostanie on usunięty”. Ale zadano pytanie: „jak odzyskać lub ponownie wykorzystać i-węzły po usunięciu wskaźnika i-węzła?”. Zasadniczo jądro linuksa tworzy nowe i-węzły do ​​pliku po każdym utworzeniu, a także automatycznie nie odzyskuje i-węzła po każdym usunięciu pliku.
Mohanraj 16.04.13
1
@AshishKarpe, zakładam, że mówisz o własnej sytuacji, ponieważ OP nie wspomniał o serwerach produkcyjnych. Jeśli nie możesz natychmiast uruchomić się ponownie, są dwie możliwości. Po pierwsze, miej nadzieję, że procesy w locie ostatecznie zamkną bieżące pliki, aby uwolnić zasoby dyskowe. Po drugie, nawet serwery produkcyjne powinny mieć możliwość ponownego uruchomienia w pewnym momencie - wystarczy zaplanować planowane przestoje lub poczekać na następne okno przestoju.
paxdiablo
2
Przypuszczam, że chcesz ls -Azamiast ls -a. Dlaczego chcesz liczyć? i ..?
jarno
205

Jeśli masz pecha, zużyłeś około 100% wszystkich i-węzłów i nie możesz utworzyć scipt. Możesz to sprawdzić za pomocą df -ih.

To polecenie bash może ci pomóc:

sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n

I tak, zajmie to trochę czasu, ale możesz zlokalizować katalog z największą liczbą plików.

Szymon
źródło
8
to załatwia sprawę. moim problemem było niewiarygodna ilość sesji w katalogu / lib / php / session. może ktoś ma ten sam problem
SteMa
2
Ktoś powinien przepisać to polecenie znalezienia, wycięcia, uniqa na jedno polecenie awk!
mogsie
5
@alxndr awkmoże zachować skrót katalogu i liczbę plików bez uniqowania i sortowania linii gazillionów. To powiedziawszy, być może jest poprawa: find . -maxdepth 1 -type d | grep -v '^\.$' | xargs -n 1 -i{} find {} -xdev -type f | cut -d "/" -f 2 | uniq -c | sort -n- to tylko sortuje ostatnią listę.
mogsie
12
Jeśli nie możesz utworzyć żadnych plików, nawet to może się nie powieść, ponieważ sortmoże nie utrzymać wszystkiego w pamięci i spróbuje automatycznie wrócić do zapisywania pliku tymczasowego. Proces, który oczywiście by się nie powiódł ...
Mikko Rantalainen
10
sortnie udało mi się, ale mogłem dać to, --buffer-size=10Gco zadziałało.
Frederick Nord,
69

Moja sytuacja była taka, że ​​brakowało mi i-węzłów i już usunąłem wszystko, co mogłem.

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/sda1      942080 507361     11  100% /

Jestem na Ubuntu 12.04LTS i nie mogłem usunąć starych jąder Linuksa, które zajmowały około 400 000 i-węzłów, ponieważ apt został uszkodzony z powodu brakującego pakietu. Nie mogłem zainstalować nowego pakietu, ponieważ brakowało mi i-węzłów, więc utknąłem.

Ostatecznie usunąłem ręcznie kilka starych jąder Linuksa, aby zwolnić około 10 000 i-węzłów

$ sudo rm -rf /usr/src/linux-headers-3.2.0-2*

To wystarczyło, aby pozwolić mi zainstalować brakujący pakiet i naprawić mój apt

$ sudo apt-get install linux-headers-3.2.0-76-generic-pae

a następnie usuń resztę starych jąder Linuksa za pomocą apt

$ sudo apt-get autoremove

rzeczy są teraz znacznie lepsze

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/sda1      942080 507361 434719   54% /
LNamba
źródło
3
Było to najbliższe mojemu podejściu w podobnej sytuacji. Warto zauważyć, że bardziej ostrożne podejście jest dobrze udokumentowane na help.ubuntu.com/community/Lubuntu/Documentation/...
beldaz
Dokładnie moja sprawa! Ale do postępu musiał użyć „sudo apt-get autorove -f”
Tony Sepia,
Czy jest to bezpieczne: sudo rm -rf /usr/src/linux-headers-3.2.0-2*jeśli jestem pewien, że nie używam tego jądra?
Mars Lee
@MarsLee Możesz sprawdzić, które jądro jest aktualnie uruchomione za pomocą „uname -a”
Dominique Eav
Zadzwonienie $ sudo apt-get autoremovesamemu załatwiło sprawę.
Morten Grum
49

Moje rozwiązanie:

Spróbuj sprawdzić, czy jest to problem z i-węzłami:

df -ih

Spróbuj znaleźć foldery główne z dużą liczbą i-węzłów:

for i in /*; do echo $i; find $i |wc -l; done

Spróbuj znaleźć określone foldery:

for i in /src/*; do echo $i; find $i |wc -l; done

Jeśli jest to nagłówek linux, spróbuj usunąć najstarszy z:

sudo apt-get autoremove linux-headers-3.13.0-24

Osobiście przeniosłem je do zamontowanego folderu (ponieważ dla mnie ostatnie polecenie nie powiodło się) i zainstalowałem najnowszy z:

sudo apt-get autoremove -f

To rozwiązało mój problem.

dardarlt
źródło
1
W moim przypadku problem był SpamAssasin-Temp. find /var/spool/MailScanner/incoming/SpamAssassin-Temp -mtime +1 -print | xargs rm -fwykonał robotę :) Dzięki!
joystick
4
Dla mnie zajęło to wiele godzin. Istnieje jednak proste rozwiązanie: gdy drugie polecenie zawiesza się w określonym katalogu, zabij bieżące polecenie i ponownie uruchom zmieniając * na katalog, w którym się on zawiesił. Byłem w stanie dotrzeć do winowajcy <minutę.
Michael Terry
Użyłem tego wariantu twojego polecenia, aby wydrukować liczby w tym samym wierszu: for i in /usr/src/*; do echo -en "$i\t"; find $i 2>/dev/null |wc -l; done
cscracker
for i in /src/*; do echo "$i, `find $i |wc -l`"; done|sort -nrk 2|head -10pokaż 10 największych katalogów
Mark Simon
12

Miałem ten sam problem, naprawiłem go usuwając sesje katalogu php

rm -rf /var/lib/php/sessions/

Może być poniżej, /var/lib/php5jeśli używasz starszej wersji php.

Odtwórz go z poniższym zezwoleniem

mkdir /var/lib/php/sessions/ && chmod 1733 /var/lib/php/sessions/

Domyślnie zezwolono na katalog na Debianie drwx-wx-wt(1733)

Anyone_ph
źródło
1
Wiesz, dlaczego tak się dzieje?
Sibidharan
1
@Sibidharan w moim przypadku było to spowodowane tym, że zadanie cron PHP do czyszczenia starych sesji PHP nie działało.
ponury
3
rm -rf /var/lib/php/sessions/*byłoby prawdopodobnie lepszym poleceniem - nie usunie katalogu sesji, tylko jego zawartość ... Wówczas nie musisz się martwić o jego odtworzenie
Shadow
Nie miałem sesji php, ale problem z sesją magento, podobny do tego. Dzięki za wskazówki.
Mohit
Sesje php nie powinny być czyszczone
2

Doświadczyliśmy tego na koncie HostGator (który nakłada limity i-węzłów na cały hosting) po ataku spamem. Pozostawił ogromną liczbę rekordów kolejek w /root/.cpanel/comet. Jeśli tak się stanie i okaże się, że nie masz wolnych i-węzłów, możesz uruchomić to narzędzie cpanel przez powłokę:

/usr/local/cpanel/bin/purge_dead_comet_files
designgroop
źródło
2

Możesz użyć RSYNC, aby usunąć dużą liczbę plików

rsync -a --delete blanktest/ test/

Utwórz folder blanktest z 0 plikami, a polecenie zsynchronizuje foldery testowe z dużą liczbą plików (tą metodą usunąłem prawie 5 mln plików).

Dzięki http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux

VIGNESH
źródło
Z tego, co mogę powiedzieć na podstawie artykułu / komentarzy, jest to szybsze niż w rm *przypadku wielu plików, ze względu na rozszerzenie symbolu wieloznacznego i przekazywanie / przetwarzanie każdego argumentu, ale rm test/jest w porządku do usuwania test/folderu zawierającego wiele plików.
mwfearnley,
Heads up, to działa dobrze, ale upewnij się, że poprawnie ustawiłeś uprawnienia do pustego katalogu! Nie zrobiłem tego i przypadkowo zmieniłem uprawnienia do katalogu sesji PHP. Dwie godziny zajęło mi ustalenie, co spieprzyłem.
aecend
1

eaccelerator może powodować problem, ponieważ kompiluje PHP w bloki ... Miałem ten problem z serwerem Amazon AWS na stronie o dużym obciążeniu. Zwolnij i-węzły, usuwając pamięć podręczną modułu eaccelerator w katalogu / var / cache / eaccelerator, jeśli nadal występują problemy.

rm -rf /var/cache/eaccelerator/*

(lub jakikolwiek inny katalog pamięci podręcznej)

supershwa
źródło
1

Niedawno napotkaliśmy podobny problem. W przypadku, gdy proces odnosi się do usuniętego pliku, i-węzeł nie zostanie zwolniony, więc musisz sprawdzić lsof /, a zabicie / zrestartowanie procesu spowoduje zwolnienie i-węzłów.

Popraw mnie, jeśli się tu mylę.

Razal
źródło
1

Jak powiedziano wcześniej, w systemie plików mogą brakować i-węzłów, jeśli jest dużo małych plików. Mam pod warunkiem jakiś sposób znaleźć katalogi, które zawierają większość plików tutaj .

jarno
źródło
0

Późna odpowiedź: w moim przypadku były to moje pliki sesji

/var/lib/php/sessions

korzystające z i-węzłów.
Nie byłem nawet w stanie otworzyć mojego pliku crontab ani stworzyć nowego katalogu, nie mówiąc już o uruchomieniu operacji usuwania. Ponieważ używam PHP, mamy ten przewodnik, w którym skopiowałem kod z przykładu 1 i skonfigurowałem cronjob do wykonywania tej części kodu.

<?php
// Note: This script should be executed by the same user of web server 
process.

// Need active session to initialize session data storage access.
session_start();

// Executes GC immediately
session_gc();

// Clean up session ID created by session_gc()
session_destroy();
?>

Jeśli zastanawiasz się, jak udało mi się otworzyć crontab, to dobrze, niektóre sesje usunąłem ręcznie przez CLI.

Mam nadzieję że to pomoże!

Han
źródło
0

możesz zobaczyć tę informację

for i in /var/run/*;do echo -n "$i "; find $i| wc -l;done | column -t
张馆长
źródło
-2

Wiele odpowiedzi na to pytanie do tej pory i wszystkie powyższe wydają się konkretne. Myślę, że będziesz bezpieczny podczas korzystania z niego stat, ale w zależności od systemu operacyjnego mogą pojawić się pewne błędy i-węzłowe. Dlatego wdrożenie własnej statfunkcji połączeń w 64bitcelu uniknięcia problemów z przepełnieniem wydaje się dość kompatybilne.

kinokaf
źródło
tutaj uwielbiamy przykłady;)
Bohne
-3

Jeśli używasz dokera, usuń wszystkie obrazy. Wykorzystali wiele miejsca ....

Zatrzymaj wszystkie pojemniki

docker stop $(docker ps -a -q)

Usuń wszystkie pojemniki

docker rm $(docker ps -a -q)

Usuń wszystkie obrazy

docker rmi $(docker images -q)

Działa mi

Pankaj Shinde
źródło
Nie pomaga to wykryć, czy problem stanowi „zbyt wiele i-węzłów”.
Mark Stosberg,
To nie ma nic wspólnego z Dockerem.
Urda,