0

Rails 3 + paperclip を使用して、ファイル管理アプリをホストしています。

ただし、ペーパークリップは大きなファイル (>= 200 MB) の処理に問題があるようです

開発環境では、次のようになります。

JVMDUMP006I Processing dump event "systhrow", detail "java/lang/OutOfMemoryError" - please wait.
JVMDUMP032I JVM requested Snap dump using '/home/ubuntu/upload/Snap.20130322.123321.12125.0001.trc' in response to an event
JVMDUMP010I Snap dump written to /home/ubuntu/upload/Snap.20130322.123321.12125.0001.trc
JVMDUMP032I JVM requested Heap dump using '/home/ubuntu/upload/heapdump.20130322.123321.12125.0002.phd' in response to an event
JVMDUMP010I Heap dump written to /home/ubuntu/uploadheapdump.20130322.123321.12125.0002.phd
JVMDUMP032I JVM requested Java dump using '/home/ubuntu/upload/javacore.20130322.123321.12125.0003.txt' in response to an event
JVMDUMP010I Java dump written to /home/ubuntu/upload/javacore.20130322.123321.12125.0003.txt
JVMDUMP013I Processed dump event "systhrow", detail "java/lang/OutOfMemoryError".
[2013-03-22 12:33:42] ERROR

実稼働環境では、このアプリをWARファイルとして展開し、Tomcat サーバーにアップロードしています。エラーは発生しませんが、アップロードされたファイルが破損しています。

これを修正する方法はありますか?

ありがとうございました!

アップデート

一部の tomcat コネクタ構成を変更したところ、代わりに次のエラーが発生しました。

IOError (Disk quota exceeded): app/controllers/submissions_controller.rb:73:in `create'

しかし、使用するのに十分なスペースがあることは 100% 確信しています。

4

1 に答える 1

1
  • 一部のプラットフォームでは、特にバイナリが別のボックスでビルドされ、sendfile サポートが壊れているマシンに移動された場合、ビルド システムが検出しなかった sendfile サポートが壊れている可能性があります。

  • Linux では、sendfile を使用すると、IPv6 を使用しているときに特定のネットワーク カードで TCP チェックサム オフロードのバグが発生します。

  • ネットワークにマウントされたディレクトリ (NFS や SMB など) では、カーネルが独自のキャッシュを介してネットワーク ファイルを提供できない場合があります。

useSendfile="false"の Tomcat コネクタに追加します。server.xml

<Connector  ...
       useSendfile="false"
/>

確認するその他の構成

  1. まともなメモリ割り当てとタイムアウト

    JAVA_OPTS="-server -Xms256m -Xmx1024m -XX:MaxPermSize=128m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"
    
  2. Tomcat コネクタのオプション

maxPostSize (104857600 == 100 メガバイト、デフォルト = 2 メガバイト)

コンテナーの FORM URL パラメーターの解析によって処理される POST の最大サイズ (バイト単位)。この属性を 0 以下の値に設定すると、この機能を無効にできます。指定しない場合、この属性は 2097152 (2 メガバイト) に設定されます。チェックする他の 2 つの構成は、タイムアウト制限と maxFileSizeLimit です。

disableUploadTimeout (false に設定されていないことを確認してください)

このフラグを使用すると、サーブレットの実行中に、サーブレット コンテナーが別の長い接続タイムアウトを使用できるようになります。これにより、最終的に、サーブレットが実行を完了するまでの時間が長くなったり、データのアップロード中にタイムアウトが長くなったりします。指定しない場合、この属性は「true」に設定されます。

maxHttpHeaderSize (2 倍にしてみてください)

要求および応答 HTTP ヘッダーの最大サイズ (バイト単位)。指定しない場合、この属性は 4096 (4 KB) に設定されます。

于 2013-03-22T22:08:28.467 に答える