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.