Por fim, conseguimos atingir nossa meta de dimensionar o uso da CPU do aplicativo para 80% + no RHEL7. Agora está muito mais perto de como o aplicativo é executado no RHEL6.
A seguir estão as nossas observações e o motivo que levou à nossa conclusão:
"vmstat" showed "runnable" count > total number of CPUs. But at the same time CPU usage was just 50%. Another indicator was the number of "context switches" between RHEL6 & RHEL7. RHEL7 showed lot lesser context switches for the same application load compared to RHEL6.
Isso significa que o processamento não é lento, mas as tarefas executáveis não são atribuídas aos núcleos da CPU. Depois de um pouco de pesquisa, encontramos o parâmetro de kernel "kernel.sched_migration_cost_ns"
, que basicamente especifica a quantidade de tempo antes da qual a tarefa executável seria migrada para outra CPU.
kernel.sched_migration_cost
Amount of time after the last execution that a task is considered to be “cache hot” in migration decisions. A “hot” task is less likely to be migrated, so increasing this variable reduces task migrations. The default value is 500000 (ns). If the CPU idle time is higher than expected when there are runnable processes, try reducing this value. If tasks bounce between CPUs or nodes too often, try increasing it.
Diminuir o valor de kernel.sched_migration_cost
para cerca de 250 nanossegundos (padrão: 500ns) nos ajuda a acelerar o uso da CPU para 80%.