Бьётся файл при передаче по http

23 октября 2012, 20:51
Мерял тут скорость внутри конторских VPN-каналов, путём передачи 100-мегабайтного файла по http, с Apache22 на FreeBSD. Обнаружил необъяснимое — при передаче файла на винду качается кусок файла случайного размера (от 2.5 до 18 мегабайт) и потом передача рвётся. Клиент считает, что файл скачан полностью, в логах апача никаких ошибок. При этом перед началом закачки размер файла определяется правильно.

Начал рыть. Включение максимально подробных логов показало, что в момент обрыва передачи появляется запись:

[Thu Sep 27 12:31:48 2012] [info] [client 10.0.7.1] (12)Cannot allocate memory: core_output_filter: writing data to the network

Беглый поиск привёл на сайт Apache, где нашёлся такой текст:

Invalid argument: core_output_filter: writing data to the network
Apache uses the sendfile syscall on platforms where it is available in order to speed sending of responses. Unfortunately, on some systems, Apache will detect the presence of sendfile at compile-time, even when it does not work properly. This happens most frequently when using network or other non-standard file-system.

Symptoms of this problem include the above message in the error log and zero-length responses to non-zero-sized files. The problem generally occurs only for static files, since dynamic content usually does not make use of sendfile.

To fix this problem, simply use the EnableSendfile directive to disable sendfile for all or part of your server. Also see the EnableMMAP, which can help with similar problems.


Что в переводе означает, что Apache используется системный вызов sendfile на тех платформах, где он доступен, чтобы увеличить скорость ответа клиенту. К сожалению, на некоторых система апач определяет наличие этого вызова во время компиляции (т. е. сборки самого апача) даже если этот вызов в системе реально не работает надлежащим образом. Обычно это происходит при использовании сетевых или иных нестандартных файловых систем. Симптомы этой проблемы включают в себя вышеприведённый текст в логах и нулевой ответ на запрос файлов ненулевой длины. Проблема обычно возникает при передаче статических файлов, динамический контент не использует sendfile. Чтобы решить эту проблему, используйте директиву EnableSendfile, чтобы выключить использование вызова SendFile. Также почитайте про EnableMMAP, которая может помочь при сходных проблемах.

Выключил в итоге в конфиге апача EnableSendfile и EnableMMAP. Это помогло, но осадочек остался... Потому как файло лежит на обычном локальном разделе диска. Или UFS считается для апача недостаточно стандартной?
Ваш комментарий
адрес не будет опубликован

ХТМЛ не работает

Ctrl + Enter
Популярное