Configurações do ColdFusion para uploads de arquivos grandes

8

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.


fonte
Duas perguntas: 1. Você tem certeza de que é o Cold Fusion, e não o servidor da web? e 2. Você analisou o tempo limite da solicitação?
Katherine Villyard
1
Tenho certeza. Não há tempo limite (o upload preenche uma janela TCP e depois pára. Provado com wireshark. Retire alguns bytes do final do arquivo e ele será enviado em 13 segundos.) E eu posso postar um upload em uma página HTML estática e enviar bem (ele não é salvo em qualquer lugar porque não há nada processar os dados do formulário, mas o ponto é que não faz stall.)

Respostas:

1

Também tentarei explicar as configurações de ajuste: -

  • Número máximo de parâmetros de solicitação POST - refere-se ao número máximo de atributos / parâmetros enviados por uma solicitação específica. Usado particularmente ao postar dados em um formulário.
  • Tamanho máximo dos dados de postagem - são os dados máximos que podem ser postados em um servidor. Esta é a soma de todos os dados em um formulário específico durante uma solicitação POST.
  • Solicitar limiar de aceleração - O ColdFusion pode limitar (reduzir a força) as solicitações recebidas, se necessário. No entanto, solicitações realmente pequenas (aquelas com uma pequena carga útil) podem ser permitidas, independentemente do estado do acelerador. Para permitir que pequenas solicitações sejam processadas, especifique o tamanho máximo permitido (o padrão é no máximo 4 MB).
  • Solicitar memória do acelerador - Para otimizar solicitações, especifique a quantidade máxima de memória alocada para o acelerador. Se não houver memória total disponível suficiente, o ColdFusion enfileira as solicitações até que haja memória suficiente (o padrão é 200 MB). Ele não reservaria a memória para Req1, pois é menor que Threshold.

Considere que há três solicitações simultâneas Req1 (3 MB), Req2 (6 MB) e Req3 (9 MB). Com as configurações padrão, Request Throttle Threshold configuradas para 4MB, o ColdFusion reserva (6 + 9 = 15MB) na Memória do acelerador. Da mesma forma, continuaria adicionando a Memória do acelerador de solicitações para todas as solicitações simultâneas e o limite é o que definimos para a Memória do acelerador de solicitações (o padrão é 200 MB)

Espero que isto ajude.

Anit Kumar
fonte
Isso é semelhante a todas as outras descrições que encontrei no google. Todos eles omitem a única coisa que eu precisava saber: que o Request Throttle Memory deveria ser maior que o Tamanho máximo dos dados da postagem. E também acho que o Request Throttle Memory deve ser menor que o tamanho da pilha da JVM, impossibilitando o upload de arquivos realmente grandes (próximos ou maiores que a RAM do servidor) em paralelo. No entanto, esta é a melhor resposta até agora, por isso estou votando e a aceitarei se nada mais acontecer antes que a recompensa
1

Você pode usar cftry-catch para capturar o erro e mostrar uma mensagem personalizada para seus usuários. Dito isto, quais são os valores definidos para Número máximo de parâmetros de solicitação POST, Tamanho máximo de dados de postagem, Limite de aceleração de solicitação e Memória de aceleração de solicitação . Você está usando CF Std ou Ent e qual é a versão do ColdFusion?

Anit Kumar
fonte
Não é possível capturar o erro com cftry. A conexão trava sem nunca executar a primeira linha do cfm. (Coloquei um cflog lá para descobrir se chegou tão longe e não chegou.) Vou adicionar algumas informações de versão à pergunta.
A mensagem de erro "Arquivo muito grande" geralmente é lançada pelo servidor da Web, não pelo ColdFusion. Se você não encontrou nada nos logs do CF, verifique os logs do Visualizador de Eventos. Certamente haveria alguma referência ao erro. Você tentou "LimitRequestBody" do Apache . Você também pode especificar o tamanho do arquivo no servidor da web.
Anit Kumar