Я использую 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
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/*;
}
# 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
Также посетите эту очень полезную статью обо всем Как передавать большие объемы данных по сети?