2023/11/22

Linux Scheduler está limitado a 8-cores - mas não é um erro

Tem circulado uma notícia que dá conta do Linux ter um bug que o limita a um máximo de 8-cores, mas não é isso que acontece.

A notícia surgiu nos últimos tempos, dando conta que o kernel Linux teria ficado acidentalmente limitado a um máximo de 8-cores, num bug que permaneceria indetectado há quase vinte anos. Não seria a primeira vez que se descobriria um erro num sistema que tinha passado despercebido por mais de uma década, mas sendo algo tão fulcral como o número de cores que podia utilizar, era um erro que - a existir - certamente teria sido detectado. E na verdade, o "erro" não é nenhum erro, nem tão pouco o Linux está limitado a 8-cores.

Antes de avançarmos, vamos ter que mergulhar um pouco no funcionamento interno do sistema e dos CPUs. No tempo em que um CPU tinha apenas 1-core, a criação do efeito "multi-tarefa" - poder correr vários programas simultaneamente - obrigava a que o CPU tivesse que ser partilhado pelas tarefas. Para isso, o sistema encarregava-se de fazer com que o um programa pudesse correr durante uma pequena fracção de tempo, depois correndo uma fracção de outro programa, e assim sucessivamente. Como isto acontece a alta-velocidade, o resultado é um computador que cria a ilusão de poder correr diversos programas em simultâneo.
Com a chegada dos CPUs multi-core, deixou de ser necessário obrigar o sistema a mudar tão rapidamente entre diferentes tarefas (essa mudança acarreta perda de tempo por parte do sistema), permitindo que cada tarefa pudesse funcionar durante mais tempo, tornando o processo mais eficiente. Mas, este aumento do tempo da "fatia" atribuída também não pode ser feita de forma desmesurada, já que se pode tornar contraprodutiva se for excessiva - imagine-se que o CPU deixava cada processo correr durante 5 segundos, durante os quais os demais processos ficariam suspensos e sem reacção. Por isso mesmo aplicou-se um limite de 8-cores ao Linux Scheduler, até aos 8-cores o sistema vai aumentando progressivamente o tempo de cada fatia de processamento atribuída a cada core, mas se tivermos um CPU com 96-cores, o tempo de cada fatia manter-se-á no mesmo valor.

Isto não significa que o Linux não vá tirar partido dos 96-cores disponíveis, se houver necessidade disso, apenas estabelece o tempo de processamento que irá ser aplicado para cada fatia em todos eles.


Portanto, se usam Linux em máquinas com mais de 8-cores, não se preocupem que o sistema está a dar-lhes o melhor uso possível. :)

3 comentários:

  1. Carlos, estive a dar uma vista de olhos no artigo para o qual apontas, a parece-me que a conclusão do mesmo é diferente da tua.

    o final, diz mais ou menos isto:

    *"Os CPUs recentes da AMD para computadores de secretária dispõem de 32 filas, os CPUs recentes da AMD para servidores dispõem de 128 filas por CPU e geralmente têm várias CPUs físicas.

    É problemático que o kernel tenha sido codificado para um máximo de 8 núcleos (num fator de escala de 4). Não é eficiente reprogramar centenas de tarefas a cada poucos milissegundos, talvez num núcleo diferente, talvez numa moldagem diferente. Não é eficiente para o desempenho nem para a alocação da cache.

    Para concluir, o kernel foi acidentalmente codificado em 8 núcleos nos últimos 15 anos e ninguém percebeu.

    Ups."*

    ResponderEliminar
    Respostas
    1. Sim, mas a conclusão dele está errada. :)

      O tempo de cada "fatia" de cada processo é que está limitado e não é por acidente mas sim deliberadamente: vai aumentando de 1-core até 8-cores, mas depois é irrelevante quer tenhas 8-cores ou 1000-cores, o tempo da fatia de processamento vai manter-se igual. Era completamente absurdo continuar a aumentar o tempo indefinidamente, fazendo com que pudesse chegar - imagine-se - a 1 segundo, durante o qual o núcleo estaria "preso" só naquela tarefa sem poder mudar para outras.

      Eliminar
    2. Ok, eu próprio tenho de aprender um pouco mais sobre como funciona o núcleo quer dos CPUs modernos, quer do próprio Linux.

      Eliminar