Я пытаюсь настроить сервер Coldfusion для приема загрузок больших файлов, и я сталкиваюсь с некоторыми ограничениями. Вот что я наблюдал до сих пор:
В ColdFusion Administrator есть две настройки, ограничивающие размер загружаемых файлов: «Максимальный размер данных публикации» и «Запрос памяти газа». Если размер вашей загрузки (включая издержки HTTP) больше, чем один из этих параметров, загрузка отклоняется. Я не могу понять, почему нам нужно 2 из них; Насколько я могу судить, тот, кто находится выше, не имеет никакого эффекта. Нижний побеждает.
Когда кто-то пытается загрузить слишком большой файл, у него не появляется хорошее сообщение об ошибке. Загрузка просто зависает навсегда после отправки около 1 TCP окна данных. И это висит очень плохо. Даже после того, как клиент сдается и отключается, связанный поток Apache все еще связан (я могу видеть это, используя mod_status). Застрявшие потоки продолжают накапливаться до тех пор, пока не останется никого, чтобы принимать новые запросы, и сервер должен быть перезапущен.
«Запрос газа» - вещь, которую я действительно не понимаю. Вся документация об этом говорит о размере области памяти. Если это так, то я не вижу, как это связано с размерами файлов. Он намекает на то, во что я просто не хочу верить: что ColdFusion выкладывает весь загруженный файл в память перед записью любого из них на диск. Ни один здравомыслящий человек не сделает этого, когда цикл загрузки (прочитать блок среднего размера, записать его на диск, повторить до конца) настолько прост. (Я знаю, что структура HTTP-сообщения multipart / form-data делает его немного сложнее, но ... конечно, большая компания, такая как Adobe, имеющая продукт для веб-разработки, может сделать это правильно ... не так ли?)
Если на самом деле происходит разболтывание целого файла, как они ожидают, что мы выберем допустимый предел размера? Разрешить гигабайт и несколько одновременных пользователей могут запустить ваш сервер из памяти, даже не пытаясь. И что мы будем делать, а не разрешать гигабайтную загрузку? У людей есть видео для публикации и нет времени на их редактирование!
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Вот некоторые номера версий.
Веб сервер:
Server: Apache/2.2.24 (Win64) mod_jk/1.2.32
Холодный синтез:
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)
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ № 2
Я не знаю, почему вы хотите узнать, какие значения я поместил в поля пределов, но какое-то время они оба были установлены на 200 МБ. Я увеличил «Максимальный размер почтовых данных» до 2000 МБ, и это не дало эффекта. Я уже понял, что если я увеличу «Запросить память дросселя» до 2000 МБ, это позволит увеличить загрузку. То, что я ищу здесь, - это не быстрое «запихнуть туда большее число!» ответ, но подробное объяснение того, что на самом деле означают эти настройки и как они влияют на использование памяти сервером.
Почему поток сервера останавливается навсегда вместо того, чтобы возвращать сообщение об ошибке при превышении лимита, может быть отдельным вопросом. Я предполагал, что это будет хорошо известная проблема. Может быть, я должен сначала спросить, может ли кто-нибудь еще воспроизвести это. Я никогда не видел сообщение об ошибке «файл слишком большой», возвращенный клиенту из ColdFusion. Это предполагается иметь один?
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ # 3 Некоторые эксперименты привели меня к частичному ответу. Первое, чего мне не хватало, было то, что «Запрос памяти газа» (RTM) делает что-то полезное, если оно установлено выше «Максимальный размер данных поста» (MSOPD). В моем первом раунде тестов, не имея представления о взаимоотношениях между ними, у меня были их наоборот. С моим новым пониманием я могу видеть, что отношение RTM / MSOPD - это количество одновременных загрузок, которые будут разрешены, если они все близки к максимальному размеру.
Предполагая, что «Request Throttle Memory» на самом деле является буфером памяти, а не временным файлом, это означает, что мои худшие опасения были верны. Каждый файл хранится полностью в памяти на протяжении всего времени его загрузки. Никто не сказал ничего, чтобы заставить меня поверить в обратное (хотя я также не вижу, чтобы кто-то подпрыгивал, чтобы сказать «да, они сделали эту глупость»)
Также с этим новым пониманием, застопоренные загрузки имеют некоторый смысл. Сервер не имеет доступной памяти для принятия загрузки, поэтому он просто не читает из сокета. Буферы TCP заполняются, размер окна становится равным 0, и клиент ожидает его открытия снова, что должно произойти, как только сервер начнет читать запрос. Но в моем случае по какой-то причине этого никогда не происходит. Сервер полностью забывает о запросе, поэтому он просто задерживается.
Случай с «максимальным размером почтовых данных» все еще остается загадкой. Запросы, которые достигли жесткого предела, не должны быть поставлены в очередь, просто отклонены. И я получаю сообщение об отказе ( «Post Размер превышает максимальный предел 200 МБ.») В server.log
. Но опять же в этом случае сервер, похоже, забывает о запросе, не отправляя клиенту сообщение об ошибке.