大きなファイルをアップロードするためのColdFusionの設定


8

大きなファイルのアップロードを受け入れるように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ます。しかし、この場合も、サーバーはクライアントにエラーを送信せずに要求を忘れているようです。


2つの質問:1. Webサーバー自体ではなく、それがCold Fusionであることを確信していますか?および2.リクエストのタイムアウトを確認しましたか?
Katherine Villyard

1
私は確信しています。タイムアウトはありません(アップロードは1つのTCPウィンドウをいっぱいにしてから停止します。wiresharkで証明されています。ファイルの最後から数バイトを切り取って、13秒で送信します)。そして、アップロードを静的HTMLページに投稿して送信します細かいです(フォームデータを処理するものがないため、どこにも保存されませんが、失速しないことがポイントです。)

回答:


1

また、チューニングの設定についても説明します。

  • POSTリクエストパラメータの最大数 -これは、特定のリクエストで送信される属性/パラメータの最大数を指します。特に、フォームにデータを投稿するときに使用されます。
  • 投稿データの最大サイズ -これはサーバーに投稿できる最大データです。これは、POSTリクエスト中の特定の形式のすべてのデータの合計です。
  • リクエストスロットルしきい値 -ColdFusionは、必要に応じて受信リクエストをスロットル(強制的にスローダウン)できます。ただし、スロットルの状態に関係なく、本当に小さなリクエスト(ペイロードが小さいリクエスト)は通過できます。小さなリクエストを処理できるようにするには、最大許容サイズを指定します(デフォルトは最大4 MB)。
  • リクエストスロットルメモリ - リクエストをスロットルするには、スロットルに割り当てるメモリの最大量を指定します。十分な合計メモリが利用できない場合、ColdFusionは十分なメモリが解放されるまでリクエストをキューに入れます(デフォルトは200 MB)。しきい値より低いため、Req1のメモリを予約しません。

Req1(3 MB)、Req2(6 MB)、およびReq3(9 MB)の3つの同時要求があることを考慮してください。デフォルトの設定では、リクエストスロットルしきい値は4MBに設定されており、ColdFusionはスロットルメモリに(6 + 9 = 15MB)を予約します。同様に、すべての同時リクエストにリクエストスロットルメモリを追加し続け、制限はリクエストスロットルメモリに設定したものです(デフォルトは200 MB)。

お役に立てれば。


これは、Googleで見つけた他のすべての説明と同様です。それらはすべて、私が知っておく必要がある1つのことを省略しています。そのリクエストスロットルメモリは、ポストデータの最大サイズより大きいはずです。また、リクエストスロットルメモリはJVMヒープサイズよりも小さくなければならず、本当に大きなファイル(サーバーのRAMの近くまたはそれ以上)を並行してアップロードできないことも推測しています。それでも、これが今のところ最良の答えです。私はそれを賛成し、賞金がアップする前に他に何も起こらなければ受け入れます

1

cftry-catchを使用してエラーをキャプチャし、カスタムメッセージをユーザーに表示できます。それでも、POSTリクエストパラメータの最大数、ポストデータの最大サイズ、リクエストスロットルしきい値、リクエストスロットルメモリに設定される値は何ですか。CF StdまたはEntを使用していますか、ColdFusionのバージョンは何ですか?


cftryでエラーをキャッチすることはできません。接続は、cfmの最初の行を実行せずにハングします。(そこまで到達したかどうかを確認するために、そこにcflogを配置しました。)バージョン情報を質問に追加します。

「ファイルが大きすぎます」というエラーメッセージは通常、ColdFusionではなくWebサーバーによってスローされます。CFログに何も見つからなかった場合は、イベントビューアのログを確認してください。間違いなくエラーへの参照があるでしょう。Apacheの "LimitRequestBody"を試しましたか。ウェブサーバー側でもファイルサイズを指定できます。
Anit Kumar 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.