問題
大きなテキストフィールドにフィクスチャをロードすると、フィクスチャ処理プロセスがクラッシュし、フィクスチャ(.yml)ファイルが破損することさえあります。
環境
ruby 1.9.3p194(2012-04-20リビジョン35410)[x86_64-darwin10.8.0]; レール3.2.6; OSX 10.6.8; WebBrick ; およびMySQL― 8 Gb RAM
バックグラウンド
1:私たちのプロジェクトは、定期的に5〜10,000語を超える可能性のある多数の記事を表示します。
2:レコードに割り当てられたエスケープされたコンテンツ(適度なボリュームであっても)は、フィクスチャプロセスをクラッシュさせます。
3:rake db:fixtures:loadは、サブジェクト.ymlファイルでクラッシュし、次のエラー/警告が表示されます。応答本文のコンテンツの長さを判別できませんでした。応答のcontent-lengthを設定するか、Response#chunked=trueを設定します。
4:この資料を1,000語以下の非常に控えめなサイズのテキストフィールドに分割しても、db:fixtures:loadはサブジェクト.ymlファイルでクラッシュします。
5: ファイルはクラッシュによって破損することがよくあります。たとえば、空のフィールド割り当てを使用してフィクスチャを最初から再構築できます。見かけの処理量の制限に達するまで、一度に1つのフィールドを追加して処理(db:fixtures:load)できます。これにより、最終的にフィクスチャの読み込みプロセスがクラッシュすると、ファイルの最初の数文字に誤った文字が報告されることがあります。 ; 最後のフィールド割り当てを削除しても、そのファイルは実行されなくなります。
6:実験により、フィクスチャが単一のレコードに割り当てることができるymlには約50kの制限があることが確認されています。複数のレコードに正常に割り当てるymlファイルはたくさんありますが、1つのレコードに5万を超えるファイルを正常に割り当てるものはありません。このエクスペリエンスは、数十のテーブルにわたって均一です。
6.1:たとえば、そのようなしきい値を提案するプリンシパルファイルは、単一のレコードのみを作成します。
6.1.1: 空のフィールドの内容をすべてのテキストフィールドに割り当てると、rake db:fixtures:loadはそのテキストフィールドのないレコードを作成することに成功します。
6.1.2:しかし、その単一のレコードに挿入されるサイズ(k)をフィールドごとに増やすと、50kのしきい値(約)を超えるとすぐに、プロセスがクラッシュして次のエラーが発生します。
レーキが中止されました!Mysql2 :: Error:ストレージエンジンからエラー139を取得しました:INSERT INTO
[table_name]
6.1.3: それでも、MySQLバッファサイズを増やしても問題は解決していません。まったく同じ制限があります。
6.1.3.1:my.cnfのMySQLバッファサイズは次のとおりです。
[mysqld]
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
6.1.4: 次のようにwebrick/httpresponse.rbのすべてのインスタンスでチャンクをtrueに設定しました。
def initialize(config)
@config = config
@logger = config[:Logger]
@header = Hash.new
@status = HTTPStatus::RC_OK
@reason_phrase = nil
@http_version = HTTPVersion::convert(@config[:HTTPVersion])
@body = ''
@keep_alive = true
@cookies = []
@request_method = nil
@request_uri = nil
@request_http_version = @http_version # temporary
@chunked = true # @chunked = false
@filename = nil
@sent_size = 0
end
これらの試みはいずれも問題に影響を与えませんでした。
7: したがって、1Mを超えるymlファイルの数があるため、単一のレコードに割り当てられたkにしきい値が適用されると推測します。
関連する問題?
8: 他の質問がこれと同じ「応答のコンテンツの長さを設定する」警告/エラーを報告しているのがわかります。しかし、私が読んだインスタンスは、WebBrickでページを表示しているときに発生したエラーを報告しています。これは、私たちの状況ではまったく当てはまりません(ただし、現在WebBrickを使用しています)。Mongrelを使用していたときにも同じ問題が発生しました。しかし、私たちの問題がローカルのRubyWebサーバーに関連しているという証拠はまったく見当たりません。
9: 204_304_keep_alive.patch:Webサーバープロセスに起因するこのエラーの発生に苦しんでいる人々が204_304_keep_alive.patchを適用することによってそれを修正していることもわかります。ただし、特にWebサーバープロセスでエラー状態が発生していないため、このパッチは問題に関連する場合と関連しない場合があります。
10:いくつかのOSXシステム、および以前のRuby 1.8 /Rails2で同じ問題が発生しました。
質問
他の人は、フィクスチャを含む単一のレコードに50kを割り当てている必要があります。
この非常に厄介な問題を克服するために、Ruby / Rails / OSX / MySQL環境で何を構成または変更する必要があるかをすぐに知っている人はいますか?