ColdFusion-Einstellungen für das Hochladen großer Dateien

8

Ich versuche, einen ColdFusion-Server so einzurichten, dass Uploads großer Dateien akzeptiert werden, und stoße auf einige Grenzen. Folgendes habe ich bisher beobachtet:

In ColdFusion Administrator gibt es zwei Einstellungen, die die Größe der Uploads begrenzen: "Maximale Größe der Post-Daten" und "Request Throttle Memory". Wenn die Größe Ihres Uploads (einschließlich HTTP-Overhead) größer als eine dieser Einstellungen ist, wird der Upload abgelehnt. Ich kann nicht herausfinden, warum wir zwei davon brauchen; Was auch immer höher eingestellt ist, hat, soweit ich das beurteilen kann, keine Auswirkung. Der untere gewinnt.

Wenn jemand versucht, eine zu große Datei hochzuladen, erhält er keine nette Fehlermeldung. Der Upload bleibt nur für immer hängen, nachdem Daten im Wert von ca. 1 TCP-Fenster gesendet wurden. Und es hängt wirklich schlecht. Selbst nachdem der Client aufgegeben und die Verbindung getrennt hat, ist der zugehörige Apache-Thread immer noch gebunden (ich kann dies mit mod_status sehen). Die feststeckenden Threads bauen sich so lange auf, bis keine mehr übrig sind, um neue Anforderungen entgegenzunehmen, und der Server neu gestartet werden muss.

Das "Request Throttle" verstehe ich wirklich nicht. In der gesamten Dokumentation wird davon die Größe eines Speicherbereichs gesprochen. Wenn es so ist, kann ich nicht sehen, wie es mit den Dateigrößen zusammenhängt. Es deutet auf etwas hin, das ich einfach nicht glauben möchte: ColdFusion schlürft die gesamte hochgeladene Datei in den Speicher, bevor sie auf die Festplatte geschrieben wird. Keine vernünftige Person würde das tun, wenn eine Upload-Schleife (einen mittelgroßen Block lesen, auf die Festplatte schreiben, bis zum Ende wiederholen) so einfach ist. (Ich weiß, dass die Struktur eines mehrteiligen HTTP- / Formulardatenposts es etwas schwieriger macht, aber ... sicherlich kann ein großes Unternehmen wie Adobe mit einem Webentwicklungsprodukt dies richtig machen ... nicht wahr?)

Wenn es tatsächlich um das Schlürfen ganzer Dateien geht, wie erwarten sie dann, dass wir eine praktikable Größenbeschränkung wählen? Lassen Sie ein Gigabyte zu, und einige gleichzeitige Benutzer können Ihren Server nicht mehr über genügend Arbeitsspeicher verfügen, ohne es zu versuchen. Und was machen wir, ohne Gigabyte-Uploads zuzulassen? Die Leute haben Videos zu posten und keine Zeit, sie zu bearbeiten!

ZUSÄTZLICHE INFO

Hier sind einige Versionsnummern.

Webserver:

Server: Apache/2.2.24 (Win64) mod_jk/1.2.32

ColdFusion:

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)

ZUSÄTZLICHE INFORMATIONEN # 2

Ich weiß nicht, warum Sie wissen möchten, welche Werte ich in die Grenzwertfelder eingegeben habe, aber beide wurden für eine Weile auf 200 MB festgelegt. Ich habe "Maximale Größe der Post-Daten" auf 2000 MB erhöht und es hatte keine Auswirkungen. Ich habe bereits herausgefunden, dass ein größerer Upload möglich ist, wenn ich "Request Throttle Memory" auf 2000 MB erhöhe. Was ich hier suche, ist kein schnelles "Zeug, eine größere Zahl da drin!" Antwort, aber eine detaillierte Erklärung, was diese Einstellungen tatsächlich bedeuten und welche Auswirkungen sie auf die Speichernutzung des Servers haben.

Warum der Server-Thread für immer blockiert, anstatt eine Fehlermeldung zurückzugeben, wenn das Limit überschritten wird, könnte eine separate Frage sein. Ich nahm an, dass dies ein bekanntes Problem sein würde. Vielleicht sollte ich zuerst fragen, ob jemand anderes es reproduzieren kann. Ich habe noch nie eine Fehlermeldung "Datei zu groß" gesehen, die von ColdFusion an einen Client zurückgegeben wurde. Ist es sollte eine haben?

ZUSÄTZLICHE INFORMATIONEN # 3 Einige Experimente haben mich zu einer teilweisen Antwort geführt. Das erste, was mir fehlte, war, dass "Request Throttle Memory" (RTM) etwas Nützliches bewirkt, wenn es höher als "Maximum Size of Post Data" (MSOPD) eingestellt ist. In meiner ersten Testrunde hatte ich sie umgekehrt, ohne eine Ahnung von der Beziehung zwischen ihnen zu haben. Mit meinem neuen Verständnis kann ich sehen, dass das Verhältnis RTM / MSOPD die Anzahl der gleichzeitigen Uploads ist, die zulässig sind, wenn sie alle nahe der maximalen Größe liegen.

Angenommen, der "Request Throttle Memory" ist tatsächlich ein Speicherpuffer und keine temporäre Datei, bedeutet dies, dass meine schlimmsten Befürchtungen richtig waren. Jede Datei wird für die gesamte Dauer ihres Uploads vollständig gespeichert. Niemand hat etwas gesagt, was mich dazu bringt, etwas anderes zu glauben (obwohl ich auch niemanden aufspringen sehe, der sagt "Ja, sie haben diese dumme Sache gemacht")

Auch mit diesem neuen Verständnis sind die blockierten Uploads sinnvoll. Der Server verfügt nicht über Speicher, um den Upload zu akzeptieren, sodass er einfach nicht aus dem Socket liest. Die TCP-Puffer füllen sich, die Fenstergröße wird 0 und der Client wartet darauf, dass sie erneut geöffnet wird. Dies sollte geschehen, sobald der Server mit dem Lesen der Anforderung beginnt. Aber in meinem Fall passiert das aus irgendeinem Grund nie. Der Server vergisst die Anfrage vollständig und verweilt nur.

Der Fall, dass "Maximale Größe der Post-Daten" getroffen wird, ist immer noch ein Rätsel. Anfragen, die ein hartes Limit erreichen, sollten nicht in die Warteschlange gestellt, sondern nur abgelehnt werden. Und ich erhalte eine Ablehnungsnachricht ("Post Size überschreitet die maximale Grenze von 200 MB.") In server.log. Aber auch in diesem Fall scheint der Server die Anforderung zu vergessen, ohne jemals einen Fehler an den Client zu senden.


quelle
Zwei Fragen: 1. Sind Sie sicher, dass es sich um Cold Fusion handelt und nicht um den Webserver selbst? und 2. Haben Sie sich das Zeitlimit für die Anfrage angesehen?
Katherine Villyard
1
Ich bin sicher. Es gibt keine Zeitüberschreitung (der Upload füllt ein TCP-Fenster und bleibt dann stehen. Bewährt mit Wireshark. Hacken Sie ein paar Bytes vom Ende der Datei ab und es wird in 13 Sekunden gesendet.) Und ich kann einen Upload auf eine statische HTML-Seite posten und er sendet gut (es wird nirgendwo gespeichert, weil die Formulardaten nicht verarbeitet werden, aber der Punkt ist, dass es nicht

Antworten:

1

Ich werde auch versuchen, die Einstellungen für die Abstimmung zu erklären: -

  • Maximale Anzahl von POST-Anforderungsparametern - Dies bezieht sich auf die maximale Anzahl von Attributen / Parametern, die über eine bestimmte Anforderung gesendet werden. Wird insbesondere beim Posten von Daten in einem Formular verwendet.
  • Maximale Größe der Post-Daten - Dies sind die maximalen Daten, die auf einem Server gepostet werden können. Dies ist die Summe aller Daten in einer bestimmten Form während einer POST-Anforderung.
  • Anforderungsdrosselschwelle - ColdFusion kann eingehende Anforderungen bei Bedarf drosseln (gewaltsam verlangsamen). Es können jedoch wirklich kleine Anforderungen (solche mit einer kleinen Nutzlast) unabhängig vom Drosselzustand zugelassen werden. Geben Sie die maximal zulässige Größe an (der Standardwert beträgt maximal 4 MB), damit kleine Anforderungen verarbeitet werden können.
  • Anforderungsdrosselspeicher - Geben Sie zum Drosseln von Anforderungen die maximale Speichermenge an, die der Drosselklappe zugewiesen ist. Wenn nicht genügend Gesamtspeicher verfügbar ist, werden ColdFusion-Warteschlangen angefordert, bis genügend Speicher frei ist (der Standardwert ist 200 MB). Es würde den Speicher nicht für Req1 reservieren, da er niedriger als der Schwellenwert ist.

Beachten Sie, dass es drei gleichzeitige Anforderungen Req1 (3 MB), Req2 (6 MB) und Req3 (9 MB) gibt. Mit den Standardeinstellungen, Request Throttle Threshold auf 4 MB eingestellt, reserviert ColdFusion (6 + 9 = 15 MB) im Drosselspeicher. Ebenso wird weiterhin der Anforderungsdrosselspeicher für alle gleichzeitigen Anforderungen hinzugefügt, und das Limit ist das, was wir für den Anforderungsdrosselspeicher festgelegt haben (Standard ist 200 MB).

Hoffe das hilft.

Anit Kumar
quelle
Dies ähnelt allen anderen Beschreibungen, die ich über Google gefunden habe. Alle lassen das eine weg, was ich wissen musste: Der Request Throttle Memory soll größer sein als die maximale Größe der Post-Daten. Außerdem vermute ich nur, dass der Request Throttle Memory kleiner als die JVM-Heap-Größe sein muss, sodass es unmöglich ist, wirklich große Dateien (in der Nähe oder größer als der RAM Ihres Servers) parallel hochzuladen. Trotzdem ist dies die bisher beste Antwort, also stimme ich zu und akzeptiere sie, wenn nichts anderes passiert, bevor das Kopfgeld
1

Sie können cftry-catch verwenden, um den Fehler zu erfassen und Ihren Benutzern eine benutzerdefinierte Nachricht anzuzeigen. Having said that, was die Werte für sind Maximale Anzahl der POST - Request - Parameter, Maximale Größe von POST - Daten, anfordern Drosselklappenschwelle und Request Gasspeicher . Verwenden Sie CF Std oder Ent und wie lautet die Version von ColdFusion?

Anit Kumar
quelle
Es ist nicht möglich, den Fehler mit cftry abzufangen. Die Verbindung bleibt hängen, ohne jemals die erste Zeile des CFM auszuführen. (Ich habe dort ein Cflog abgelegt, um herauszufinden, ob es so weit gekommen ist und nicht.) Ich werde der Frage einige Versionsinformationen hinzufügen.
Die Fehlermeldung "Datei zu groß" wird normalerweise vom Webserver ausgegeben, nicht von ColdFusion. Wenn Sie in den CF-Protokollen nichts gefunden haben, überprüfen Sie bitte die Ereignisanzeigeprotokolle. Es würde sicherlich einen Hinweis auf den Fehler geben. Haben Sie „Limitrequestbody“ von versuchen Apache . Sie können die Dateigröße auch am Ende des Webservers angeben.
Anit Kumar