Configuración de ColdFusion para cargas de archivos grandes

8

Estoy tratando de configurar un servidor de ColdFusion para aceptar cargas de archivos grandes, y estoy tropezando con algunos límites. Esto es lo que he observado hasta ahora:

Hay dos configuraciones en ColdFusion Administrator que limitan el tamaño de las cargas: "Tamaño máximo de datos de publicación" y "Solicitar memoria del acelerador". Si el tamaño de su carga (incluida la sobrecarga de HTTP) es mayor que cualquiera de esas configuraciones, la carga se rechaza. No puedo entender por qué necesitamos 2 de estos; el que sea más alto no tiene ningún efecto por lo que puedo decir. El inferior gana.

Cuando alguien intenta cargar un archivo que es demasiado grande, no recibe un buen mensaje de error. La carga se cuelga para siempre después de enviar aproximadamente 1 ventana TCP de datos. Y se cuelga de una manera realmente mala. Incluso después de que el cliente se da por vencido y se desconecta, el hilo de apache asociado todavía está atado (puedo ver esto usando mod_status). Los subprocesos atascados siguen acumulándose hasta que no quedan ninguno para recibir nuevas solicitudes y el servidor debe reiniciarse.

El "Acelerador de solicitud" es algo que realmente no entiendo. Toda la documentación al respecto habla del tamaño de una región de memoria. Si eso es lo que es, entonces no puedo ver cómo se relaciona con los tamaños de archivo. Sugiere algo que simplemente no quiero creer: que ColdFusion sorbe todo el archivo cargado en la memoria antes de escribirlo en el disco. Ninguna persona sensata haría eso, cuando un ciclo de carga (leer un bloque de tamaño mediano, escribirlo en el disco, repetir hasta que termine) es tan fácil. (Sé que la estructura de una publicación HTTP multipart / form-data lo hace un poco más difícil, pero ... seguramente una gran empresa como Adobe con un producto de desarrollo web puede hacer esto bien ... ¿no?)

Si la extracción de archivos completos es en realidad lo que está sucediendo, ¿cómo esperan que elijamos un límite de tamaño viable? Permita un gigabyte y algunos usuarios simultáneos pueden ejecutar su servidor sin memoria sin siquiera intentarlo. ¿Y qué vamos a hacer, no permitir cargas de gigabytes? ¡La gente tiene videos para publicar y no hay tiempo para editarlos!

INFORMACIÓN ADICIONAL

Aquí hay algunos números de versión.

Servidor web:

Server: Apache/2.2.24 (Win64) mod_jk/1.2.32

Fusión fría:

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)

INFORMACIÓN ADICIONAL # 2

No sé por qué querrías saber qué valores he puesto en los campos de límite, pero ambos estuvieron configurados en 200 MB por un tiempo. Aumenté el "Tamaño máximo de datos de publicación" a 2000 MB y no tuvo efecto. Ya descubrí que si aumento "Solicitar memoria del acelerador" a 2000 MB, permitirá una carga más grande. Lo que estoy buscando aquí no es un rápido "¡ingrese un número mayor allí!" respuesta, pero una explicación detallada de lo que realmente significan estas configuraciones y qué implicaciones tienen para el uso de memoria del servidor.

Por qué el hilo del servidor se detiene para siempre en lugar de devolver un mensaje de error cuando se excede el límite podría ser una pregunta separada. Asumí que este sería un problema bien conocido. Tal vez debería preguntar primero si alguien más puede reproducirlo. Nunca he visto un mensaje de error "archivo demasiado grande" devuelto a un cliente desde ColdFusion. ¿Se supone que tiene uno?

INFORMACIÓN ADICIONAL # 3 Algunos experimentos me han llevado a una respuesta parcial. Lo primero que me faltaba era que "Solicitar memoria del acelerador" (RTM) hace algo útil si se establece más alto que "Tamaño máximo de datos de publicación" (MSOPD). En mi primera ronda de pruebas, sin tener idea de la relación entre ellos, los tuve al revés. Con mi nuevo entendimiento, puedo ver que la relación RTM / MSOPD es la cantidad de cargas simultáneas que se permitirán si todas están cerca del tamaño máximo.

Suponiendo que la "Solicitud de memoria del acelerador" es en realidad un búfer de memoria, y no un archivo temporal, esto significa que mis peores temores eran correctos. Cada archivo se mantiene completamente en la memoria durante la duración completa de su carga. Nadie ha dicho nada para hacerme creer lo contrario (aunque tampoco veo a nadie saltando para decir "sí, hicieron esta estupidez")

También con esta nueva comprensión, las cargas estancadas tienen sentido. El servidor no tiene memoria disponible para aceptar la carga, por lo que simplemente no lee desde el socket. Las memorias intermedias TCP se llenan, el tamaño de la ventana se convierte en 0 y el cliente espera a que se abra nuevamente, lo que debería suceder tan pronto como el servidor comience a leer la solicitud. Pero en mi caso, por alguna razón, eso nunca sucede. El servidor se olvida por completo de la solicitud, por lo que solo permanece.

El caso del "tamaño máximo de los datos de publicación" aún es un misterio. Las solicitudes que alcanzan un límite estricto no deben ser puestas en cola, solo rechazadas. Y recibo un mensaje de rechazo ("El tamaño de la publicación excede el límite máximo de 200 MB") en server.log. Pero nuevamente, en este caso, el servidor parece olvidarse de la solicitud sin enviar un error al cliente.


fuente
Dos preguntas: 1. ¿Está seguro de que es Cold Fusion y no el servidor web en sí? y 2. ¿Has mirado el tiempo de espera de la solicitud?
Katherine Villyard
1
Estoy seguro. No hay tiempo de espera (la carga llena una ventana TCP y luego se detiene. Probado con wireshark. Cortar unos pocos bytes al final del archivo y se envía en 13 segundos). Y puedo publicar una carga en una página HTML estática y envía bien (que no se guardan en ninguna parte, porque no hay nada procesamiento de los datos del formulario, pero el punto es que no lo hace la parada.)

Respuestas:

1

También intentaré explicar la configuración para la optimización: -

  • Número máximo de parámetros de solicitud POST : se refiere al número máximo de atributos / parámetros enviados a través de una solicitud particular. Se usa particularmente, al publicar datos en un formulario.
  • Tamaño máximo de datos de publicación : estos son los datos máximos que se pueden publicar en un servidor. Esta es la suma de todos los datos en una forma particular durante una solicitud POST.
  • Umbral de aceleración de solicitud : ColdFusion puede acelerar (ralentizar con fuerza) las solicitudes entrantes si es necesario. Sin embargo, se pueden permitir solicitudes realmente pequeñas (aquellas con una carga útil pequeña) independientemente del estado del acelerador. Para permitir que se procesen solicitudes pequeñas, especifique el tamaño máximo permitido (el valor predeterminado es un máximo de 4 MB).
  • Solicitar memoria del acelerador : para limitar las solicitudes, especifique la cantidad máxima de memoria asignada para el acelerador. Si no hay suficiente memoria total disponible, ColdFusion pone en cola las solicitudes hasta que haya suficiente memoria libre (el valor predeterminado es 200 MB). No reservaría la memoria para Req1, ya que es inferior al Umbral.

Tenga en cuenta que hay tres solicitudes simultáneas Req1 (3 MB), Req2 (6 MB) y Req3 (9 MB). Con la configuración predeterminada, el Umbral de solicitud de aceleración establecido en 4 MB, ColdFusion se reservará (6 + 9 = 15 MB) en la memoria del acelerador. Del mismo modo, seguiría agregando la Memoria de solicitud de aceleración para todas las solicitudes simultáneas y el límite es lo que hemos establecido para Solicitar memoria de aceleración (el valor predeterminado es 200 MB)

Espero que esto ayude.

Anit Kumar
fuente
Esto es similar a todas las otras descripciones que encontré a través de google. Todos ellos omiten lo único que necesitaba saber: se supone que la memoria de solicitud de aceleración es mayor que el tamaño máximo de los datos de publicación. Y también supongo que Request Throttle Memory debe ser más pequeño que JVM Heap Size, por lo que es imposible cargar archivos verdaderamente grandes (cercanos o más grandes que la RAM de su servidor) en paralelo. Sin embargo, esta es la mejor respuesta hasta el momento, así que estoy Upvoting y voy a aceptarlo si no ocurre nada más antes de recompensas es de hasta
1

Puede usar cftry-catch para capturar el error y mostrar un mensaje personalizado a sus usuarios. Dicho esto, ¿cuáles son los valores establecidos para Número máximo de parámetros de solicitud POST, Tamaño máximo de datos de publicación, Umbral de aceleración de solicitud y Memoria de aceleración de solicitud . ¿Está utilizando CF Std o Ent y cuál es la versión de ColdFusion?

Anit Kumar
fuente
No es posible detectar el error con cftry. La conexión se bloquea sin ejecutar nunca la primera línea del cfm. (Puse un cflog allí para averiguar si llegó tan lejos y no lo hizo). Agregaré información de la versión a la pregunta.
El mensaje de error "Archivo demasiado grande" generalmente lo genera el servidor web, no ColdFusion. Si no encontró nada en los registros de CF, compruebe los registros del Visor de eventos. Seguramente habría alguna referencia al error. ¿Intentó "LimitRequestBody" de Apache . También puede especificar el tamaño del archivo al final del servidor web.
Anit Kumar