Долгий коннект к серверу (часть вторая)

Oleg I. support at sharedzilla.com
Sun Feb 25 04:01:57 MSK 2007


Недавно писал с темой "Долгий коннект к серверу", с того момента накопилось много информации, решил создать новую ветку. На всякий случай снова информация о системе:

uname -smr
    FreeBSD 6.2-RELEASE-p1 i386

ginx -v
    nginx version: nginx/0.5.12

В системе установлен RAID5 250GBx8;

Пробовали использовать одинаковые конфигурационные файлы (полный листинг приведу в конце сообщения), изменяя только worker_processes. Теперь о результатах при идентичных нагрузках (конфиг менялся на продакшн сервере с остановкой и запуском nginx):

worker_processes = 1
Подключение к серверу происходит мгновенно, обработка запроса занимает длительное время (от 10 до 30 секунд, в зависимости от количества подключений). Время обработки запроса не зависит от размера файла. Процесс постоянно висит в статусе biord. В лог сыпятся ошибки (возможно, пользователи не дожидаются начала загрузки и закрывают соединение):
accept() failed (53: Software caused connection abort) while accepting new connection


worker_processes > 2
Очень часто соединение с сервером происходит долго либо пользователи при попытке подключения отваливаются по таймауту. Время обработки запроса напротив совсем незначительное. Состояние biord проскакивает не часто, большинство процессов находятся в kqueue.

И в том и в другом случае с увеличением количества подключений  > 2000 (600-700 уникальных пользователей) появляются проблемы с "провисанием" загрузки. Т.е. пользователь загружает файл в один поток на скорости 10-11кб, потом происходит резкое падение скорости и некоторое время (5-10 секунд) в сокет ничего не передается. Затем резкий скачок (до 20-30кб), после чего скорость снова нормализуется.

При этом (worker_processes = 1) нагрузка на диски:
Disks   ad4   da0 
KB/t  85.77 88.79 
tps      39    79    
MB/s   3.24  6.87 
% busy   36    70    

В файрволе очередь для балансировки:
ipfw pipe 1 config bw 95Mbit/s delay 10ms
ipfw queue 1 config pipe 1 weight 1 mask all
ipfw add 1000 queue 1 tcp from me 80 to any

И ничего не помогает. Подскажите, в чем может быть проблема и как ее лечить. Танцы с бубном уже утомили, причем не только нас но и пользователей :(

Конфигурационный файл:
user  developer developer;
worker_processes  1;

worker_priority -5;

events {
    worker_connections  10000;
    use kqueue;
}

http {
    limit_zone   one  $binary_remote_addr  10m;
    limit_conn   one  4;
   
    access_log off;   
 
    default_type  application/octet-stream;

    sendfile    on;
    tcp_nopush  on;
    tcp_nodelay on;

    keepalive_timeout  0;
    optimize_server_names on;

    perl_modules /www/xxx.com/cgi-bin;
    perl_require Digest/MD5.pm;
    perl_require Unpack.pm;

    server {
        listen       xxx:80 default sndbuf=64K; 
        server_name  xxx.com;

        charset windows-1251;

        error_log    /www/logs/d2nginx.error;

        location / {
            root   /www/xxx.com/htdocs;
            index  index.html index.htm index.cgi;
        }

        location /downloads/ {
            perl Unpack::handler;
            root /www/xxx.com/htdocs;
            expires      30d;
        }

        location ~ /\.ht {
            deny  all;
        }
    }
}






More information about the nginx-ru mailing list