ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: замирает скачиван ие файлов



On Thu, 25 Oct 2007, Alex Vorona wrote:

iostat:

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util dm-0 0.00 0.00 64.96 4.04 1705.92 1101.39 40.69 2.75 39.92 9.50 65.58

Воркеры в основном спят.

Date: Thu, 25 Oct 2007 11:19:46 +0300
From: Alex Vorona <voron@xxxxxxxxxx>
Reply-To: nginx-ru@xxxxxxxxx
To: nginx-ru@xxxxxxxxx
Subject: Re: замирает скачивание файлов

tswiah@xxxxxxxxxxxxxxxxxxxxxxxxxx пишет:

 Господа, подскажите, куда копать.

 Ситуация такова: имеется довольно нагруженный файловый сервис на линуксе.
 nginx работает как фронтэнд: проксирует на апач практически все, кроме
 мелкой статики, и работает с fastcgi для скриптов, которые используются
 для собственно скачивания файлов. Файлы отдаются с помощью
 X-Accel-Redirect.
 Трафика сейчас в районе 100 мегабит (бывает и до 115), однако периодически
 возникает проблема:
 скачивание файла просто застывает в какой-то момент.

 Железо:
 - intel core 2 quad
 - 4 gb ram
 - "типа железный raid" интеловый, на 3 винта, уровень 0, работающий с
 помощью dmraid
 uptime в районе 2, в пиковой нагрузке - около 4

 sysctl:
 net.ipv4.tcp_syncookies=1
 net.ipv4.tcp_fin_timeout = 1
 net.ipv4.tcp_tw_recycle = 1
 net.ipv4.tcp_keepalive_time = 1800

 Конфиг nginx:

 === nginx.conf ===

 worker_processes 4;

 worker_rlimit_nofile 10240;
 worker_rlimit_sigpending 32768;
 worker_priority 5;

 events {
     worker_connections  20480; }

worker_connections должны быть меньше worker_rlimit_nofile с расчётом чтобы воркер мог открывать файлы и делать запросы на бэкенд. Также попробуйте явно задать метод epoll если у вас 2.6.x ядро, или сравните poll и rtsig, если 2.4.x
 error_log  /var/log/nginx/error.log;

 http {
     include       /etc/nginx/mime.types;
     default_type  application/octet-stream;

 '"$upstream_response_time"';

     access_log  /var/log/nginx/access.log;

     gzip on;
     gzip_proxied any;
     gzip_min_length  10240;
     gzip_buffers     32 64k;
     gzip_types       text/html application/x-javascript text/css
 text/xml text/plain;

     client_header_timeout  60;
     client_body_timeout    60;
     send_timeout           120;

     client_max_body_size       1800m;
у вас реально заливают 1800Мб через http POST?  Обычно хватает 10Мб
     client_body_buffer_size    128k;
     client_header_buffer_size    4k;
     large_client_header_buffers  16 8k;

     sendfile       on;
     sendfile_max_chunk 1024k;
пробовали менять размер чанка?
     tcp_nopush     on;
     tcp_nodelay    on;
     output_buffers   32 256k;
     postpone_output  1460;

     lingering_time     30;
     lingering_timeout  6;
     reset_timedout_connection  on;

     keepalive_timeout  0;
     optimize_server_names on;

     proxy_read_timeout          180;
     proxy_connect_timeout       60;
     proxy_send_timeout          180;

     msie_padding                on;

     proxy_buffer_size           32K;
     proxy_buffers               64 512K;
     proxy_busy_buffers_size     1024K;
     proxy_temp_file_write_size  1024K;

возможно будет дешевле проксировать ответ бэкенда налету, чем буферизировать его на диск, начать можно с
proxy_max_temp_file_size  0;
     server {
         listen       <ip_address>:80 default backlog=1024 rcvbuf=131072
 sndbuf=1048576 deferred;
великоваты буферы - вы видео раздаёте ?
         server_name  <server_name>;

        location / {
                 proxy_pass      http://<ip_of_backend>;
                 proxy_redirect     off;
                 proxy_set_header  Host       $host;
                 proxy_set_header  X-Real-IP  $remote_addr;
                 proxy_set_header  REMOTE_ADDR  $remote_addr;
                 proxy_set_header  REMOTE_USER  $remote_user;
                 proxy_set_header  HTTP_COOKIE  $http_cookie;
                 proxy_set_header  REQUEST_METHOD  $request_method;

                 proxy_set_header   X-Forwarded-For
 $proxy_add_x_forwarded_for;
зачем используете X-Forwarded-For - обычно хватает X-Real-IP и mod_realip&аналоги на бэкенде
         }

         location /img {
                 root /var/www/<site>/htdocs/www;
         }

         location /js {
                 root /var/www/<site>/htdocs/www;
         }

         location /css {
                 root /var/www/<site>/htdocs/www;
         }

         location /favicon.ico {
                 root /var/www/<site>/htdocs/www;
         }

         location /download/ {
                 root /var/www/<site>/fcgi;
                 if ($uri ~ '^/download/(.*)$') {
                         set $file $1;
                 }
                 rewrite ^/download/(.*)
 /download/index_dload.php?url=$file last;
         }

         location ~ ^/download/.+\.php$ {
             fastcgi_pass   unix:/tmp/spawn-fcgi.socket;
             fastcgi_index  index_test.php;

             fastcgi_param  SCRIPT_FILENAME
 /var/www/<site>/fcgi$fastcgi_script_name;
             fastcgi_param  QUERY_STRING     $query_string;
             fastcgi_param  REQUEST_METHOD   $request_method;
             fastcgi_param  REQUEST_URI      $request_uri;
             fastcgi_param  CONTENT_TYPE     $content_type;
             fastcgi_param  CONTENT_LENGTH   $content_length;
         }
     }

 === nginx.conf ===

 Буду очень признателен за любые подсказки.

что говорит iostat на дисках, какой статус имеют воркеры nginx?


--
Best,
        Yaroslav Tarasenko aka Taras Tswiah
        (SysAdmin Department Manager)



 




Copyright © Lexa Software, 1996-2009.