Estou tentando configurar um servidor coldfusion para aceitar uploads de arquivos grandes e estou encontrando alguns limites. Aqui está o que eu observei até agora:
Existem duas configurações no Administrador do ColdFusion que limitam o tamanho dos uploads: "Tamanho máximo dos dados de postagem" e "Solicitar memória do acelerador". Se o tamanho do seu upload (incluindo a sobrecarga de HTTP) for maior do que qualquer uma dessas configurações, o upload será rejeitado. Não consigo entender por que precisamos de dois deles; qualquer um que esteja mais alto não tem nenhum efeito, tanto quanto eu possa dizer. O menor ganha.
Quando alguém tenta enviar um arquivo que é muito grande, ele não recebe uma mensagem de erro legal. O upload é interrompido para sempre depois de enviar cerca de 1 janela TCP de dados. E isso está muito mal. Mesmo depois que o cliente desiste e desconecta, o thread do apache associado ainda está amarrado (eu posso ver isso usando mod_status). Os encadeamentos presos continuam aumentando até que não haja mais nenhum para receber novas solicitações e o servidor precisa ser reiniciado.
O "Request Throttle" é uma coisa que eu realmente não entendo. Toda a documentação sobre isso fala disso como o tamanho de uma região de memória. Se é isso que acontece, não vejo como isso está relacionado ao tamanho dos arquivos. Ele sugere algo que eu simplesmente não quero acreditar: que o ColdFusion devora todo o arquivo enviado na memória antes de gravar qualquer coisa no disco. Nenhuma pessoa sensata faria isso, quando um loop de upload (ler um bloco de tamanho médio, gravá-lo em disco, repetir até terminar) é muito fácil. (Eu sei que a estrutura de um post HTTP multipart / form-data torna um pouco mais difícil, mas ... certamente uma grande empresa como a Adobe com um produto de desenvolvimento web pode fazer isso direito ... não é?)
Se o efeito slurping de todo o arquivo for realmente o que está acontecendo, como eles esperam que escolhamos um limite de tamanho viável? Permitir um gigabyte e alguns usuários simultâneos podem executar seu servidor sem memória, mesmo sem tentar. E o que vamos fazer, não permitir uploads de gigabytes? As pessoas têm vídeos para postar e não há tempo para editá-los!
INFORMAÇÕES ADICIONAIS
Aqui estão alguns números de versão.
servidor da Web:
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)
INFORMAÇÕES ADICIONAIS # 2
Não sei por que você gostaria de saber quais valores eu coloquei nos campos de limite, mas eles foram definidos para 200 MB por um tempo. Eu aumentei "Tamanho máximo de dados de postagem" para 2000 MB e isso não teve efeito. Eu já percebi que se eu aumentar "Request Throttle Memory" para 2000 MB, ele permitirá um upload maior. O que eu estou procurando aqui não é um rápido "coisas um número maior lá!" resposta, mas uma explicação detalhada do que essas configurações realmente significam e quais as implicações que elas têm para o uso da memória do servidor.
Por que o encadeamento do servidor trava permanentemente em vez de retornar uma mensagem de erro quando o limite é excedido pode ser uma questão separada. Eu assumi que isso seria um problema bem conhecido. Talvez eu deva perguntar primeiro se alguém mais pode reproduzi-lo. Eu nunca vi uma mensagem de erro "arquivo muito grande" retornada para um cliente do ColdFusion. É suposto ter um?
INFO ADICIONAL # 3
Alguma experimentação me levou a uma resposta parcial. A primeira coisa que estava faltando foi que "Request Throttle Memory" (RTM) faz algo útil se for definido maior do que "Tamanho máximo dos dados de postagem" (MSOPD). Na minha primeira rodada de testes, sem nenhuma pista sobre a relação entre eles, eu os fiz o contrário. Com o meu novo entendimento, posso ver que a relação RTM / MSOPD é o número de uploads simultâneos que serão permitidos se estiverem todos próximos do tamanho máximo.
Supondo que o "Request Throttle Memory" seja, na verdade, um buffer de memória, e não um arquivo temporário, isso significa que meus piores medos estavam corretos. Todo arquivo é mantido inteiramente na memória durante toda a duração do upload. Ninguém disse nada para me fazer acreditar de outra forma (embora eu também não veja ninguém pulando para dizer "sim, eles fizeram essa coisa estúpida")
Além disso, com esse novo entendimento, os uploads parados fazem algum sentido. O servidor não tem memória disponível para aceitar o upload, então ele simplesmente não lê o soquete. Os buffers TCP são preenchidos, o tamanho da janela se torna 0 e o cliente espera que ele seja aberto novamente, o que deve acontecer assim que o servidor começar a ler a solicitação. Mas no meu caso, por alguma razão, isso nunca acontece. O servidor esquece completamente o pedido, por isso apenas demora.
O caso de "Tamanho máximo de dados de postagem" sendo atingido ainda é um mistério. Solicitações que atingem um limite rígido não devem ser enfileiradas, apenas rejeitadas. E recebo uma mensagem de rejeição ("Tamanho da postagem excede o limite máximo de 200 MB") em server.log
. Mas, novamente, neste caso, o servidor parece esquecer a solicitação sem enviar um erro ao cliente.