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.