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.