使用paperclip上传大文件时出现JVM错误

时间:2013-03-22 21:50:29

标签: ruby-on-rails tomcat paperclip

我使用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%确定我有足够的空间可以使用。

1 个答案:

答案 0 :(得分:1)

  
      
  • 某些平台可能破坏了构建的sendfile支持   系统   没有检测到,特别是如果二进制文件是在另一个盒子上构建的   并且移动到这样一台具有破坏的sendfile支持的机器。

  •   
  • 在Linux上,使用sendfile会触发TCP校验和卸载错误   在使用IPv6时,在某些网卡上。

  •   
  • 使用网络安装的目录(例如NFS或SMB),内核   可能无法通过自己的缓存提供网络文件。

  •   

useSendfile="false"添加到server.xml

中的Tomcat连接器
<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连接器选项

  3.   

    maxPostSize (104857600 == 100兆字节,默认= 2兆字节)

         

    将由POST处理的POST的最大字节数   容器FORM URL参数解析。该功能可以被禁用   将此属性设置为小于或等于0的值。如果不是   指定,此属性设置为2097152(2兆字节)。另外两个   要检查的配置是超时限制和maxFileSizeLimit

         

    disableUploadTimeout (确保其未设置为false)

         

    此标志允许servlet容器使用   在servlet正在进行时,连接超时不同   执行,最终允许servlet更长的数量   时间来完成其执行,或在数据期间更长的超时   上传。如果未指定,则此属性设置为“true”。

         

    maxHttpHeaderSize (尝试加倍)

         

    请求和响应HTTP标头的最大大小,在   字节。如果未指定,则此属性设置为4096(4 KB)