Оптимизация производительности

Оптимизация производительности

    Основная функциональность и производительность

    worker_processes - задает число рабочих процессов
    Оптимальное число рабочих процессов зависит от множества факторов, включая число процессорных ядер, жестких дисков, общей картины нагрузок
    Выигрыш при увеличении данного значения можно получить, только если обрабатывается большее кол-во статики


    worker_connections - Определяет, сколько клиентов будет обслуживаться каждым рабочим процессом
    ulimit -n указывает количество доступных рабочих подключений сервера
    Модуль ngx_http_stub_status_module предоставляет доступ к базовой информации о состоянии

    location /basic_status { stub_status; } curl localhost/nginx_status Active connections: 1 ....

    Снизить нагрузку поможет ограничение или отключение некоторых логов

    #Оставить только критические ошибки error_log /var/log/nginx/error.log crit; #Отключение логов доступа access_log off;

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

    open_file_cache max=200000 inactive=20s; #задаёт максимальное число элементов в кэше; при переполнении кэша удаляются наименее востребованные #inactive - задаёт время, после которого элемент кэша удаляется, если к нему не было обращений в течение этого времени; по умолчанию 60 секунд

    open_file_cache_valid - Определяет время, через которое следует проверять актуальность информации об элементе в open_file_cache

    open_file_cache_valid 30s;

    open_file_cache_min_uses - Задаёт минимальное число обращений к файлу в течение времени, заданного параметром inactive директивы open_file_cache, необходимых для того, чтобы дескриптор файла оставался открытым в кэше

    open_file_cache_min_uses 2;

    open_file_cache_errors - Разрешает или запрещает кэширование ошибок поиска файлов в open_file_cache

    open_file_cache_errors on;

    sendfile - активирует копирование данных между файловыми дескрипторами средствами ядра, что намного эффективнее связки read() + write(), которая требует обмена данными с пользовательским пространством


    tcp_nopush - Параметр включаются только при использовании sendfile. Включение параметра позволяет передавать файл полными пакетами

    sendfile on; tcp_nopush on;

    Для keep-alive подключений можно выключить буферизацию, что будет полезно при частом запросе маленьких объёмов данных в режиме реального времени, без получения немедленного ответа, когда важна своевременная доставка данныx

    tcp_nodelay on;

    keepalive_timeout - Первый параметр задаёт таймаут, в течение которого keep-alive соединение с клиентом не будет закрыто со стороны сервера


    keepalive_requests - Задаёт максимальное число запросов, которые можно сделать по одному keep-alive соединению. После того, как сделано максимальное число запросов, соединение закрывается
    Периодическое закрытие соединений необходимо для освобождения памяти, выделенной под конкретные соединения. Поэтому использование слишком большого максимального числа запросов может приводить к чрезмерному потреблению памяти и не рекомендуется

    #По истечении этого времени сервер закроет соединения keepalive_timeout 30; #Количество запросов, которые клиент может выполнить по поддерживаемому соединению keepalive_requests 1000;

    reset_timedout_connection - Разрешает или запрещает сброс соединений по таймауту, что освобождает дополнительную память, выделенную под сокеты и разрешит серверу закрывать подключение тех клиентов, которые перестали отвечать

    reset_timedout_connection on;

    Можно существенно уменьшить тайм-ауты для директив client_body_timeout и send_timeout (дефолтное значение обеих — 60 секунд). Первая — ограничивает время на чтение тела запроса от клиента. Вторая — время ответа клиенту. Если клиент не начнёт читать данные в указанный промежуток времени, то Nginx закроет подключение

    #Отправьте клиенту сообщение "время ожидания запроса истекло", если тело запроса не будет загружено к этому времени client_body_timeout 10; #Если клиент перестает считывать данные, по истечении этого времени освободите устаревшее клиентское соединение send_timeout 2;
    Модуль ngx_http_gzip_module

    С помощью сжатия данных можно добиться уменьшения размера пересылаемого трафика
    gzip - Разрешает или запрещает сжатие ответа методом gzip
    gzip_min_length - iУстанавливает минимальную длину ответа, который будет сжиматься методом gzip. Длина определяется только из поля “Content-Length” заголовка ответа
    gzip_proxied - Разрешает или запрещает сжатие ответа методом gzip для проксированных запросов в зависимости от запроса и ответа
    gzip_types - Разрешает сжатие ответа методом gzip для указанных MIME-типов
    gzip_disable - Запрещает сжатие ответа методом gzip для запросов с полями заголовка “User-Agent”, совпадающими с заданными регулярными выражениями

    #Пример gzip on; gzip_min_length 10240; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml; gzip_disable "msie6";

    worker_rlimit_nofile - Изменяет ограничение на максимальное число открытых файлов для рабочих процессов, указывает сколько файловых дескрипторов будет использовать Nginx
    На каждое соединение надо выделять по два дексриптора, один для соединения с клиентом, второй — для открытия статического файла
    Значение worker_rlimit_nofile должно быть равным удвоенному значению Max Clients
    worker_rlimit_nofile = worker_connections * <число_ядер/worker_processes> * 2
    В системе это значение можно установить из командной строки ulimit -n 200000 или используя /etc/security/limits.conf


    multi_accept - Если multi_accept выключен, рабочий процесс за один раз будет принимать только одно новое соединение. В противном случае рабочий процесс за один раз будет принимать сразу все новые соединения
    При слишком маленьком значении worker_connections, их лимит может быть очень быстро исчерпан

    timer_resolution - Уменьшает разрешение таймеров времени в рабочих процессах, за счёт чего уменьшается число системных вызовов gettimeofday(). По умолчанию gettimeofday() вызывается после каждой операции получения событий из ядра. При уменьшении разрешения gettimeofday() вызывается только один раз за указанный интервал

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

    Методы/алгоритмы сжатия повышают производительность веб-сайта за счет уменьшения размера содержимого. Следовательно, сжатые данные требуют небольшого времени загрузки и передачи. Однако у этого есть цена. Серверы используют много вычислительных ресурсов, чтобы обеспечить лучшую степень сжатия
    Каждый раз, когда мы загружаем файл из браузера, браузер запрашивает сервер, какой тип сжатия он поддерживает, через заголовок. Например, если браузер поддерживает gzip и deflate для распаковки. Он добавит эти параметры в свой заголовок Accept-Encoding
    Когда сервер отвечает контентом, он сообщает браузеру о формате сжатия через заголовок Content-Encoding
    brotli - модуль для компрессии данных
    brotli - алгоритм для сжатия данных, усовершенствованный алгоритм сжатия, состоящий из кодирования Хаффмана, алгоритма L77 и контекстного моделирования
    brotli_static - позволяет серверу Nginx проверять, существуют ли предварительно сжатые файлы с расширениями .br или нет
    brotli_comp_level - устанавливает динамический уровень качества сжатия в диапазоне от 0 до 11
    brotli_types - сжатие для определенных типов MIME, тогда как ответы text/html всегда сжимаются
    После внесения изменений вы заметите очевидные улучшения показателей производительности. Однако у него есть небольшой недостаток – повышенная загрузка процессора в часы пик. Чтобы избежать подобных ситуаций, следите за загрузкой процессора; если он регулярно достигает 100%, мы можем использовать множество параметров в соответствии с нашими предпочтениями, например, представление предварительно сжатого или статического содержимого, снижение уровня сжатия и отключение сжатия на лету

    brotli on; brotli_static on; brotli_comp_level 6; brotli_types application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;
    sendfile

    sendfile - это системный вызов, позволяет передавать данные между файловыми дескрипторами, внутри пространства ядра, без затрат на переключение контекста, делать запись напрямую в буфер ядра из блочного устройства посредством DMA(Direct Memory Access) прямой доступ к памяти, это намного эффективнее чем связки read write, которые требуют обмена данных с пользовательским пространством После включения sendfile nginx может отправлять заголовки http полностью, а не частями.
    Sendfile_max_chunk - объем данных, который может передаваться за один вызов sendfile.
    Если установить это значение в ноль, тогда соединение может полностью захватить рабочий процесс.
    tcp_nopush следует использовать вместе с директивой sendfile on; - это позволяет отправлять заголовки tcp одним пакетом, а не один за другим

    location /mp3 { sendfile on; sendfile_max_chunk 1m; tcp_nopush on; #... }

    tcp_nodelay - это опция используется в HTTP-соединениях с keepalive, заставляет nginx не буферизировать данные.
    keepalive-соединения - это сокеты, остаются открытыми в течение некоторого времени после отправки данных.
    keepalive позволяет отправить больше данных без инициализации нового соединения и повторения тройного приветствия TCP для каждого HTTP-запроса.

    location /mp3 { tcp_nodelay on; keepalive_timeout 65; #... }

    При установке соединения, оно помещается в очередь на прослушивание
    Отобразить текущую очередь прослушивания:

    netstat -Lan

    Чтобы изменить максимальное кол-во открытых сокетов в nginx:

    server { listen 80 backlog=4096; # ... }

    Возможно необходимо изменить максимальное число открытых сокетов в ОС Linux:

    sudo sysctl -w net.core.somaxconn=4096
    Источники
    Последнее изменение: 07.10.2024 13:43


    Связанные темы
    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ