Acabei de obter uma conta em um VPS de 24 núcleos (de acordo com o UnixBench, existem 24 CPUs).
- Em termos gerais, como posso fazer bom uso de todos esses núcleos para computação shell de uso geral no Debian?
- Preciso digitar algo especial ao emitir aplicativos de longa execução no shell para fazer com que cada processo seja executado em um núcleo separado, se houver algum disponível? Ou o Debian apenas cuida de tudo isso, invisível para mim?
Responder1
Você não precisa fazer nada de especial: é trabalho do kernel decidir qual thread vai para qual CPU, e ele faz um trabalho muito melhor do que um ser humano faria.
No entanto, não faz sentido ter 24 CPUs se você não tiver pelo menos 24 threads simultâneos para executar. Os programas não serão magicamente mais rápidos se mais CPUs estiverem disponíveis: apenas os programas que são codificados para ter múltiplos threads paralelos serão beneficiados, e muitos programas não serão beneficiados, não porque sejam escritos de maneira inferior, mas porque o que eles fazem é inerentemente não paralelizável.
Um programa com N threads de computação simultâneos se beneficiará de até N CPUs (embora possa não ser N vezes mais rápido, porque a sincronização entre os threads leva tempo). A execução de M programas diferentes que não interagem muito, se é que interagem de forma semelhante, aproveita M CPUs (ou mais do que isso se os programas forem multithread).
Existem alguns casos em que a intervenção manual é necessária para aproveitar o paralelismo. Se você estiver iniciando diversas tarefas de processamento de dados, tome cuidado para que elas sejam geradas em paralelo (com pouco mais de uma tarefa por CPU) em vez de uma após a outra. Por exemplo, ao construir software, passe a -j
opção para make
. Veja alguns outros exemplos e explicações:
- Quatro tarefas em paralelo... como faço isso?
- Execução paralela de um programa em vários arquivos
- Por que as pessoas recomendam a opção -j3 para make quando se tem uma CPU dual-core?
- Executando até comandos X em paralelo
Se você estiver executando um servidor web, todos os servidores web projetados para cargas pesadas são bons para explorar o paralelismo. Apache é usado como caso de teste ao avaliar o desempenho de otimizações no kernel Linux. Tenha cuidado, entretanto, que o paralelismo na CPU só ajuda se não houver outro gargalo, como contenção devido ao acesso ao banco de dados ou largura de banda de entrada-saída.
Responder2
Fazer uso de muitos núcleos para acelerar o desempenho depende muito do seu aplicativo. Algumas aplicações precisam ser executadas passo a passo: simplesmente não há como dividir a computação em paralelo entre vários núcleos porque, para calcular uma determinada etapa, é necessário conhecer os resultados das etapas anteriores. Se for esse o caso, usar 24 núcleos é tão bom quanto usar apenas um.
Em outros casos, onde o aplicativo precisa fazer muitas coisas que não dependem umas das outras, ter muitos núcleos pode acelerar consideravelmente as coisas. Como exemplo pertinente, se você estiver compilando um projeto com muitos arquivos de origem, poderá compilar cada arquivo de origem de forma independente antes de vincular os diferentes arquivos. Nesse caso, você pode fazer com que o compilador compile cada arquivo em um núcleo separado. Aplicativos que podem fazer uso de vários núcleos de CPU geralmente possuem uma opção para você solicitar isso. Por exemplo, ao compilar um projeto usando GNU make
, você pode passar o -j
switch seguido de um número. Este número especifica o número de trabalhos make
que devem ser iniciados simultaneamente (leia-se: em núcleos diferentes).