A configuração de seus processos de trabalho do nginx para 20 é desnecessária. Com quatro núcleos de CPU, não há razão para configurá-lo acima de 4. Mesmo se você tivesse mais núcleos de CPU, você provavelmente não se beneficiaria da configuração mais alta.
Além de configurar seus processos nginx muito altos, talvez você esteja configurando seus processos fastcgi muito altos. 160 é muito. A menos que seu código PHP gaste muito tempo esperando por recursos lentos, duvido que você realmente queira manipular 160 solicitações FastCGI de uma só vez. Como você tem apenas 4 núcleos, isso fará com que cada solicitação demore mais para ser concluída.
Não sei por que você acha que sua CPU não está sendo usada de forma eficaz. Analisando sua saída principal, os dois núcleos mais ocupados ainda estavam inativos 20 e 30% do tempo. Isso poderia significar que o PHP estava apenas tendo que passar solicitações para dois processos FastCGI de uma só vez para acompanhar a carga, ou poderia significar que ele processava até 160 solicitações simultâneas, mas que elas não precisavam de muito tempo de CPU (por exemplo, eles estavam esperando na rede ou disco). De qualquer forma, se o trabalho tivesse sido distribuído de maneira mais uniforme pelos quatro núcleos, ele não teria terminado mais rápido.
Embora eu não recomende, você pode forçar processos a serem executados em núcleos específicos usando taskset
. A sintaxe básica é tasket -c $CPU_LIST -p $PID
. POR EXEMPLO. Para garantir que o processo 17325 seja executado somente no primeiro núcleo da CPU, você executaria cpuset -c 0 -p 17325
. Esse tipo de funcionalidade não é integrado ao spawn-fcgi, e como os processos PHP continuarão indo e vindo enquanto eles acessam PHP_FCGI_MAX_REQUESTS (o padrão é 500) e são substituídos, balancear os núcleos entre eles seria complicado. É melhor deixar o planejador do linux lidar com isso conforme necessário.