Recentemente recebi um MacBook Pro com CPU M1 pro, que possui 2 núcleos de “eficiência” e 8 núcleos de desempenho. Quando executo htop/btop/top obtenho uma média de carga >2 porque o agendador de processos sempre atribui certos processos de menor demanda aos núcleos de eficiência, o que faz com que esses núcleos sempre funcionem com 60 a 100% da capacidade.
Sinto que os 2 núcleos de eficiência reduzem a utilidade da métrica média de carga, que já foi reduzida devido aos múltiplos núcleos. Em um passado distante e obscuro, tínhamos CPUs de núcleo único nas quais a média de carga fazia sentido intuitivamente. No entanto, agora temos 2 tipos de núcleo de CPU em um único sistema, e meu telefone mais recente tem 3 tipos diferentes de núcleo: eficiência, desempenho e um único núcleo de ultra desempenho.
Como deveria ser calculada essa nova média de carga? Há algum esforço contínuo para redefinir uma métrica geral de carga do sistema?
Como os núcleos de eficiência são feitos para executar processos de baixa prioridade, talvez faça sentido excluí-los da métrica padrão? Em seguida, divida o valor de carga restante entre as CPUs não eficientes.
Por exemplo, uma média de carga de 3,4. Subtraia 2 para os núcleos de eficiência, 1,4. Em seguida, divida pelo número de núcleos de desempenho, 1,4/8 = 0,175.
Primeiro, devemos falar sobre o que realmente é "carga": é o número de processos em execução, mais o número de processos que estão atualmente no que é chamado de "sono ininterrupto", ou seja, principalmente estes aguardando dados de IO periféricos.
Isso significa que se você tiver uma máquina de 16 núcleos (não importa quão "fortes ou fracos" sejam os núcleos individuais) e executar 100 processos, cada um carregando IO pesadamente (por exemplo, martelando páginas de arquivos mapeados na memória ou sendo carregado conforme necessário na troca), você pode obter uma carga de 100. Isso significa que essa média de carga não é principalmente uma função do uso dos núcleos da CPU. Ele tenta medir um pouco o quão carregado está o seu sistema atual .
Não é realmente útil comparar cargas em máquinas diferentes. Faz sentido compará-los na mesma máquina - se sua carga suavizada ( a média de carga estiver errada no sentido estrito; se você tiver formação em engenharia elétrica, essas são médias móveis ponderadas exponencialmente , ou seja, saídas simples de filtro IIR unipolar) diminui, você está recuperando o trabalho, se aumentar, você está trabalhando mais. Mas você não pode colocar duas máquinas diferentes próximas uma da outra e esperar que as cargas sejam sensatamente comparáveis - e, como tal, redefinir a carga para ser mais universalmente útil em diferentes arquiteturas de CPU é uma coisa discutível a se fazer. Nunca foi feito para ser isso.
Agora, sabendo que você fez a pergunta assumindo que "carga" é apenas "carga de CPU" (ou seja, a quantidade de CPUs que não estão ociosas em um determinado momento), teremos que resolver isso em vez de discutir a medida de "carga" do Linux.
Essa utilização da CPU já era quase inútil no passado – uma vez que os núcleos da CPU eram escalonados em frequência dinamicamente; o momento que atingiu os computadores de consumo (laptops) foi por volta de 2000 com o PowerNow! da AMD. 50% do tempo de um núcleo rodando a 1,2 GHz simplesmente não vale o tempo de um núcleo rodando a 3,9 GHz; e ambos existem no mesmo sistema ao mesmo tempo, e ambos podem mudar de frequência durante o tempo que está sendo levado em consideração para calcular médias de longo prazo. E isso acontecerá exatamente quando a utilização da CPU ultrapassar os limites e houver tarefas suficientes em estado pronto. Então, sim, não. Sinceramente, trato a "utilização da CPU" como nada mais do que "se estiver abaixo de talvez 90%, meu sistema definitivamente pode fazer mais trabalho de CPU, fora isso, é difícil dizer e depende do trabalho".
Então, francamente, não tem sido uma métrica muito útil nos últimos cerca de 20 anos.
O escalonamento de frequência já era uma coisa naquela época, e "a CPU está aguardando armazenamento ou rede 90% do tempo" ainda parece baixa utilização, mas na verdade diz "da carga de trabalho que estou tentando atender, tenho 100% saturação". Há uma quantidade muito limitada de intuição nisso - mais recentemente desde o início da década de 1990, CPUs, RAM e barramentos periféricos foram desacoplados, e isso tornou a medição do tempo em que a CPU não ficou ociosa uma tentativa questionável de descrever o sistema .carregar. Tudo o que ele fornece é a informação se um dos muitos recursos limitados do seu computador está esgotado, e a porcentagem não é nem de longe proporcional à capacidade real de realizar mais trabalho, porque um computador com 0,1 · (contagem de núcleos) de utilização da CPU é provavelmente não funciona muito em altas taxas de clock; portanto, com carga mais alta, o computador repentinamente se torna mais capaz. O mesmo, embora ainda mais complexo e difícil de prever, acontece quando o computador tem núcleos de CPU heterogêneos (e isso não é uma invenção nova – o hyperthreading já trouxe isso para computadores de consumo há cerca de 15 anos, e os computadores NUMA já existiam muito antes) .
Francamente: de jeito nenhum. Fique com a métrica atual! A métrica de carga atual tem um propósito: tornar comparável a situação de carga de trabalho na mesma máquina. E continua fazendo isso; de qualquer maneira, é difícil fazer comparações sensatas entre plataformas:
Pessoas que realmente se preocupam com a forma como seus sistemas são utilizados para dimensioná-los corretamente para suas cargas de trabalho (e não apenas como, para um laptop, se o sistema que eles possuem pode fazer o que deveria com rapidez suficiente) fazem o oposto de reduzir a utilização do sistema para um número único independente da carga de trabalho : eles precisam observar quais são os gargalos para aquela carga de trabalho específica (ou o intervalo necessário de cargas de trabalho) e, em seguida, atribuir os recursos adicionais necessários – e o "tempo de CPU" é apenas um desses recursos.