Quantos núcleos estou usando em um servidor Linux?

30

Só estou me perguntando como posso descobrir no bash quantos núcleos de CPU um usuário está usando agora em um servidor Linux?

Estou enviando uma quantidade razoável de trabalhos em segundo plano para o servidor, portanto, gostaria de escrever um script bash para verificar antes de enviar um trabalho se os trabalhos em execução (processos) enviados por mim são muitos, porque tenho que permitir que outros os usuários têm núcleos suficientes para usar em seus trabalhos. Gostaria de saber qual comando bash pode me dizer quantos núcleos meus trabalhos estão usando agora.

Obrigado e cumprimentos!

Tim
fonte

Respostas:

39

Para obter o número de núcleos de CPU por CPU:

grep "^core id" /proc/cpuinfo | sort -u | wc -l

Ou para obter o número de CPUs físicas :

grep "^physical id" /proc/cpuinfo | sort -u | wc -l
Alix Axel
fonte
como verificar isso para um determinado usuário?
makis 1/10
26

Não sei se isso ajuda, mas você pode usar o mpstatutilitário para obter uma análise detalhada do uso da CPU por processador individual (ou núcleo). Por exemplo:

$ mpstat -P ALL 1

12:49:59 PM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
12:50:00 PM  all    7.89    0.00    1.25    0.88    0.00    0.00    0.00   89.97   1359.00
12:50:00 PM    0   14.00    0.00    0.00    0.00    0.00    0.00    0.00   86.00   1043.00
12:50:00 PM    1   15.84    0.00    7.92    3.96    0.00    0.99    0.00   71.29    297.00
12:50:00 PM    2    3.96    0.00    0.00    1.98    0.00    0.99    0.00   93.07      0.00
12:50:00 PM    3    3.96    0.00    0.99    2.97    0.00    0.00    0.00   92.08      0.00
12:50:00 PM    4    4.00    0.00    0.00    0.00    0.00    0.00    0.00   96.00      0.00
12:50:00 PM    5    4.95    0.00    0.99    0.00    0.00    0.00    0.00   94.06     18.00
12:50:00 PM    6   10.89    0.00    0.99    0.00    0.00    0.00    0.00   88.12      0.00
12:50:00 PM    7    5.05    0.00    0.00    0.00    0.00    0.00    0.00   94.95      0.00

Neste exemplo, você pode ver que de CPU 0, 1e 6estão fazendo mais trabalho do que o resto deles. Às vezes, você verá que uma única CPU está próxima (ou a) 100%, enquanto outras estão em zero. Isso pode ser um indicador de programa (ou parte de um programa) que é de thread único e capaz de usar apenas uma única CPU por vez.

Para instalar mpstatem um sistema Fedora, RHEL ou CentOS, use yum install sysstat.

Matt Solnit
fonte
Agradecemos um milhão por fornecer esta resposta! Meus colegas estavam usando o comando "top" e tirando todas as conclusões erradas sobre a utilização do processador até eu mostrar a eles o comando mpstat.
Nav
Não disponível no Ubuntu: # aptitude search mpstat #.
Alix Axel
2
@AlixAxel tente em aptitude search systatvez disso.
Matt Solnit
@MattSolnit: Ainda sem sorte.
Alix Axel
O mpstat é fornecido pelo pacote sysstat no Debian e no Ubuntu . Eu esperaria que a maioria das distribuições derivadas do Debian usasse o mesmo nome de pacote. Nas distribuições derivadas do Debian, comece por apt-cache search --full mpstat.
a CVn
2

A menos que seja explicitamente configurado para não (fixar um processo a uma CPU específica), todos os núcleos podem ser considerados em uso o tempo todo. O planejador alocará os processos no próximo núcleo disponível. Caso em questão, "System Monitor" (parte do GNOME) está mostrando minha carga quase a mesma em todos os quatro núcleos da minha máquina.

EmmEff
fonte
Estou enviando uma quantidade razoável de trabalhos em segundo plano para o servidor, então gosto de escrever um script bash para verificar antes de enviar um trabalho se os trabalhos (processos) em execução enviados por mim são muitos, porque tenho que permitir que outros usuários tenham núcleos suficientes para usar em seus trabalhos. Então, eu gostaria de saber qual comando bash pode me dizer quantos núcleos meus trabalhos estão usando agora.
Tim
3
Eu não acho que você entendeu minha resposta. O número de núcleos em uso é SEMPRE o número total de núcleos disponíveis. Use a carga geral do sistema como um fator para determinar se o envio de seu trabalho deve ou não ser acelerado.
EmmEff
Obrigado! Eu verifico a carga geral do sistema. Foi-me dito por um dos meus colegas que não posso usar todos os núcleos, porque quem sabe os outros irão executar seus trabalhos em breve e eles durarão por um bom tempo. Você também acha que tenho que limitar os núcleos que estou usando?
Tim
2

Então, você verá aqui algumas respostas que lhe dirão como seus núcleos estão sendo utilizados.

NO ENTANTO - isso realmente não está lhe prestando um serviço. Você fez uma suposição básica que simplesmente não se sustenta - que seus trabalhos tenderão a se agrupar em algum subconjunto dos núcleos.

Em vez disso, seus trabalhos serão espalhados por todos os núcleos, a menos que você implemente algo que os mantenha "escritos" de alguma forma. (Observação: não estou recomendando isso; apenas digo "a menos que")

Aqui está uma estratégia alternativa: identifique para o seu sistema em particular qual é o nível LOAD quando achar que é "aceitável" que outros usuários estejam adicionando mais trabalhos. Em seguida, crie algo que somente envie um novo trabalho em segundo plano quando o nível de carga estiver abaixo desse limite.

Dessa forma, a solução será independente da contagem de núcleos, mais portátil, mais flexível e mais fácil de "ajustar".

pbr
fonte
Acabei de notar um comentário que você adicionou à resposta de outro pôster, indicando que isso se deve a algo que um colega lhe disse. Então, de fato, parece que o equívoco é dele, não seu. Me desculpe por isso!
1/09
Obrigado! Quanto a "Identificar para o seu sistema específico qual é o nível LOAD quando você achar que é" aceitável "que outros usuários adicionem mais tarefas", se a carga atual não for causada principalmente pelas tarefas em execução, eu me sentiria mais livre para usar as demais CPUs, mas se na carga atual meus trabalhos em execução tiverem uma quantidade razoável, provavelmente terei de desistir de usar as demais CPUs. Então você ainda acha que não preciso estimar o uso da CPU dos meus trabalhos em execução totais?
Tim
Não, realmente não acho que faça sentido distinguir entre quanto da carga atual é dos seus trabalhos e outros trabalhos. Considere a simplicidade: seu trabalho tenta ser um bom cidadão e só se submete se a carga estiver abaixo de um nível que você considere aceitável. A idéia NUNCA é utilizar toda a capacidade restante; isso deixa outros usuários futuros em um vínculo. Idealmente, todos os usuários usariam a mesma lógica para isso.
PBR
2

Se você quiser fazer isso para que ele funcione no linux e no OS X, você pode:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
tim_yates
fonte
1

Você pode obter uma estimativa aproximada executando top, pressionando ' U' e especificando seu nome de usuário e, em seguida, adicionando a utilização da CPU dos seus principais processos.

dmckee
fonte
Eu gosto de conhecer um comando bash que pode me dizer o número, pois quero usá-lo em um script bash.
Tim
O @Tim toppode ser executado em modo batch com a opção -b. Combine-o com a opção -n para obter o número de iterações necessárias.
Nagul
1
você pode dar um exemplo de código para obter o número de núcleos usados ​​por todos os trabalhos (processos) enviados por um usuário?
Tim
@ Tim Não fora do bastão. Eu precisaria escrever esse script analisando a topsaída ou o google para ver se alguém já fez isso. No entanto, não estou convencido de que valha a pena o esforço, pois acho que receberei diferentes resultados para cada execução, dada a velocidade com que a alternância de contexto ocorre. O sistema não carrega um indicador suficientemente bom? Ele informa com eficiência quantos núcleos virtuais são necessários para lidar com a fila de processos (processos aguardando na CPU).
Nagul 01/10/09
@ Nagul: Sim, a carga do sistema é boa e também verifico isso. No entanto, algumas pessoas continuam me dizendo que eu não posso usar todos os núcleos, porque quem sabe os outros executarão seus trabalhos em breve. Então eu acho que tenho que limitar os núcleos que estou usando. A propósito, você já viu scripts on-line em algum lugar que verificam a carga da CPU e da memória e enviam tarefas dinamicamente com base no uso? Eu os olho há tanto tempo. Obrigado!
Tim