Назад | Перейти на главную страницу

Медленная загрузка больших статических файлов из nginx

Я использую debian 7 x64 в виртуализации vmware-esxi.

Максимальная загрузка для каждого клиента составляет 1 МБ / с, а nginx не использует более 50 МБ / с вместе, и мой вопрос в том, что может вызвать такую ​​медленную передачу?

сервер

**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

ОБНОВИТЬ :

Журнал отладки полностью пуст, только когда я вручную отменяю загрузку, я получаю следующую ошибку

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"

вывод curl:

  % 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

Ответ для всех здесь через Google:

Sendfile блокирует и не позволяет nginx устанавливать опережающий просмотр, поэтому очень неэффективно, если файл читается только один раз.

Sendfile полагается на кеширование файловой системы и т. Д. И никогда не создавался для таких больших файлов.

Вы хотите отключить sendfile для больших файлов и вместо этого использовать directio (желательно с потоками, чтобы он не блокировал). Любые файлы размером менее 16 МБ по-прежнему будут считываться с помощью sendfile.

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

sendfile on;
sendfile_max_chunk 512k;

Используя directio, вы читаете прямо с диска, пропуская многие шаги по пути.

p.s. Обратите внимание, что для использования потоков aio вам необходимо скомпилировать nginx с поддержкой потоков. https://www.nginx.com/blog/thread-pools-boost-performance-9x/

Вам, наверное, нужно изменить sendfile_max_chunk значение, как указано в документации:

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

Если установлено ненулевое значение, ограничивает объем данных, которые могут быть переданы за один вызов sendfile (). Без ограничения одно быстрое соединение может полностью захватить рабочий процесс.

Вы также можете настроить размеры буфера, если большая часть вашего трафика - это «большие» статические файлы.

Вы пробовали тюнинг MTU (Максимальный блок передачи) - размер самого большого блока данных протокола сетевого уровня, который может быть передан в одной сетевой транзакции? В нашем случае переключение с 1500 на 4000 байт резко улучшило скорость загрузки. Поддерживаемые MTU различаются в зависимости от IP-транспорта. Попробуйте разные значения, чтобы оценить, какой размер имеет смысл в вашем случае использования.

Ты можешь использовать ifconfig чтобы проверить существующий размер MTU и использовать следующую команду для его обновления во время выполнения:

ifconfig eth0 mtu 5000

Также посетите эту очень полезную статью обо всем Как передавать большие объемы данных по сети?