Impostazioni ColdFusion per upload di file di grandi dimensioni


8

Sto cercando di configurare un server coldfusion per accettare caricamenti di file di grandi dimensioni e mi imbatto in alcuni limiti. Ecco cosa ho osservato finora:

Esistono due impostazioni in ColdFusion Administrator che limitano la dimensione dei caricamenti: "Dimensione massima dei dati di post" e "Richiesta memoria motore". Se la dimensione del tuo caricamento (incluso l'overhead HTTP) è maggiore di una di queste impostazioni, il caricamento viene rifiutato. Non riesco a capire perché ne abbiamo bisogno 2; qualunque sia impostato più in alto non ha alcun effetto per quanto posso dire. Vince quello inferiore.

Quando qualcuno tenta di caricare un file troppo grande, non viene visualizzato un messaggio di errore. Il caricamento si blocca per sempre dopo l'invio di circa 1 finestra TCP di dati. E pende davvero male. Anche dopo che il client si arrende e si disconnette, il thread apache associato è ancora collegato (posso vedere questo usando mod_status). I thread bloccati continuano ad accumularsi fino a quando non ne rimane più nessuno per accettare nuove richieste e il server deve essere riavviato.

"Request Throttle" è una cosa che davvero non capisco. Tutta la documentazione a riguardo ne parla come la dimensione di una regione di memoria. Se è quello che è, non riesco a vedere come è correlato alle dimensioni dei file. Indica qualcosa a cui non voglio proprio credere: ColdFusion consuma l'intero file caricato in memoria prima di scriverlo sul disco. Nessuna persona sana di mente lo farebbe, quando un ciclo di upload (leggere un blocco di medie dimensioni, scriverlo su disco, ripetere fino al termine) è così facile. (So ​​che la struttura di un post HTTP multipart / form-data lo rende un po 'più difficile ma ... sicuramente una grande azienda come Adobe con un prodotto di sviluppo web può farlo bene ... no?)

Se lo slurping di file interi è effettivamente quello che sta succedendo, come si aspettano che scegliamo un limite di dimensioni realizzabile? Consenti un gigabyte e pochi utenti simultanei possono esaurire la memoria del server senza nemmeno provarci. E cosa faremo, non permettere caricamenti gigabyte? Le persone hanno video da pubblicare e non hanno tempo per modificarle!

INFORMAZIONI AGGIUNTIVE

Ecco alcuni numeri di versione.

Server web:

Server: Apache/2.2.24 (Win64) mod_jk/1.2.32

Fusione fredda:

Server Product           ColdFusion
Version                  ColdFusion 10,285437
Tomcat Version           7.0.23.0
Edition                  Enterprise
Operating System         Windows Server 2008 R2
OS Version               6.1
Update Level             /E:/ColdFusion10/cfusion/lib/updates/chf10000011.jar
Adobe Driver Version     4.1 (Build 0001)

INFORMAZIONI SUPPLEMENTARI # 2

Non so perché vorresti sapere quali valori ho inserito nei campi limite, ma sono stati entrambi impostati su 200 MB per un po '. Ho aumentato "Dimensione massima dei dati di post" a 2000 MB e non ha avuto alcun effetto. Ho già capito che se aumento "Richiesta memoria motore" a 2000 MB, consentirà un caricamento più grande. Quello che sto cercando qui non è una rapida "roba un numero più grande lì dentro!" rispondere, ma una spiegazione dettagliata di cosa significano effettivamente queste impostazioni e quali implicazioni hanno per l'utilizzo della memoria del server.

Perché il thread del server si blocchi per sempre anziché restituire un messaggio di errore quando viene superato il limite potrebbe essere una domanda separata. Ho pensato che questo sarebbe un problema ben noto. Forse dovrei prima chiedere se qualcun altro può riprodurlo. Non ho mai visto un messaggio di errore "file troppo grande" restituito a un client da ColdFusion. E ' dovrebbe avere uno?

INFORMAZIONI SUPPLEMENTARI # 3 Alcune sperimentazioni mi hanno portato a una risposta parziale. La prima cosa che mi mancava era che "Request Throttle Memory" (RTM) fa qualcosa di utile se è impostato su un valore superiore a "Dimensione massima dei dati di post" (MSOPD). Nel mio primo giro di prove, senza alcun indizio sulla relazione tra loro, li ho fatti viceversa. Con la mia nuova comprensione, posso vedere che il rapporto RTM / MSOPD è il numero di upload simultanei che saranno consentiti se si avvicinano tutti alla dimensione massima.

Supponendo che la "Richiesta di limitazione dell'acceleratore" sia in realtà un buffer di memoria e non un file temporaneo, ciò significa che i miei peggiori timori erano corretti. Ogni file viene tenuto interamente in memoria per l'intera durata del suo caricamento. Nessuno ha detto nulla per farmi credere diversamente (anche se non vedo nessuno saltare su per dire "sì, hanno fatto questa cosa stupida")

Anche con questa nuova comprensione, i caricamenti bloccati hanno un senso. Il server non ha memoria disponibile per accettare il caricamento, quindi non legge dal socket. I buffer TCP si riempiono, la dimensione della finestra diventa 0 e il client attende che si riapra, cosa che dovrebbe accadere non appena il server inizia a leggere la richiesta. Ma nel mio caso, per qualche motivo, ciò non accade mai. Il server dimentica completamente la richiesta, quindi rimane.

Il caso di "Dimensione massima dei dati di post" colpiti è ancora un po 'un mistero. Le richieste che raggiungono un limite rigido non devono essere messe in coda, ma semplicemente respinte. E ricevo un messaggio di rifiuto ("Dimensione post supera il limite massimo di 200 MB.") In server.log. Ma anche in questo caso il server sembra dimenticare la richiesta senza mai inviare un errore al client.


Due domande: 1. Sei sicuro che sia Cold Fusion e non il server web stesso? e 2. Hai esaminato il timeout della richiesta?
Katherine Villyard,

1
Sono sicuro. Non c'è timeout (il caricamento riempie una finestra TCP e quindi si blocca. Provato con WireShark. Taglia alcuni byte dalla fine del file e lo invia in 13 secondi.) E posso pubblicare un caricamento su una pagina HTML statica e invia bene (non viene salvato da nessuna parte perché non c'è nulla che elabora i dati del modulo, ma il punto è che non si

Risposte:


1

Proverò anche a spiegare le impostazioni per la messa a punto: -

  • Numero massimo di parametri di richiesta POST : si riferisce al numero massimo di attributi / parametri inviati su una particolare richiesta. Utilizzato in particolare, durante la pubblicazione di dati su un modulo.
  • Dimensione massima dei dati di post : si tratta dei dati massimi che possono essere pubblicati su un server. Questa è la somma di tutti i dati in una forma particolare durante una richiesta POST.
  • Soglia di limitazione della richiesta: se necessario, ColdFusion può limitare (rallentare forzatamente) le richieste in arrivo. Tuttavia, è possibile consentire richieste veramente piccole (quelle con un piccolo payload) indipendentemente dallo stato dell'acceleratore. Per consentire l'elaborazione di piccole richieste, specificare la dimensione massima consentita (il valore predefinito è un massimo di 4 MB).
  • Richiesta memoria motore - Per limitare le richieste, specificare la quantità massima di memoria allocata per l'acceleratore. Se non è disponibile memoria totale sufficiente, ColdFusion mette in coda le richieste fino a quando non è disponibile memoria sufficiente (il valore predefinito è 200 MB). Non riserverebbe la memoria per Req1, essendo inferiore a Soglia.

Considerare che ci sono tre richieste simultanee Req1 (3 MB), Req2 (6 MB) e Req3 (9 MB). Con le impostazioni predefinite, Soglia dell'acceleratore impostata su 4 MB, ColdFusion si riserva (6 + 9 = 15 MB) nella memoria dell'acceleratore. Allo stesso modo, continuerebbe ad aggiungere la memoria dell'acceleratore richiesta per tutte le richieste simultanee e il limite è quello che abbiamo impostato per la memoria dell'acceleratore richiesta (il valore predefinito è 200 MB)

Spero che sia di aiuto.


Questo è simile a tutte le altre descrizioni che ho trovato tramite Google. Tutti omettono l'unica cosa che avevo bisogno di sapere: che la memoria richiesta motore dovrebbe essere più grande della dimensione massima dei dati di post. E sto anche solo immaginando che la memoria richiesta motore deve essere più piccola della dimensione heap JVM, rendendo impossibile caricare file di dimensioni molto grandi (vicino o più grandi della RAM del server) in parallelo. Tuttavia, questa è la risposta migliore finora, quindi la sto votando e la accetterò se non succede altro prima che la ricompensa sia

1

È possibile utilizzare cftry-catch per acquisire l'errore e mostrare un messaggio personalizzato ai propri utenti. Detto questo, quali sono i valori impostati per Numero massimo di parametri di richiesta POST, Dimensione massima dei dati di post, Richiedi soglia dell'acceleratore e Richiedi memoria dell'acceleratore . Stai usando CF Std o Ent e qual è la versione di ColdFusion?


Non è possibile rilevare l'errore con cftry. La connessione si blocca senza mai eseguire la prima riga di cfm. (Ho messo un cflog lì per scoprire se è arrivato così lontano e non l'ha fatto.) Aggiungerò alcune informazioni sulla versione alla domanda.

Il messaggio di errore "File troppo grande" viene in genere generato dal server Web, non da ColdFusion. Se non hai trovato nulla nei registri CF, controlla i registri del Visualizzatore eventi. Ci sarebbe sicuramente qualche riferimento all'errore. Hai provato "LimitRequestBody" da Apache . Puoi anche specificare la dimensione del file sul server web.
Anit Kumar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.