Wie viele Dateien maximal pro Verzeichnis ratsam [Linux]

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Wie viele Dateien maximal pro Verzeichnis ratsam [Linux]

Beitrag von mgutt »

Hallo,

wann ist für Euch die Grenze erreicht, dass ein Linuxserver mit der Anzahl der Dateien nicht mehr klar kommt bzw. langsamer wird pro Verzeichnis?

Ich arbeite mit vielen Cachedateien und es werden mit der Zeit immer mehr werden. D.h. ich müsste irgendwo eine Grenze zwischen minimalen und maximalen Dateien pro Verzeichnis ermitteln, um so die beste Zugriffszeit zu erhalten.

Bei Linux ist denke ich das Thema Fragmentierung auch vorhanden. Auch darüber habe ich bisher noch nicht nachgedacht.

Aber es wäre mir mit Eurer Einschätzung sicher schonmal geholfen.

Ich dachte z.B. an eine Unterteilung pro 1000 Dateien. Oder wäre das zu wenig, so dass ich zu viele Ordner produziere?

Derzeit gehe ich von ca. 50.000 Dateien aus mit steigender Tendenz. Das 10-fache wäre aber auch denkbar.

Gruß
Marc
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
mr.no-name
Mitglied
Beiträge: 1883
Registriert: 20.10.2003 12:07
Wohnort: Hannover

Beitrag von mr.no-name »

Eine sinnvolle Grenze weiß ich leider auch nicht, aber folgendes könnte ich mir denken:
Solange du weniger Ordner für die Dateien hast, als Dateien in jedem Ordner, ist es okay. Und da du dann 500 Ordner mit je 1000 Dateien hättest, wäre diese Unterteilung meiner Meinung nach nicht zu klein.
Wenn du allerdings irgendwann deutlich mehr als 1 Mio Dateien planst, dann wäre wohl eine andere Aufteilung sinnvoller.
Max
Mitglied
Beiträge: 1051
Registriert: 20.02.2003 22:22

Beitrag von Max »

Ich habe mal im Support eines Hosters gelesen, dass sie die Anzeige der Dateien im Ordner auf 2000 begrenzt haben.
Es wird also nicht die Anzahl selbst begrenzt, sondern es werden nur 2000 Files (via FTP) angezeigt. Erreichbar sind aber alle.

Das soll wohl positive Auswirkungen auf die Load-Werte haben.
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Ja das hat aber nur positive Auswirkungen auf den simplen ftp Zugriff. Da es ewig dauern würde 100.000 Dateien im FTP zu erstellen.

Mir geht es nur um reine http Zugriffe per include(). Es wird händisch nicht auf das Verzeicnis zugegriffen.

Gruß
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Jensemann
Ehemaliges Teammitglied
Beiträge: 2549
Registriert: 25.02.2002 01:00

Beitrag von Jensemann »

Ob du händich, oder per include() zugreifst ist der Performance egal. Das Problem mit dem du zu kämpfen hast, heisst nicht Fragmentierung, sondern die Implementierung von stat().

stat() macht einen sequentiellen Lauf durch alle Dateien in dem Verzeichnis, bis es die gefunden hat, die du haben willst. Je mehr Dateien, desto langsamer wird das. Eine beliebte Lösung für dieses Problem, ist die Aufteilung nach Anfangszeichen der Datei. Du machst aus dem 1. Zeichen der Datei ein Verzeichnis, in das du diese einsortierst. Will heissen, aus der Datei "jensemann.cache.php" wird "j/jensemann.cache.php", die java.cache.php landet auch bei mir, gooba.cache.php sortierst du in g ein, etc...

Dadurch kannst du die Dateien in einem Verzeichnis in den meisten Fällen recht niedrig halten. Webhoster verwenden diese Taktik sehr gerne, wenn sie mehr als 10 000 Kunden auf einer Maschine hosten wollen (etwa kostenlos-Dienste oder ähnl.). Der PHP-Cache eAccelerator verfährt für seine Cache-Files seit einiger Zeit ebenfalls nach diesem Schema.
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Hi,

ja aber bei z.B. 100.000 Dateien hätte man "nur" 36 [a-z0-9] Verzeichnisse zur Verfügung.

Hat der eAccelerator zufällig Grenzen in der Anzahl pro Ordner und sortiert ab X z.B. nach den ersten beiden Zeichen einer Datei "filname.php" dann unter "fi/filename.php"?

Mit einem händischen Zugriff meinte ich auf jeden Fall ftp . Dabei hast Du einfach das Problem, dass er alle Dateien erst einliest, bevor das Verzeichnis angezeigt werden kann. Aber dann dauert ein Zugriff auf eine bestimmte Datei auch länger als 10 Sekunden je nachdem ob man 5.000+ Dateien im Ordner hat.

Gruß
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Jensemann
Ehemaliges Teammitglied
Beiträge: 2549
Registriert: 25.02.2002 01:00

Beitrag von Jensemann »

Hab eben nochmal nachgesehen, meine Aussage war nicht ganz richtig. eAccelerator verwendet folgendes Verfahren:

$Zeichen-1/$Zeichen-2/$Datei

jensemann.cache.php wird also j/e/jensemann.cache.php und gooba.cache.php wird g/o/gooba.cache.php. Ergibt weitaus mehr Varianten.
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

eAccelerator macht das aus Erfahrung mit der Geschwindigkeit. Jetzt müsste man in Erfahrung bringen, wie viele Dateien denen zu langsam waren, weshalb sie dieses Verfahren angestrebt haben.

Ich kann nichts finden. Wenn dann müsste ja eine Supportanfrage oder eine öffentliche Mitteilung irgendwo zu finden sein. Ich finde dazu aber leider nichts.

Da ich mit Zahlen arbeite hätte ich die Möglichkeit mit 10² Varianten also 100 Verzeichnissen oder mit 10³ also 1000 Verzeichnissen zu arbeiten.

Dann könnte man z.B. 1000² also 1.000.000 Cachedateien platzieren, falls die Grenze z.B. 1000 Dateien pro Verzeichnis wären.

Bei 100*1000 wären es noch 100.000 Cachedateien wenn man vom gleichen Maximum ausgeht. Ich denke das reicht mir. Dann arbeite ich einfach mit den ersten beiden Ziffern und mache das Cachen mit Verzeichnissen wie folgt: (jetzt fällt mir gerade auf, dass es doch nicht so viele Varianten sind, weil ich keine Zahl mit 0 beginnend habe, aber egal)

1/0/1.php
1/0/1023.php
1/1/1145.php
2/1/21.php
...
9/9/99.php
9/9/99384.php
usw.

Jetzt weiß ich zwar nicht wie viele jetzt noch möglich sind, aber ich denke das spielt sich im Rahmen von 90k - 100k an möglichen Cachedateien ab :D

Gruß
Marc

EDIT:
Ok, ein Problem. Wie ermittel ich am schnellsten die ersten beiden Ziffern einer Zahl? Integer in String umwandeln und dann §var{0} bzw. {1}?

Da ich keine integer to string Funktion finden kann, habe ich mir einfach was zusammengefuscht:

Code: Alles auswählen

		$this->cache_folder = $this->topic_id . ' ';
		$this->cache_folder = $this->cache_folder{0} . '/' . $this->cache_folder{1} . '/';
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

mgutt hat geschrieben:Ok, ein Problem. Wie ermittel ich am schnellsten die ersten beiden Ziffern einer Zahl? Integer in String umwandeln und dann §var{0} bzw. {1}?
Ich hätte eigentlich erwartet, daß das durch die automatische Typumwandlung funktioniert, ist aber offenbar nicht der Fall. substr($foo, 0, 1) funktioniert aber auch bei ints und ist IMHO etwas sauberer als deine Behelfslösung. Alternativ $foo = (string)$foo. Oder als Einzeiler:

Code: Alles auswählen

$foo = preg_replace('#^(.)(.)?#', '\\1/\\2/\\1\\2', $foo)
KB:knigge
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

settype() ging nicht. Aber (string) dagegen schon. Danke!

Ich denke aber mit {0} baue ich mir schneller den String als mit einem preg_replace(). Auch weil ich ja bei nicht vorhandenen Zeichen eine erzwungene Null benötige und extra die Flag setzen müsste um bei preg_replace() weitere Funktionen während der Bearbeitung zu erlauben.

Daher so:

Code: Alles auswählen

      $this->cache_folder = (string)$this->topic_id; 
      $this->cache_folder = intval($this->cache_folder{0}) . '/' . intval($this->cache_folder{1}) . '/';
Wahrscheinlich würde strval() auch funktionieren, habe ich aber nicht getestet:
http://de.php.net/manual/de/language.ty ... ng.casting

Gruß
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Antworten

Zurück zu „Coding & Technik“