Estou tentando configurar um servidor de fusão a frio para aceitar uploads de arquivos grandes e estou esbarrando em alguns limites. Aqui está o que eu observei até agora:
Existem duas configurações no ColdFusion Administrator 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 HTTP) for maior que uma dessas configurações, o upload será rejeitado. Não consigo descobrir por que precisamos de dois deles; o que for mais alto não tem nenhum efeito, até onde eu sei. O mais baixo vence.
Quando alguém tenta fazer upload de um arquivo muito grande, não recebe uma boa mensagem de erro. O upload é interrompido para sempre após o envio de cerca de 1 janela TCP de dados. E trava de uma maneira muito ruim. Mesmo depois que o cliente desiste e desconecta, o segmento apache associado ainda está vinculado (eu posso ver isso usando mod_status). Os encadeamentos travados continuam se acumulando até que não haja mais nenhum para receber novas solicitações e o servidor precise ser reiniciado.
O "Request Throttle" é uma coisa que eu realmente não entendo. Toda a documentação sobre ele fala dele como o tamanho de uma região de memória. Se é isso o que é, não vejo como está relacionado ao tamanho dos arquivos. Isso sugere algo que eu simplesmente não quero acreditar: o ColdFusion absorve todo o arquivo carregado na memória antes de gravá-lo no disco. Nenhuma pessoa sã faria isso, quando um loop de upload (leia um bloco de tamanho médio, grave-o no disco, repita até terminar) é tão fácil. (Eu sei que a estrutura de uma postagem HTTP multipart / dados de formulário 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 é realmente o que está acontecendo com a perda de arquivos inteiros, como eles esperam que escolhamos um limite de tamanho viável? Permita um gigabyte e alguns usuários simultâneos podem ficar sem memória no servidor 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 web:
Server: Apache/2.2.24 (Win64) mod_jk/1.2.32
Fusão a frio:
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 coloquei nos campos de limite, mas ambos foram definidos para 200 MB por um tempo. Aumentei o "Tamanho máximo dos dados de postagem" para 2000 MB e não teve efeito. Eu já descobri que se eu aumentar "Request Throttle Memory" para 2000 MB, isso permitirá um upload maior. O que estou procurando aqui não é um rápido "material com um número maior lá dentro!" resposta, mas uma explicação detalhada do que essas configurações realmente significam e que implicações elas têm para o uso da memória do servidor.
Por que o encadeamento do servidor é interrompido para sempre em vez de retornar uma mensagem de erro quando o limite é excedido pode ser uma pergunta separada. Presumi que este seria um problema bem conhecido. Talvez eu deva perguntar primeiro se mais alguém pode reproduzi-lo. Nunca vi uma mensagem de erro "arquivo muito grande" retornada a um cliente do ColdFusion. É suposto ter um?
INFORMAÇÕES ADICIONAIS # 3 Algumas experiências me levaram a uma resposta parcial. A primeira coisa que eu perdi foi que "Request Throttle Memory" (RTM) faz algo útil se for definido como mais alto que "Tamanho máximo de dados de postagem" (MSOPD). Na minha primeira rodada de testes, sem nenhuma pista sobre o relacionamento entre eles, eu os fiz ao contrário. Com meu novo entendimento, posso ver que a proporção RTM / MSOPD é o número de uploads simultâneos que serão permitidos se todos estiverem perto do tamanho máximo.
Supondo que a "Solicitação de Memória do Acelerador" seja realmente 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 seu upload. Ninguém disse nada para me fazer acreditar no contrário (embora eu também não veja ninguém pulando para dizer "sim, eles fizeram essa coisa estúpida")
Também com esse novo entendimento, os envios paralisados fazem algum sentido. O servidor não tem memória disponível para aceitar o upload, portanto, simplesmente não lê no 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 algum motivo, isso nunca acontece. O servidor esquece completamente da solicitação, para que ela permaneça.
O caso de "Tamanho máximo dos dados de postagem" ser atingido ainda é um mistério. Solicitações que atingem um limite máximo não devem ser enfileiradas, apenas rejeitadas. E recebo uma mensagem de rejeição ("O tamanho da postagem excede o limite máximo de 200 MB.") Em server.log
. Mas, novamente, nesse caso, o servidor parece esquecer a solicitação sem nunca enviar um erro ao cliente.