nginx + webdav put работает медленно

Alexander Reznik a.reznik на astrotech-co.ru
Чт Сен 1 07:22:28 UTC 2011


Доброго времени суток!

Есть nginx (1.0.6, но проверял и на 1.0.0 и на 0.8.49) с webdav. 8 
worker'ов (по количеству ядер на серваке), 1000 коннектов на воркера, 1 
server с 1 location, с webdav и ограничением доступа по ip. Сервер 
слушает скажем 80 и 81 порты. На 80 приходит порядка 100 GET/секунду, на 
81 до 150.000 PUT/час. При попытке положить файл размером 1-100кб put'ом 
на 81 порт при помощи curl возникают задержки до 15 секунд. При этом 
около секунды - ожидание ответа continue от сервера и остальное время до 
ответа 201 created. Если положить файл на 80 порт в это же время, то вся 
операция проходит за 0.1-0.05 сек. aio и сендфайл включать пробовал, не 
помогает, количество воркеров изменять пробовал, тоже не помогает. В 
диски не упираемся, операции с файлами во время тормозов nginx работают 
быстро, в swap не уходим. Создается впечатление, что все PUT запросы 
обрабатываются одним worker'ом. Статистика nginx говорит примерно 
следующее: Active connections 50 - 150, из этого reading/writing 
соотносятся 1/2. (например при 60 коннектах 20 читают, 40 пишут).


конфиг:
server {
    listen                 80;
    listen                 2000;
    server_name            media;
    client_max_body_size   100m;
    expires                5d;

    set                    $root
    location / {
        root                   $root;

        dav_methods  PUT DELETE MKCOL COPY MOVE;

        create_full_put_path   on;
        dav_access             group:rw  all:r;
        limit_except  GET {
            allow              192.168.0.0/24;
            deny               all;
        }
    }
}



Подробная информация о списке рассылки nginx-ru