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

Уменьшение IO, вызванного nginx

У меня много свободной оперативной памяти, но мой ввод-вывод всегда загружен на 100% или очень близок. Как я могу уменьшить количество операций ввода-вывода, используя больше оперативной памяти? Мой iotop показывает рабочие процессы nginx с самой высокой скоростью io. Это файловый сервер, обслуживающий файлы размером от 1 МБ до 2 ГБ. Вот мой nginx.conf

#user  nobody;
worker_processes  32;
worker_rlimit_nofile 10240;
worker_rlimit_sigpending 32768;

error_log  logs/error.log  crit;

#pid        logs/nginx.pid;


events {
    worker_connections  51200;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    access_log  off;
    limit_conn_log_level info;
    log_format  xfs  '$arg_id|$arg_usr|$remote_addr|$body_bytes_sent|$status';

    sendfile       off;
    tcp_nopush     off;
    tcp_nodelay on;
    directio 4m;
    output_buffers 3 512k;
    reset_timedout_connection on;
    open_file_cache max=5000 inactive=20s;
    open_file_cache_valid    30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors   on;
    client_body_buffer_size 32k;

    server_tokens off;
    autoindex off;

    keepalive_timeout  0;
    #keepalive_timeout  65;

Пожалуйста, не принимайте этот ответ, поскольку это всего лишь одно наблюдение. Но вы используете прямой ввод-вывод для файлов размером более 4 МБ и разрешаете nginx только 1,5 МБ буфера памяти для файлов.

directio 4m;
output_buffers 3 512k;

Если я правильно помню, прямой ввод-вывод в основном обходит кеш ввода-вывода файловой системы для чтения непосредственно с жесткого диска. Таким образом, для файлов размером более 4 МБ вы не используете память для буферизации файла, а для файлов размером менее 4 МБ вы используете только 1,5 МБ памяти.

Включите sendfile. Оставьте output_buffers по умолчанию. Выключите directio. Добавьте больше оперативной памяти.

Нет ничего лучше Linux VFS cache.

Похоже, что вы хотите обслуживать некоторые запросы непосредственно из памяти, что по сути сводится к кешированию этих запросов. В его базовой форме вы будете обрабатывать запрос, сохранять копию в кэше памяти и обслуживать последующие запросы для того же ресурса из памяти (до тех пор, пока вы не аннулируете / истечете срок действия кэшированной копии).

Реализация этого будет зависеть от характера вашего сайта (то есть, если вы обслуживаете очень большие файлы, это будет не так практично - если ваш контент очень динамичный, он не принесет такой большой пользы и т. Д.), Но для «среднего» сайта - большая часть операций ввода-вывода страницы поступает из статических ресурсов (особенно изображений), это уменьшит количество операций ввода-вывода на диск (а также должно ускорить работу).

Если вы проксируете на внутренний сервер, вы можете использовать директиву proxy_cache nginx для кеширования страниц. Однако расположение кеша обычно находится на диске (что может ускорить процесс, но не может сохранить на дисковом вводе / выводе) - вы можете обойти это, создав tmpfs, сопоставленный с памятью (т.е. ramdisk), в котором будет храниться ваш кеш. . Точно так же, если вы используете FastCGI, вы можете использовать fastcgi_cache.

Другой аналогичный вариант (например, если вы не используете nginx в качестве прокси и не используете FastCGI) - хранить страницы в MemCached. Nginx поставляется с модулем memcached, который позволит вам настроить собственный механизм кеширования.

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

directio отключает кеш ОС, но я вижу, что люди предлагают это, когда их спрашивают, как обслуживать большие файлы без более высокой нагрузки ввода-вывода.

Причина использования directio, например, если вы хотите избежать кеширования на уровне ОС для данных, уже кэшированных самим программным обеспечением, например сервер mysql. Поскольку двойное кеширование тратит ресурсы.

Другая причина может заключаться в том, что у вас не так много системной оперативной памяти и вы хотите установить приоритет использования оперативной памяти для других вещей, а не для размещенных файлов, и в этом случае directio подходит для предотвращения кеширования этих файлов.

Так что, если вы хотите минимизировать ввод-вывод для файлов, размещенных через nginx, то «не» используйте directio.

У меня нет знаний / опыта по другим параметрам, таким как output_buffers и sendfile. Так что это не полный ответ, но я надеюсь, что эта информация поможет.

worker_processes 32;

- все еще догадываешься почему?

У меня много свободной оперативной памяти, но

Я также хотел бы услышать рассуждения о наличии sendfile off; и используя directio - я единственный (точно нет¹), кто знает, что directio (по определению) запрещает кеширование ФС?

__ ¹ - Мартин Ф., по крайней мере, помня об этом: Уменьшение IO, вызванного nginx