Ottimo modo per servire 70.000 file statici (jpg)?

Ho bisogno di servire circa 70.000 file statici (jpg) utilizzando nginx. Devo spartire tutti in una singola directory, oppure c'è un modo migliore (efficiente)? Poiché i nomi di file sono numbersci, ho considerato di avere una struttura di directory come:

xxx / xxxx / xxx

  • LatencyTop on Centos 6.2
  • nginx proxy_pass riscrivere la posizione dell'intestazione di risposta
  • Ricaricare l'URL di Apache in proxy inverso
  • Perché preoccuparsi delle applicazioni di inversione inversa se non utilizzi mod_security o TMG / UAG?
  • nginx equivalente a Apache MultiViews?
  • Può nginx essere un proxy di posta per un server di backend che non accetta gli accessi di text cleartext?
  • Il sistema operativo è CentOS 5.1

  • Annullare la cartella in Nginx che causa PHP-FPM a non avere la precedenza
  • Diversi campi per proxy_set_header nella configuration nginx
  • working_connections di nginx uLimit superano il limite delle risorse di file aperte: 1024 '
  • Errore Nginx + Django + FastCGI WSGI? (Non fatale)
  • Mono su Linux: Apache o Nginx
  • Cattura errori verso il basso verso l'alto (502) e visualizzare la pagina di errore personalizzata
  • 12 Solutions collect form web for “Ottimo modo per servire 70.000 file statici (jpg)?”

    Benchmark, benchmark, benchmark! Probabilmente non troverai alcuna differenza significativa tra le due opzioni, il che significa che il tuo tempo è meglio speso per altri problemi. Se fai un benchmark e non trovi alcuna differenza, andate con qualunque schema è più facile – cosa è facile da codificare se solo i programmi devono accedere ai file o che è facile per gli esseri umani a lavorare se le persone hanno bisogno di lavorare frequentemente con i file.

    Quanto a qualunque sia più veloce, il tempo di ricerca delle directory è, credo, proporzionale al logaritmo del numero di file nella directory. Quindi ognuna delle tre ricerche per la struttura annidata sarà più veloce di una grande ricerca, ma il totale di tutti e tre probabilmente sarà più grande.

    Ma non fidarmi di me, non ho un'idea di quello che sto facendo! Misura le performance quando è importnte!

    dipende in realtà dal file system che stai utilizzando per memorizzare i file.

    alcuni file system (come ext2 e, in misura minore, ext3) sono orrendamente lenti quando si dispone di migliaia di file in una directory, pertanto utilizzando sottodirectory è una buona idea.

    altri filesystem, come XFS o reiserfs (*), non rallentano con migliaia di file in una directory, quindi non import se hai una grande directory o un sacco di sottodirectory più piccole.

    (*) reiserfs ha alcune belle caratteristiche ma è un giocattolo sperimentale che ha una storia di guasti catastrofici. non utilizzarlo su qualsiasi cosa anche a distanza.

    Come altri hanno affermato, la cancellazione della directory è probabilmente molto ottimale.

    Quello che ti suggerisco di fare però è rendere i tuoi URI indipendenti da qualsiasi schema di directory che utilizzi, usando il module di riscrittura di nginx, ad esempio map example.com/123456.jpg a /path/12/34/123456.jpg

    Quindi, se la struttura della directory deve cambiare per motivi di performance, puoi cambiarla senza modificare gli URI pubblicati.

    Fare una canzone di directory di base è generalmente una buona idea. Anche se il file system si occupa bene di file 70k; dopo aver dichiarato milioni di file in una directory, diventerà non gestibile. Inoltre – come funziona il tuo software di backup come molti file in una directory, ecc.

    Detto questo: per get la replica (ridondanza) e la scalabilità più facile considerare la memorizzazione dei file in MogileFS anziché nel file system. Se i file sono piccoli e alcuni file sono molto più diffusi degli altri, consideri usando Varnish (varnish-cache.org) per servirli molto rapidamente.

    Un'altra idea: utilizzare un CDN – sono sorprendentemente economici. Utilizziamo uno che costa sostanzialmente lo stesso che paghiamo per "width di banda regolare"; anche a bassi consumi (10-20Mbit / sec).

    Potresti mettere una cache di calamari davanti sul tuo server nginx. Il calamaro può conservare le immagini popolari nella memory o utilizzare il proprio layout di file per eseguire la ricerca veloce.

    Per Squid, l'impostazione predefinita è 16 directory di primo livello e 256 di livello due. Questi sono predefiniti ragionevoli per i miei file system.

    Se non utilizzi un prodotto come Squid e crea la tua struttura di file, allora dovrai elaborare un algorithm di hashing ragionevole per i tuoi file. Se i nomi di file sono generati in modo random, questo è facile e puoi usare il nome del file stesso per dividere in secchi. Se tutti i tuoi file sembrano IMG_xxxx, allora dovrai utilizzare le cifre less significative, o hash il nome del file e dividere in base a quel numero di hash.

    Come altri hanno già citato, è necessario testare per vedere quale layout funziona meglio per te per il tuo schema di installazione e utilizzo.

    Tuttavia, si può anche guardare il parametro open_file_cache all'interno di nginx. Vedere http://wiki.nginx.org/NginxHttpCoreModule#open_file_cache

    In tutti i modi benchmark e utilizzare queste informazioni per aiutarti a prendere una decisione, ma se fosse il mio sistema vorrei anche dare una certa considerazione alla manutenzione a lungo termine. A seconda di ciò che devi fare, può essere più facile gestire le cose se c'è una struttura di directory invece di tutto in una directory.

    La suddivisione in directory sembra una buona idea. Fondamentalmente (come si può sapere) la ragione di questo approccio è che avere troppi file in una directory rende l'indice di directory enorme e fa sì che il sistema operativo richieda molto tempo a cercarlo; al contrario, avere troppi livelli di (in) direzione (dispiaciuto, pugno male) significa fare un sacco di ricerca di dischi per each file.

    Vorrei suggerire la suddivisione dei file in uno o due livelli di directory – eseguire alcune prove per vedere cosa funziona meglio. Se ci sono diverse immagini tra i 70.000 che sono notevolmente più popolari degli altri, provare a mettere tutti in una directory in modo che il sistema operativo possa utilizzare un indice di directory memorizzato nella cache per loro. Oppure, puoi anche mettere le immagini popolari nella directory principale, come questa:

     images/ 021398012.jpg 379284790.jpg ... 000/ 000/ 000000000.jpg 000000001.jpg ... 001/ ... 002/ ... 

    … speriamo di vedere il model. Su Linux, è ansible utilizzare collegamenti duri per le immagini popolari (ma non i collegamenti, che riduce l'efficienza AFAIK).

    Pensate anche a come le persone stanno andando a scaricare le immagini. Qualcuno cliente individuale chiederà solo poche immagini o tutto il set? Poiché in quest'ultimo caso, è opportuno creare un file archivio di TAR o ZIP (o possibilmente più file di archivio) con le immagini in esse, poiché il trasferimento di alcuni file di size maggiori è più efficiente di molti più piccoli.

    PS Mi sono portto via nella teoria, ma il kquinn ha ragione, hai davvero bisogno di eseguire alcuni esperimenti per vedere cosa funziona meglio per te, ed è molto probabile che la differenza sarà insignificante.

    Penso che sia una buona idea per rompere i file in una gerarchia, per nessun altro motivo che se hai mai bisogno di abbandonare e fare un ls nella directory avrà less tempo.

    Non so aboutext4, ma lo stock ext2 non riesce a gestire che molti file in un dir, reiserfs (reiser3) è stato progettato per gestire bene (un ls sarà ancora brutto).

    L'organizzazione dei file ha più a che fare con le performance e la stabilità del file system rispetto alle performance di consegna. Vorrei evitare ext2 / ext3 e andare con xfs o reiser.

    Veramente vuoi esaminare la memorizzazione nella cache. Che sia il built-in caching del server web o una cache di terze parti come la vernice.

    Come indicato da kquinn, l'analisi comparativa sarà l'indicatore reale dei guadagni o delle perdite di performance.

    Vale la pena di far uscire questi file in un secchio amazon S3 e servirli da lì?

    Lascialo preoccuparsi dell'ottimizzazione.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.