Я пытаюсь настроить сервер холодного слияния для загрузки больших файлов, и у меня есть некоторые ограничения. Вот что я наблюдал до сих пор:
В ColdFusion Administrator есть две настройки, ограничивающие размер загружаемых данных: «Максимальный размер данных публикации» и «Запрашивать память». Если размер вашей загрузки (включая накладные расходы HTTP) превышает любой из этих параметров, загрузка отклоняется. Я не могу понять, зачем нам два из них; какой бы из них ни был установлен выше, насколько я могу судить, не имеет никакого эффекта. Побеждает нижний.
Когда кто-то пытается загрузить слишком большой файл, он не получает приятного сообщения об ошибке. Загрузка просто зависает навсегда после отправки данных размером около 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 Некоторые эксперименты привели меня к частичному ответу. Первое, чего мне не хватало, это то, что "Request Throttle Memory" (RTM) делает что-то полезное, если он установлен выше чем "Максимальный размер почтовых данных" (MSOPD). В моем первом раунде тестов, не имея ни малейшего представления о взаимоотношениях между ними, у меня было наоборот. С моим новым пониманием я вижу, что соотношение RTM / MSOPD - это количество одновременных загрузок, которые будут разрешены, если все они близки к максимальному размеру.
Предполагая, что «Request Throttle Memory» на самом деле является буфером памяти, а не временным файлом, это означает, что мои худшие опасения оправдались. Каждый файл полностью хранится в памяти на протяжении всей загрузки. Никто ничего не сказал, чтобы заставить меня поверить в обратное (хотя я также не вижу, чтобы кто-нибудь вскочил, чтобы сказать «да, они сделали эту глупость»)
Кроме того, с этим новым пониманием приостановленные загрузки имеют определенный смысл. У сервера нет памяти для приема загрузки, поэтому он просто не читает из сокета. Буферы TCP заполняются, размер окна становится равным 0, и клиент ждет, чтобы оно снова открылось, что должно произойти, как только сервер начнет читать запрос. Но в моем случае этого почему-то никогда не происходит. Сервер полностью забывает о запросе, поэтому он просто задерживается.
Случай с «Максимальным размером данных поста» все еще остается загадкой. Запросы, превышающие жесткий предел, не должны ставиться в очередь, а просто отклоняться. И я получаю сообщение об отказе («Размер сообщения превышает максимальный предел 200 МБ») в server.log
. Но опять же, в этом случае сервер, кажется, забывает о запросе, не отправив клиенту сообщение об ошибке.
Вы можете использовать cftry-catch, чтобы зафиксировать ошибку и показать пользовательское сообщение вашим пользователям. Сказав это, какие значения установлены для Максимальное количество параметров POST-запроса, Максимальный размер пост-данных, Пороговое значение запроса и Память ограничения запроса. Вы используете CF Std или Ent и какая версия ColdFusion?
Также я постараюсь объяснить настройки для тюнинга: -
Учтите, что одновременно выполняется три запроса Req1 (3 МБ), Req2 (6 МБ) и Req3 (9 МБ). При настройках по умолчанию для параметра Request Throttle Threshold установлено значение 4MB, ColdFusion резервирует (6 + 9 = 15MB) в Throttle Memory. Аналогичным образом, он будет продолжать добавлять память для дросселирования запросов для всех одновременных запросов, а предел - это то, что мы установили для памяти дросселирования запросов (по умолчанию 200 МБ)
Надеюсь это поможет.