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

Повышение производительности nginx выше 1 тыс. Запросов / с

Я пытаюсь максимально масштабировать установку nginx.

Я запускаю один экземпляр nginx с 6 процессами worker_processes (6 ядер) и 5 ​​внутренними серверами, состоящими из uwsgi установка с 10 рабочими в каждом. (всего 50 рабочих).

Однако любой тест, который я пытаюсь выполнить с другими параметрами (используя ab) для общего количества и одновременных подключений, кажется, на уровне около 1000 запросов в секунду.

Я отключил все журналы для nginx и uwsgi (чтобы избежать замедления из-за проблем с диском). Я тестирую приложение Flask на Python, которое просто отправляет {'status':'ok'} назад. Ни доступа к базе данных, ни вычислений, ничего.

Соответствующая часть конфигурации nginx выглядит так:

    user www-data;
    worker_processes 6;
    worker_rlimit_nofile 100000;
    pid /var/run/nginx.pid;

    events {
            use epoll;
            worker_connections 2048;
            multi_accept on;
    }

    http {

            ##
            # Basic Settings
            ##

            sendfile on;
            tcp_nopush on;
            tcp_nodelay on;
            keepalive_timeout 65;
            types_hash_max_size 2048;
            # server_tokens off;

            # server_names_hash_bucket_size 64;
            # server_name_in_redirect off;

            include /etc/nginx/mime.types;
            default_type application/octet-stream;

            ##
            # Logging Settings
            ##

            access_log off; # /var/log/nginx/access.log;
            error_log /var/log/nginx/error.log;

            <...>
    }

Я ищу любые советы, все, что я упустил из виду, для увеличения пропускной способности. Просмотр статистики по каждому uwsgi бассейн (с использованием uwsgitop) они не кажутся сложными для выполнения, что наводит меня на мысль, что узким местом является nginx. Кроме того, производительность была такой же с одним пулом рабочих вместо 10. Кроме того, htop также показывает, что я далек от максимума с точки зрения памяти или процессора.

Я рекомендую вам установить sysstat пакет затем проверьте записанную информацию с помощью сар.

sar -n SOCK -s <start_time> -e <end_time> чтобы получить количество розеток во время теста

sar -n DEV -s <start_time> -e <end_time> получать пакеты сетевых интерфейсов и пропускную способность

sar -d -s <start_time> -e <end_time> чтобы получить статистику io для каждого устройства

sar -v -s <start_time> -e <end_time> чтобы получить количество дескрипторов файлов и индексов

и т.д

Проверьте ограничения безопасности для ваших пользователей (максимальное количество открытых файлов, максимальное количество процессов и т. Д.).

Затем проверьте настройки ядра: диапазон локальных портов, somaxconn, устройство txqueue, netdev backlog, активируйте повторный цикл сокета для состояний TIME_WAIT, если необходимо (в отношении tcp-tw с sar -n SOCK) с SO_LINGER в nginx или tcp_tw_recycle (если вы этого не сделаете) t иметь NAT) или повторно использовать (для исходящих соединений), при необходимости измените количество tw_buckets, убедитесь, что sack / dsack и временные метки включены, уменьшите время ожидания FIN_WAIT_2, увеличьте максимальное количество дескрипторов файлов, если необходимо и т. д.

Может быть много факторов.

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

И простой тест, чтобы убедиться, что приложение python не является виновником: тот же тест на статическом файле непосредственно на сервере от nginx.

Я бы посмотрел на файловые дескрипторы, возможное насыщение сети / интерфейса и проблемы ввода-вывода.

Чтобы узнать, не перегружен ли сетевой интерфейс, используйте iptraf - инструмент командной строки для просмотра статистики в реальном времени. Просто:

iptraf

Для проблем ввода-вывода используйте iostat

iostat 1

который покажет использование ввода-вывода и загрузку каждую 1 секунду.

Для проблем с файловым дескриптором используйте lsof или / proc:

lsof -P -n -p <PID> | wc -l
ls /proc/<PID>/fd | wc -l

Использовать ulimit -a | grep files (как пользователь, запускающий процесс), чтобы проверить, сколько файлов вам разрешено открывать. По умолчанию 1024.

См. Эту страницу для получения дополнительной информации: http://www.cyberciti.biz/tips/linux-procfs-file-descriptors.html

См. Этот вопрос для конкретной проблемы дескриптора файла nginx, которая вполне может быть связана с вашей проблемой: понимание макс файловых дескрипторов для linux и nginx и лучшее значение для worker_rlimit_nofile

В дополнение к двум другим ответам здесь также может быть проблема conntrack (отслеживание соединения). Если вы используете Linux, и если вы используете netfilter (например, iptables), ваша таблица conntrack может быть заполнена.

Сначала проверьте, включен ли conntrack. Например:

$ /sbin/lsmod | grep conntrack
ip_conntrack           51617  1 xt_state

$ lsmod | grep -i con
nf_conntrack_ipv4      19159  5 
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
nf_conntrack           92358  5 xt_state,iptable_nat,nf_conntrack_ipv4,nf_nat_ipv4,nf_nat

Результат будет зависеть от версии ядра.

Если если любой из nf_conntrack или ip_conntrack модули загружены, вы можете увидеть, сколько записей в conntrack есть, и проверить, какой у вас максимум, с помощью следующего:

Red Hat (RHEL, CentOS, Fedora и т. Д.):

$ sudo wc -l /proc/net/ip_conntrack
$ /sbin/sysctl -a | grep conntrack_max

or

$ sudo wc -l /proc/net/nf_conntrack
$ /sbin/sysctl -a | grep conntrack_max

Debian:

$ cat /proc/sys/net/netfilter/nf_conntrack_count
$ /sbin/sysctl -a | grep conntrack_max

Если вы заполнили таблицу conntrack, вам нужно будет увеличить лимит с помощью sysctl или /etc/sysctl.conf.

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