Configurações do ColdFusion para uploads grandes de arquivos

7

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.

    
por Wumpus Q. Wumbley 14.03.2014 / 21:15

2 respostas

2

Eu também tentarei explicar as configurações para o ajuste: -

  • Número máximo de parâmetros de solicitação POST - refere-se ao número máximo de atributos / parâmetros enviados em uma solicitação específica. Usado particularmente, ao postar dados em um formulário.
  • Tamanho máximo de dados de postagem - esses 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 Limite de Aceleração - O ColdFusion pode acelerar (desacelerar forçadamente) solicitações de entrada, 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 pequenos pedidos sejam processados, especifique o tamanho máximo permitido (o padrão é no máximo 4 MB).
  • Solicitar memória de aceleração - Para controlar as solicitações, especifique a quantidade máxima de memória alocada para o acelerador. Se não houver memória total suficiente disponível, o ColdFusion enfileira as solicitações até que haja memória suficiente livre (o padrão é 200 MB). Você não reservaria a memória para Req1, pois ela é inferior ao Limite.

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, Solicitar Limite de Aceleração definido para 4 MB, o ColdFusion reservará (6 + 9 = 15 MB) na Memória do Acelerador. Da mesma forma, ele continuaria adicionando o Request Throttle Memory para todos os pedidos simultâneos e o limite é o que definimos para Request Throttle Memory (o padrão é 200 MB)

Espero que isso ajude.

    
por 17.03.2014 / 22:46
1

Você pode usar o cftry-catch para capturar o erro e mostrar uma mensagem personalizada para seus usuários. Dito isso, 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, Solicitar Limite de Aceleração e Solicitar Memória de Aceleração . Você está usando CF Std ou Ent e qual é a versão do ColdFusion?

    
por 15.03.2014 / 00:55