quarta-feira, 20 de julho de 2016

Ubuntu e o tal boot com "concurrency"

Como ativar todos os núcleos do seu processador no boot do Ubuntu (Diolinux)

O mau cheiroso script /etc/init.d/rc nem é executado no boot:

Mask /etc/init.d/rc and /etc/init.d/rcS from initscripts

Trata-se de entulho remanescente do tempo das cavernas.

Rode aí:
(Ubuntu 16.04)

$ systemctl is-enabled rc.service 
masked

Um serviço masked está super ultra desabilitado.

Tem influência no desempenho o serviço ondemand.service. Por padrão, o kernel do Ubuntu configura o escalonador de frequência de todos os núcleos com performance [1], que os mantêm sempre na frequência máxima nominal — faz sentido durante o boot, para usar ao máximo o hardware, sem preocupar-se com consumo elétrico. O serviço, depois de 60 segundos, altera todos os núcleos para ondemand, com objetivo de aproveitar os recursos SpeedStep, Cool'n'Quiet e similares. Até o Ubuntu 16.04, esse serviço é na verdade um script SysV (/etc/init.d/ondemand), suportado pelo systemd através do sysv-generator. No futuro Ubuntu 16.10, será um pouco diferente:

On Ubuntu, provide an "ondemand.service" that replaces /etc/init.d/ondemand

O shell script /lib/systemd/set-cpufreq é chamado através de um arquivo .service nativo, Type=idle, executado pelo systemd quando não houver mais jobs pendentes, em outras palavras, no final do boot. Outra mudança é que, ao ser detectado o uso do driver intel_pstate, o script não mexe no escalonador e mantém performance. Esse driver funciona de forma diferente do acpi-cpufreq e powernow-k8 e com ele não é recomendado usar ondemand (bons dados vindos do pessoal da Canonical podem ser obtidos aqui).

Quanto ao número de núcleos ativos, não há nada a fazer. O kernel ativa todos, a menos que passemos a opção de boot maxcpus=<número>. A saída de lscpu diz quantos núcleos estão ativos ("On-line CPU(s) list"). É uma maneira amigável de mostrar o que está em /sys/devices/system/cpu/online.

Resumo: ao que tudo indica, a tal configuração milagrosa não tem efeito algum.


[1] CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y.

Um comentário: