Maksymalna liczba plików / folderów w Linuksie?

Rozwijam sklep internetowy LAMP, który pozwoli adminowi przesłać wiele zdjęć dla każdego przedmiotu.

Moim zmartwieniem jest - od razu będzie 20000 pozycji, czyli około 60000 obrazów.

Pytania:

  1. Jaka jest maksymalna liczba plików i / lub folderów w systemie Linux?

  2. Jaki jest zwykły sposób radzenia sobie z tą sytuacją (najlepsza praktyka)?

Moim pomysłem było stworzenie folderu dla każdego elementu, na podstawie jego unikalnego identyfikatora, ale wtedy nadal miałbym 20000 folderów w głównym folderze uploads i będzie rosnąć w nieskończoność, ponieważ stare elementy nie zostaną usunięte.

Dzięki za pomoc.

Author: CodeVirtuoso, 2011-11-23

6 answers

Ext[234] systemy plików mają ustaloną maksymalną liczbę i-węzłów; każdy plik lub katalog wymaga jednego i-węzła. Możesz zobaczyć bieżącą liczbę i limity za pomocą df -i. Na przykład w systemie plików ext3 o pojemności 15 GB, utworzonym z ustawieniami domyślnymi:

Filesystem           Inodes  IUsed   IFree IUse% Mounted on
/dev/xvda           1933312 134815 1798497    7% /

Nie ma ograniczeń co do katalogów w szczególności poza tym; należy pamiętać, że każdy plik lub katalog wymaga co najmniej jednego bloku systemu plików (zazwyczaj 4KB), nawet jeśli jest to katalog zawierający tylko jedną pozycję.

Jak ty widać jednak, że 80 000 i-węzłów raczej nie stanowi problemu. Z opcją dir_index (aktywowaną za pomocą tune2fs) wyszukiwanie w dużych katalogach nie jest zbyt wielkim problemem. Należy jednak pamiętać, że wiele narzędzi administracyjnych (takich jak ls lub rm) może mieć trudności z radzeniem sobie z katalogami zawierającymi zbyt wiele plików. W związku z tym zaleca się dzielenie plików, aby nie mieć więcej niż kilkaset do tysiąca pozycji w danym katalogu. Łatwym sposobem, aby to zrobić jest hash cokolwiek Identyfikator, którego używasz, i użyj pierwszych kilku cyfr szesnastkowych jako katalogów pośrednich.

Na przykład, załóżmy, że masz ID elementu 12345 i hashuje na 'DEADBEEF02842.......'. Możesz przechowywać swoje pliki Pod /storage/root/d/e/12345. Zmniejszyłeś liczbę plików w każdym katalogu o 1 / 256.

 71
Author: bdonlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-23 08:49:24

Jeśli system plików twojego serwera ma włączoną funkcję dir_index (Zobacz tune2fs(8), aby uzyskać szczegółowe informacje na temat sprawdzania i włączania tej funkcji), możesz rozsądnie przechowywać ponad 100 000 plików w katalogu, zanim wydajność ulegnie pogorszeniu. (dir_index jest domyślne dla nowych systemów plików dla większości dystrybucji od kilku lat, więc będzie to tylko Stary system plików, który domyślnie nie ma włączonej funkcji.)

To powiedziawszy, dodanie kolejnego poziomu katalogów w celu zmniejszenia liczba plików w katalogu przez współczynnik 16 lub 256 drastycznie zwiększyłaby szanse na to, że takie rzeczy jak ls * działają bez nadmiernego uruchamiania maksymalnego rozmiaru argv jądra.

Zazwyczaj robi się to za pomocą czegoś w rodzaju:

/a/a1111
/a/a1112
...
/b/b1111
...
/c/c6565
...

Tzn. poprzedzając literę lub cyfrę do ścieżki, na podstawie jakiejś funkcji można obliczyć nazwę. (Pierwsze dwa znaki md5sum lub sha1sum nazwy pliku to jedno wspólne podejście, ale jeśli masz unikalne identyfikatory obiektów, to 'a'+ id % 16 jest wystarczająco łatwe mechanizm pozwalający określić, którego katalogu użyć.)

 8
Author: sarnold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-23 08:07:51

60000 to nic, 20000 też. Ale należy umieścić grupę tych 20000 w jakikolwiek sposób, aby przyspieszyć dostęp do nich. Może w grupach po 100 lub 1000, biorąc Numer katalogu i dzieląc go przez 100, 500, 1000, cokolwiek.

Np. mam projekt, w którym pliki mają numery. Grupuję je w 1000s, więc mam

id/1/1332
id/3/3256
id/12/12334
id/350/350934

W rzeczywistości możesz mieć twardy limit - niektóre systemy mają 32-bitowe i-węzły, więc jesteś ograniczony do liczby 2^32 na system plików.

 6
Author: glglgl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-23 08:09:04

Oprócz ogólnych odpowiedzi (zasadniczo "nie przejmuj się tak bardzo", "dostroić system plików" i "uporządkuj katalog z podkatalogami zawierającymi po kilka tysięcy plików"):

Jeśli poszczególne obrazy są małe (np. mniej niż kilka kilobajtów), zamiast umieszczać je w folderze, można je również umieścić w bazie danych (np. z MySQL jako BLOB ) lub wewnątrz GDBM zindeksowanego pliku. Wtedy każdy mały element nie będzie zużywał i-węzła (na wielu systemów plików, każdy i-węzeł chce co najmniej kilka kilobajtów). Możesz to również zrobić dla jakiegoś progu (np. umieścić obrazy większe niż 4kbajty w pojedynczych plikach, a mniejsze w bazie danych lub pliku GDBM). Oczywiście nie zapomnij wykonać kopii zapasowej danych (i zdefiniować stan kopii zapasowej).

 4
Author: Basile Starynkevitch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-23 09:59:45

Jest rok 2014. Wracam w czasie, aby dodać tę odpowiedź. Dużo dużych / małych plików? Możesz użyć Amazon S3 i innych alternatyw opartych na Ceph, takich jak DreamObjects, gdzie nie ma limitów katalogów, o które możesz się martwić.

Mam nadzieję, że to pomoże komuś zdecydować się na wszystkie alternatywy.

 1
Author: Abhishek Dujari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-16 22:11:24
md5($id) ==> 0123456789ABCDEF

$file_path = items/012/345/678/9AB/CDE/F.jpg 

1 node = 4096 subnodes (fast)
 -3
Author: gibz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-16 19:55:11