Я только что установил сервер ubuntu 12.04.2 LTS, который обслуживает большое количество довольно больших статических файлов. Конфигурация такая же, как на другой машине, которая отлично работает. Другая машина использует Ubuntu 11.10 с nginx 1.0.5. На машине с проблемой используется nginx 1.1.19, и она вряд ли может протолкнуть около 20 МБ / с (но находится на выделенной линии 1 ГБ), когда iotop показывает высокий дисковый ввод-вывод nginx. Это из iotop:
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
4569 be/4 www-data 754.61 K/s 0.00 B/s 0.00 % 99.99 % nginx: worker process
4571 be/4 www-data 1257.69 K/s 0.00 B/s 0.00 % 99.99 % nginx: worker process
4574 be/4 www-data 2.46 M/s 0.00 B/s 0.00 % 99.99 % nginx: worker process
3951 be/4 www-data 1760.77 K/s 0.00 B/s 0.00 % 99.99 % nginx: worker process is shutting down
3950 be/4 www-data 503.08 K/s 0.00 B/s 0.00 % 99.99 % nginx: worker process is shutting down
4573 be/4 www-data 2012.31 K/s 0.00 B/s 0.00 % 99.99 % nginx: worker process
3952 be/4 www-data 1006.15 K/s 0.00 B/s 0.00 % 99.99 % nginx: worker process is shutting down
3954 be/4 www-data 1760.77 K/s 0.00 B/s 0.00 % 99.99 % nginx: worker process is shutting down
4572 be/4 www-data 4.05 M/s 0.00 B/s 0.00 % 99.99 % nginx: worker process
3956 be/4 www-data 2.70 M/s 0.00 B/s 0.00 % 99.99 % nginx: worker process is shutting down
3953 be/4 www-data 251.54 K/s 0.00 B/s 0.00 % 99.99 % nginx: worker process is shutting down
4567 be/4 www-data 2.21 M/s 0.00 B/s 0.00 % 98.30 % nginx: worker process
4570 be/4 www-data 754.61 K/s 0.00 B/s 0.00 % 97.91 % nginx: worker process
3949 be/4 www-data 1006.15 K/s 0.00 B/s 0.00 % 88.21 % nginx: worker process is shutting down
3955 be/4 www-data 1509.23 K/s 0.00 B/s 0.00 % 84.60 % nginx: worker process is shutting down
Таким образом, по какой-то причине те процессы, которые пытаются завершить работу, приводят к тому, что ввод-вывод и сервер практически не реагируют на запросы, а нагрузка возрастает до 5-6 (это двухъядерный компьютер). При этом загрузка ЦП составляет около 0,5%.
После перезапуска nginx какое-то время все в порядке, а потом это происходит снова.
Это последнее сообщение из журнала ошибок nginx:
013/03/18 13:09:28 [alert] 3676#0: open socket #297 left in connection 145
а потом происходит следующее:
2013/03/18 13:10:11 [alert] 3749#0: 100 worker_connections are not enough
и это nginx.conf:
user www-data;
worker_processes 8;
worker_rlimit_nofile 20480;
pid /var/run/nginx.pid;
events {
worker_connections 100;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile off;
output_buffers 1 512k;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 5;
types_hash_max_size 2048;
Любая помощь будет принята с благодарностью!
РЕДАКТИРОВАТЬ:
Sendfile
включение и выключение не имеет значения.
worker_rlimit_nofile == worker_connections
без разницы.
worker_processes
тоже ничего не меняет.
smartctl
не показывает проблем с диском, однако я пробовал со вторым диском на этой машине, и все равно никакой разницы.
Относительно новые жесткие диски могут делать 150 МБ / с (1,2 Гбит / с) при последовательном чтении (и записи), но если у вас есть несколько параллельных операций чтения / записи (даже если каждое чтение по-прежнему является последовательным), то пропускная способность легко упадет в 10 раз.
Так, 20 МБ / с (160 Мбит / с) звучит как ограничение вашего жесткого диска.
Возможно, у другого сервера есть SSD или больше памяти, и эти файлы кэшированы, но у этого сервера что-то не так на стороне кеша (возможно, мало памяти, но, возможно, неправильно оптимизированы настройки ядра).
В любом случае, это, скорее всего, будет звучать как нечто, что находится вне контроля nginx.
Вы можете попробовать увеличить количество буферов в памяти nginx в несколько раз, чтобы сделать чтение более последовательным, но если у вас только один жесткий диск на пластине (например, не более 150 МБ / с при одном последовательном чтении, падение несколько складок при многократном чтении), и кеширование не используется из-за нехватки памяти, тогда вы не сможете продвигаться где-либо близко к 1 Гбит / с (128 МБ / с).
Если вам действительно нужна пропускная способность 1 Гбит / с: если большинство обычных файлов можно кэшировать в памяти, увеличьте объем памяти; иначе получите быстрый SSD.
Я бы обратился sendfile
на:
sendfile on
Думаю, это позволяет избежать ненужного копирования и сэкономить на системных вызовах. Кроме того, tcp_nopush будет включен, только если включен sendfile. Посмотреть здесь.
Также, удалить types_hash_max_size.