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

nginx + fastcgi

Как сделать так, чтобы nginx proxy php работал на fastcgi равномерно на всех ядрах.

Вверху показано использование только 2 ядер, когда я пытаюсь провести стресс-тест конфигурации.

Cpu0  : 62.6%us, 14.9%sy,  0.0%ni, 18.5%id,  0.3%wa,  0.0%hi,  3.6%si,  0.0%st
Cpu1  : 57.1%us, 11.0%sy,  0.0%ni, 31.2%id,  0.0%wa,  0.0%hi,  0.7%si,  0.0%st
Cpu2  :  1.3%us,  0.7%sy,  0.0%ni, 97.0%id,  0.0%wa,  0.0%hi,  1.0%si,  0.0%st
Cpu3  :  2.0%us,  1.7%sy,  0.0%ni, 95.7%id,  0.0%wa,  0.0%hi,  0.7%si,  0.0%st

я получил

worker_processes  20;

Установить в nginx.conf

Начните быстрый cgi с

spawn-fcgi -s /tmp/php.sock -f /usr/sbin/php -u nobody -g nogroup -U nobody -G nogroup -C 160 -P /var/run/spawn-fcgi.pid

И блок прокси в nginx.conf, который вызывает быстрый cgi,

location ~ \.php$
{
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php.sock;
        fastcgi_param SCRIPT_FILENAME /var/www/$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
}

Устанавливать рабочие процессы nginx на 20 не нужно. С четырьмя ядрами ЦП нет причин устанавливать его выше 4. Даже если у вас было больше ядер ЦП, вы вероятно, не выиграет от установив это выше.

Помимо слишком высокой настройки процессов nginx, вы, возможно, слишком сильно устанавливаете процессы fastcgi. 160 - это много. Если ваш PHP-код не тратит много времени на ожидание медленных ресурсов, я сомневаюсь, что вы действительно хотите обрабатывать 160 запросов FastCGI одновременно. Поскольку у вас всего 4 ядра, выполнение каждого запроса займет больше времени.

Я не уверен, почему вы думаете, что ваш процессор не используется эффективно. Глядя на ваш максимальный результат, два ядра, которые наиболее загружены, все еще бездействовали 20 и 30 процентов времени. Это могло означать, что PHP нужно было передавать запросы только двум процессам FastCGI одновременно, чтобы не отставать от нагрузки, или это могло означать, что он обрабатывал до 160 одновременных запросов, но им не требовалось много процессорного времени (например, они ждали в сети или на диске). В любом случае, если бы работа была более равномерно распределена по всем четырем ядрам, она бы не завершилась быстрее.

Хотя я бы не рекомендовал это, вы можете заставить процессы запускаться на определенных ядрах, используя taskset. Базовый синтаксис: tasket -c $CPU_LIST -p $PID. НАПРИМЕР. Чтобы гарантировать, что процесс 17325 будет работать только на первом ядре ЦП, вы должны запустить cpuset -c 0 -p 17325. Подобная функциональность не интегрирована в spawn-fcgi, и поскольку PHP-процессы будут продолжать приходить и уходить, когда они попадают в PHP_FCGI_MAX_REQUESTS (по умолчанию 500) и заменяются, балансировка их по ядрам самостоятельно будет сложной задачей. Лучше позволить планировщику Linux обрабатывать это по мере необходимости.