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

Необъяснимо высокий дисковый ввод-вывод, вызванный рабочими процессами nginx

Я только что установил сервер 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.