Проблемы с производительностью на сервере статических файлов Nginx, обслуживающем 10 Гбит / с
Я использую Nginx для обслуживания статических файлов на выделенных серверах. На сервере нет веб-сайта, это всего лишь сервер загрузки файлов. Размеры файлов варьируются от МБ до ГБ.
Ранее у меня было 8 выделенных серверов со скоростью 500 Мбит / с на unmetered.com. Каждый из них выступал великолепно.
Я думал купить сервер 10Gbps от FDCServers. Потому что одним проще управлять, чем несколькими серверами.
Ниже приведены спецификации сервера:
Dual Xeon E5-2640 (кэш-память 15 МБ, 2,50 ГГц, 7,20 ГТ / с Intel® QPI) - 24 ядра, 128 ГБ ОЗУ, 10 Гбит / с, сеть Unmetered Ubuntu 14,04 LTS, 1,5 ТБ, SATA
Но мой новый гигантский сервер не дает скорости более 500-600 Мбит / с. Я установил nload для мониторинга трафика и скорости загрузки / выгрузки. Он сообщает почти так же, как предыдущие серверы unmetered.com.
Тогда я подумал, что это может быть связано с ограничением скорости чтения жесткого диска SATA.
Поэтому я приобрел и установил 3 X 240 ГБ SSD-накопители на новый мощный сервер.
Я переместил файл в SSD Drive и загрузил его для тестирования. Скорость все еще не хорошая. Я получаю только от 250 до 300 кбит / с. Принимая во внимание, что это должно дать мне по крайней мере 2 Мбит / с (Это ограничение скорости на IP, которое я поместил в конфигурационные файлы Nginx).
Затем я искал в настройках Gigabit Ethernet Tuning. Найдена пара настроек sysctl, которые необходимо настроить для сети 10 Гбит / с.
http://www.nas.nasa.gov/hecc/support/kb/Optional-Advanced-Tuning-for-Linux_138.html
Я реализовал их, но все равно пропускная способность такая же, как и у моих предыдущих серверов 500 Мбит / с.
Можете ли вы помочь в улучшении пропускной способности сети этого сервера. Я обратился в службу поддержки FDCServer, и они подтвердили, что их серверы могут легко дать от 3 до 5 Гбит / с, и они не могут помочь мне настроить его.
После всех настроек и настроек я получаю только 700Mbit максимум.
Дайте мне знать, если вам нужно больше деталей.
3 ответа
Выполните тест памяти:
для DDR3 1333 МГц PC10600
$ dd if=/dev/zero bs=1024k count=512 > /dev/null
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 0.0444859 s, 12.1 GB/s
тестовый диск io:
$ pv ./100MB.bin > /dev/null
100MiB 0:00:00 [3.36GiB/s] [=================================================================================================================================================================================>] 100%
Проверьте скорость процессора с помощью трубы:
$ dd if=/dev/zero bs=1024k count=512 2> /dev/null| pv > /dev/null
512MiB 0:00:00 [2.24GiB/s] [ <=> ]
Скорость загрузки nginx с локального хоста должна составлять ~1,5-2 ГБ / с.
cheking:
$ wget -O /dev/null http://127.0.0.1/100MB.bin
--2014-12-10 09:08:57-- http://127.0.0.1:8080/100MB.bin
Connecting to 127.0.0.1:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 104857600 (100M) [application/octet-stream]
Saving to: ‘/dev/null’
100%[=======================================================================================================================================================================================>] 104,857,600 --.-K/s in 0.06s
2014-12-10 09:08:57 (1.63 GB/s) - ‘/dev/null’ saved [104857600/104857600]
Проверьте это решение.
удалить строки:
output_buffers 1 512k;
aio on;
directio 512;
и изменить
sendfile off;
tcp_nopush off;
tcp_nodelay off;
в
sendfile on;
tcp_nopush on;
tcp_nodelay on;
удачи
Я думаю, что вам нужно разделить проблемы и протестировать независимо, чтобы определить реальную проблему - бесполезно гадать, что это диск, и тратить сотни или тысячи на новые диски, если это сеть. У вас слишком много переменных для случайного изменения - вам нужно разделить и победить.
1) Чтобы проверить диски, используйте инструмент производительности диска или старый добрый dd
для измерения пропускной способности в байтах / сек и задержки в миллисекундах. Чтение блоков данных с диска и запись в /dev/null
проверить скорость чтения. Чтение блоков данных из /dev/zero
и записать на диск для проверки скорости записи - при необходимости.
Кстати, ваши диски RAID? И разделить на сколько контроллеров?
2) Для проверки сети используйте nc
(ака netcat
) и перебейте сеть, чтобы увидеть, какую пропускную способность и задержку вы измеряете. Чтение блоков данных из /dev/zero
и отправить через сеть с nc
, Чтение блоков данных из сети и сброс их в /dev/null
для тестирования в другом направлении.
3) Чтобы протестировать ваш сервер nginx, поместите несколько статических файлов на RAM-диск, и тогда вы будете независимы от физических дисков.
Только тогда вы узнаете, что нужно настроить...
У меня такая же проблема. При 1 Гбит файл загружается со скоростью до 20 Мбит/сек. После измененияsendfile_max_chunk
параметр, скорость стала максимальной.
Изменять:
sendfile_max_chunk 256k;
К:
sendfile_max_chunk 16M;