Download lento de grandes arquivos estáticos do nginx

6

Estou usando o debian 7 x64 na virtualização vmware-esxi.

O download máximo por cliente é de 1mb / se nginx não usa mais de 50mbps juntos e minha pergunta é o que pode causar transferências tão lentas?

servidor

**Settings for eth1:
    Supported ports: [ TP ]
    Supported link modes:   1000baseT/Full
                            10000baseT/Full**

root@www:~# iostat
Linux 3.2.0-4-amd64 (www)       09.02.2015      _x86_64_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
       1,75    0,00    0,76    0,64    0,00   96,84

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda             173,93      1736,11       219,06     354600      44744


root@www:~# free -m
             total       used       free     shared    buffers     cached
Mem:         12048       1047      11000          0        106        442
-/+ buffers/cache:        498      11549
Swap:          713          0        713

nginx.cof

user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
        worker_connections 3072;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 5;
        types_hash_max_size 2048;
        server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

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

        ##
        # Logging Settings
        ##

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

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # nginx-naxsi config
        ##
        # Uncomment it if you installed nginx-naxsi
        ##

        #include /etc/nginx/naxsi_core.rules;

        ## Start: Size Limits & Buffer Overflows ##

        client_body_buffer_size 1k;
        client_header_buffer_size 1k;
        client_max_body_size 4M;
        large_client_header_buffers 2 1k;

        ## END: Size Limits & Buffer Overflows ##

        ## Start: Timeouts ##

        client_body_timeout   10;
        client_header_timeout 10;
        send_timeout          10;

        ## End: Timeouts ##

        ## END: Size Limits & Buffer Overflof
        ##
        # nginx-passenger config
        ##
        # Uncomment it if you installed nginx-passenger
        ##

        #passenger_root /usr;
        #passenger_ruby /usr/bin/ruby;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

/etc/sysctl.conf

# Increase system IP port limits to allow for more connections

net.ipv4.ip_local_port_range = 2000 65000


net.ipv4.tcp_window_scaling = 1


# number of packets to keep in backlog before the kernel starts dropping them
net.ipv4.tcp_max_syn_backlog = 3240000


# increase socket listen backlog
net.core.somaxconn = 3240000
net.ipv4.tcp_max_tw_buckets = 1440000


# Increase TCP buffer sizes
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

ATUALIZAÇÃO:

O log de depuração está completamente vazio, somente quando eu cancelar manualmente o download recebo o seguinte erro

2015/02/09 20:05:32 [info] 4452#0: *2786 client prematurely closed connection while sending response to client, client: 83.11.xxx.xxx, server: xxx.com, request: "GET filename HTTP/1.1", host: "xxx.com"

saída de curvatura:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1309M  100 1309M    0     0   374M      0  0:00:03  0:00:03 --:--:--  382M
    
por Marcin Martynowski 09.02.2015 / 17:01

3 respostas

6

Uma resposta para qualquer pessoa aqui no Google:

O Sendfile está bloqueando e não permite que o nginx defina lookahead, portanto, é muito ineficiente se um arquivo for lido apenas uma vez.

O

Sendfile depende do armazenamento em cache do sistema de arquivos, etc 'e nunca foi feito para arquivos tão grandes.

O que você quer é desabilitar o sendfile para arquivos grandes, e usar o directio (de preferência com threads para que ele não seja bloqueado). Quaisquer arquivos com menos de 16 MB ainda serão lidos usando sendfile.

aio threads;
directio 16M;
output_buffers 2 1M;

sendfile on;
sendfile_max_chunk 512k;

Ao usar directio, você lê diretamente do disco, pulando vários passos no caminho.

p.s. Por favor, note que para usar tópicos aio você precisa compilar nginx com tópicos suporte link

    
por 02.11.2016 / 14:54
1

Você provavelmente precisará alterar o valor sendfile_max_chunk , como a documentação declara:

Syntax:   sendfile_max_chunk size;
Default:  sendfile_max_chunk 0;
Context:  http, server, location

When set to a non-zero value, limits the amount of data that can be transferred in a single sendfile() call. Without the limit, one fast connection may seize the worker process entirely.

Você também pode ajustar tamanhos de buffer caso o tráfego seja "grande" em arquivos estáticos.

    
por 09.02.2015 / 18:05
0

Você já tentou ajustar MTU (Unidade Máxima de Transferência) - o tamanho da maior unidade de dados de protocolo da camada de rede que pode ser comunicada em uma única transação de rede? No nosso caso, a mudança de 1500 para 4000 bytes melhorou drasticamente o desempenho do download. As MTUs suportadas diferem com base no transporte IP. Experimente diferentes valores para avaliar o tamanho do seu caso de uso.

Você pode usar ifconfig para verificar o tamanho da MTU existente e usar o seguinte comando para atualizá-lo durante a execução:

ifconfig eth0 mtu 5000

Visite também este artigo muito útil sobre todas as coisas Como transferir grandes quantidades de dados via rede ?

    
por 18.10.2017 / 20:13