Настройки ColdFusion для загрузки больших файлов

8

Я пытаюсь настроить сервер 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. Но опять же в этом случае сервер, похоже, забывает о запросе, не отправляя клиенту сообщение об ошибке.


источник
Два вопроса: 1. Вы уверены, что это Cold Fusion, а не сам веб-сервер? и 2. Вы смотрели на время ожидания запроса?
Кэтрин Вилльярд
1
Я уверен. Тайм-аута нет (загрузка заполняет одно окно TCP, а затем останавливается. Проверено с помощью wireshark. Отрежьте несколько байтов от конца файла, и он отправит за 13 секунд.) И я могу опубликовать загрузку на статической HTML-странице, и она отправит хорошо (он нигде не сохраняется, потому что ничего не обрабатывает данные формы, но дело в том, что он не останавливается.)

Ответы:

1

Я также постараюсь объяснить настройки для настройки: -

  • Максимальное количество параметров запроса POST - относится к максимальному количеству атрибутов / параметров, отправленных по конкретному запросу. Особенно используется при публикации данных в форме.
  • Максимальный размер почтовых данных - это максимальный объем данных, которые могут быть размещены на сервере. Это сумма всех данных в конкретной форме во время запроса POST.
  • Порог ограничения запросов - ColdFusion может регулировать (принудительно замедлять) входящие запросы, если это необходимо. Однако действительно небольшие запросы (с небольшой полезной нагрузкой) могут быть разрешены независимо от состояния газа. Чтобы разрешить обработку небольших запросов, укажите максимально допустимый размер (по умолчанию это максимум 4 МБ).
  • Request Throttle Memory (Запрашивать дроссельную память). Чтобы регулировать запросы, укажите максимальный объем памяти, выделенный для дроссельной заслонки. Если доступно недостаточно общей памяти, ColdFusion ставит в очередь запросы, пока не освободится достаточно памяти (по умолчанию 200 МБ). Он не зарезервирует память для Req1, так как он ниже порога.

Учтите, что существует три одновременных запроса Req1 (3 МБ), Req2 (6 МБ) и Req3 (9 МБ). При настройках по умолчанию, «Request Throttle Threshold», установленном на 4MB, ColdFusion зарезервирует (6 + 9 = 15MB) в памяти Throttle. Аналогичным образом, он будет продолжать добавлять Запрашивающую память запросов для всех одновременных запросов, и предел является тем, что мы установили для Запрашивающей памяти запросов (по умолчанию 200 МБ)

Надеюсь это поможет.

Анит Кумар
источник
Это похоже на все другие описания, которые я нашел через Google. Все они опускают одну вещь, которую мне нужно было знать: эта Запрашиваемая память дросселя должна быть больше, чем максимальный размер данных поста. И я также только предполагаю, что Request Throttle Memory должен быть меньше размера кучи JVM, что делает невозможной параллельную загрузку действительно больших файлов (около или больше, чем RAM вашего сервера). Тем не менее, это лучший ответ на данный момент, поэтому я проголосую за него и приму его, если ничего не произойдет до того, как
1

Вы можете использовать cftry-catch, чтобы зафиксировать ошибку и показать пользовательское сообщение. Сказав это, какие значения установлены для Максимального количества параметров запроса POST, Максимального размера данных поста, Порога Throttle Запроса и Запроса Throttle Запроса . Используете ли вы CF Std или Ent и какая версия ColdFusion?

Анит Кумар
источник
Невозможно отловить ошибку с помощью cftry. Соединение зависает, даже не выполнив первую строку cfm. (Я положил туда cflog, чтобы узнать, насколько далеко он зашел, а чего нет.) Я добавлю информацию о версии к этому вопросу.
Сообщение об ошибке «Файл слишком большой» обычно выдается веб-сервером, а не ColdFusion. Если вы не нашли ничего в журналах CF, проверьте журналы просмотра событий. Там наверняка будет какая-то ссылка на ошибку. Вы пробовали "LimitRequestBody" от Apache . Вы также можете указать размер файла в конце веб-сервера.
Анит Кумар