マルチパートフォームの負荷テスト
-
20-09-2019 - |
質問
JMeter を使用して Rails アプリケーションの負荷テストをしようとしています。アプリケーションの重要な部分には、テキスト入力とファイルのアップロードの両方を含むフォームが含まれます。ブラウザでは問題なく動作しますが、そのページを JMeter に投稿しようとすると、Rails はマルチパート フォームのすべての部分を一時ファイルとして保存するため、文字列を検索し、代わりに一時ファイルを取得するときに中断が発生します。
違いは、ブラウザからは、テキスト入力を含むマルチパート リクエストの一部が次のように見えることであるようです。
-----------------------------7d93b4186074c
Content-Disposition: form-data; name="field_name"
test
-----------------------------7d93b4186074c
一方、JMeter からは次のようになります。
-----------------------------7d159c1302d0y0
Content-Disposition: form-data; name="field_name"
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
test
-----------------------------7d159c1302d0y0
したがって、Rails は前者を認識してプレーンテキスト値として解釈し、文字列として扱いますが、後者を認識して一時ファイルに保存しているようです。
ファイル以外のフィールドのマルチパート フォームで追加のヘッダーを送信しないように JMeter を説得する設定が見つかりませんでした。
Railsにこれらのヘッダーを無視させ、テキスト/プレーンテキストをテキストファイルではなく文字列として扱うように説得する方法はありますか?それとも、余分なヘッダーを削除するフィルターをコントローラーの前に置く簡単な方法ですか?
あるいは、ファイルのアップロードを含む Rails アプリケーションの負荷テストを行うためのより良いツールはありますか?
解決 3
があり、より良い方法であることが、私は、パラメータのハッシュ内の文字列にtext / plainの一時ファイルを回すためにクイックフィルタを追加してしまったことがあります:
def change_text_files_to_strings
params.each_pair do |key, value|
params[key] = value.read if (value.class.to_s=='Tempfile' && value.content_type.start_with?('text/plain') )
end
end
ところで、それはJMeterのは、ここに正しいことが判明し、誤ったレール:RFC 2388によると、マルチパートリクエスト内の各項目には、コンテンツタイプ(だけではなくファイル)を持っている必要がありますので、Railsは本当に使用するべきではありませんContent-Typeヘッダの存在は、それがファイルのかどうかを判断します。ああも。
他のヒント
は、あなただけのJMeterの「使用ブラウザ互換性のあるヘッダを」カチカチすることができ、これらの日をオンにします。自分自身にそこに多くの時間の地獄を保存していたかもしれない: - )
そこで、ソースコード内のJMeterのマルチパートリクエスト投稿部分をカスタマイズして、Railsが理解できるリクエストを出せるようにしました。以下のように変更は簡単ですが、Java/JMeter のコンパイル環境を作成するのに時間がかかりました。:(
とにかく、これで JMeter 経由でマルチパート ポストでファイルを正常にアップロードできるようになりました。
src/protocol/http/org/apache/jmeter/protocol/http/sampler/PostWriter.java 内
writeStartFileMultipart()
//writeln(out, "Content-Transfer-Encoding: binary"); // $NON-NLS-1$
writeFormMultipart()
/*****
writeln(out, "Content-Type: text/plain; charset=" + charSet); // $NON-NLS-1$
writeln(out, "Content-Transfer-Encoding: 8bit"); // $NON-NLS-1$
*****/
追伸
2.4 のビルド環境を作成するためのヒントは次のとおりです。
サードパーティのライブラリをコメントアウトするには、build.xml ファイルをチェックインします。
lib/xstream-1.3.1.jar をバイナリ アーカイブから lib/ ディレクトリにコピーします。
私はまた、ColdFusionがフォームデータの各部分と同様のヘッダ(マイナスコンテンツ転送エンコード)を送信したとして、上記の溶液を用います。より良い方法があるのだろうか。
EDIT:?これはRailsの3に固定されている場合は誰でも知っている。
あなたがエラーのどのような種類を得るのですか?
のようなものNoMethodError (undefined method `rewind' for "1":String):
あなたの問題を説明できるラックとの問題があります。 https://github.com/rack/rack/issuesearchを参照してください?状態=オープン&Q =#の問題を巻き戻し/ 116 の
我々はまた、同様の問題を抱えた上記の回答に加えて、我々はまた、その要求にHTTPヘッダーマネージャのX-CSRF-Token
を相関していました
我々が望んでいた倍の数の必要なメディアをアップロードすることに成功できます。