大きなファイルのアップロードを受け入れるようにcoldfusionサーバーをセットアップしようとしていますが、いくつかの制限にぶつかっています。これが私がこれまでに観察したものです:
アップロードのサイズを制限するColdFusion Administratorの設定には、「投稿データの最大サイズ」と「リクエストスロットルメモリ」の2つがあります。アップロードのサイズ(HTTPオーバーヘッドを含む)がこれらの設定のいずれかよりも大きい場合、アップロードは拒否されます。これらのうち2つが必要な理由がわかりません。どちらを高く設定しても、私が知る限り、効果はありません。下の方が勝つ。
誰かが大きすぎるファイルをアップロードしようとすると、素敵なエラーメッセージが表示されません。約1 TCPウィンドウ分のデータを送信した後、アップロードが永久にハングします。そして、それは本当に悪い方法でハングします。クライアントがギブアップして切断した後でも、関連するapacheスレッドは引き続き拘束されています(これはmod_statusを使用して確認できます)。スタックしたスレッドは、新しい要求を受け取るためのものがなくなり、サーバーを再起動する必要があるまで、ビルドを続けます。
「リクエストスロットル」は、私にはよくわかりません。それに関するすべてのドキュメントは、メモリ領域のサイズとしてそれについて語っています。それがそうであるなら、私はそれがファイルサイズにどのように関連しているかを見ることができません。これは、私が信じたくないことを示唆しています。ColdFusionは、アップロードされたファイル全体をディスクに書き込む前に、メモリに丸呑みします。アップロードループ(中サイズのブロックを読み取り、ディスクに書き込み、完了するまで繰り返す)が非常に簡単な場合、正気な人はそれを行いません。(HTTPマルチパート/フォームデータポストの構造が少し難しくなることは知っていますが、Web開発製品を使用しているAdobeのような大企業がきっとこれを正しく行うことができます...できませんか?)
ファイル全体の丸呑みが実際に起こっていることである場合、彼らはどのようにして実行可能なサイズ制限を選択することを期待していますか?ギガバイトを許可すると、数人の同時ユーザーがサーバーをメモリ不足で実行することができます。そして、ギガバイトのアップロードを許可しないのですか?投稿する動画があり、編集する時間はありません。
追加情報
ここにいくつかのバージョン番号があります。
ウェブサーバー:
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)
追加情報#2
制限フィールドに入力した値を知りたいのですが、どちらもしばらくの間200 MBに設定されていました。「投稿データの最大サイズ」を2000MBに増やしても効果がありませんでした。「Request Throttle Memory」を2000 MBに増やすと、より大きなアップロードが可能になることはすでにわかっています。私がここで探しているのは、すぐに「そこに大きな数字を入れる」ことではありません。回答ですが、これらの設定が実際に何を意味するか、およびサーバーのメモリ使用量にどのような影響があるかについての詳細な説明です。
制限を超えたときにサーバースレッドがエラーメッセージを返さずに永久に停止する理由は、別の質問である可能性があります。これはよく知られた問題だと思いました。たぶん、他の誰かがそれを再現できるかどうか最初に尋ねるべきでしょう。ColdFusionからクライアントに返される「ファイルが大きすぎます」というエラーメッセージを見たことがありません。持っているはずですか?
追加情報#3 いくつかの実験により、部分的な答えが得られました。最初に欠けていたのは、「リクエストスロットルメモリ」(RTM)が「ポストデータの最大サイズ」(MSOPD)よりも大きく設定されている場合に役立つものであるということです。最初のテストでは、それらの関係についての手がかりがなく、逆にしてもらいました。私の新しい理解により、RTM / MSOPDの比率は、すべてが最大サイズに近い場合に許可される同時アップロードの数であることがわかります。
「リクエストスロットルメモリ」が実際には一時ファイルではなくメモリバッファであると仮定すると、これは私の最悪の恐れが正しかったことを意味します。アップロード中は、すべてのファイルが完全にメモリに保持されます。だれも私にそう思わないと信じさせるようなことは何もしていません(ただし、「はい、彼らがこの愚かなことをした」と言うためにジャンプする人を見かけませんでした)
また、この新しい理解により、停止されたアップロードはある程度の意味があります。サーバーには、アップロードを受け入れるためのメモリがありません。そのため、ソケットからの読み取りは行われません。TCPバッファがいっぱいになり、ウィンドウサイズが0になり、クライアントはそれが再び開くのを待ちます。これは、サーバーが要求の読み取りを開始するとすぐに発生します。しかし、私の場合、何らかの理由で、それは決して起こりません。サーバーはリクエストを完全に忘れているので、そのまま残ります。
「ポストデータの最大サイズ」がヒットするケースはまだ謎です。ハード制限に達したリクエストはキューに入れられず、拒否されます。で、拒否メッセージ(「投稿サイズが上限の200 MBを超えています。」)が表示されserver.log
ます。しかし、この場合も、サーバーはクライアントにエラーを送信せずに要求を忘れているようです。