Obtenha a média de carga, excluindo processos limitados

4

Existe uma maneira de retornar as médias de carga, excluindo qualquer carga causada por processos legais?

Temos um mecanismo de balanceamento de carga que verifica o carregamento de vários servidores Linux e envia um trabalho para o servidor com a carga mais baixa. Tivemos um cenário em que todos os servidores tinham uma carga muito alta e, portanto, nenhum servidor poderia ser selecionado no balanceamento de carga. No entanto, notei que os servidores estavam lidando com vários processos legais, portanto, embora as médias de carga fossem altas, ainda era "seguro" enviar outro trabalho.

Deixe-me saber se é necessário esclarecer. Obrigado.

    
por Banjer 01.09.2011 / 17:34

3 respostas

6

Você pode escrever seu próprio script que usa ps para listar todos os processos no estado run / runnable sem um valor legal maior que 0. A sintaxe específica que você precisa usar será diferente com base na sua versão de ps . Algo como isso pode funcionar:

ps -eo state,nice | awk 'BEGIN {c=0} $2<=0 && $1 ~ /R/ { c++ } END {print c-2}'

Ele executa ps coletando o nível state e nice de todos os processos e canaliza a saída para awk , que define uma variável de contagem c e a incrementa sempre que a segunda coluna (nice) for menor que ou igual a 0 e a primeira coluna inclui R (para executável). Uma vez feito isso, imprime o valor de c após a subtração 2. Subtraio 2 porque os comandos ps e awk quase sempre serão considerados executáveis durante a execução do comando. O resultado final será um único número que representa o número de processos executáveis no momento em que o script foi executado, excluindo ele mesmo e os processos executados em nicely , que é essencialmente a carga instantânea na máquina. Você precisaria executá-lo periodicamente e fazer uma média de 1, 5 e 15 minutos para determinar as médias de carga típicas da máquina.

    
por 03.09.2011 / 01:57
0

Eu só precisava de algo semelhante. A resposta de mkomitee ajudou-me.

Mas o comando ps -e lista apenas processos. A carga deve levar em conta que um processo pode ter muitos segmentos em execução em paralelo. Sugiro adicionar a opção -L à chamada de ps para listar todos os tópicos:

ps -eLo state,nice | awk 'BEGIN {c=0} $2<=0 && $1 ~ /R/ { c++ } END {print c-2}'
    
por 28.01.2016 / 17:08
0

OK, o verdadeiro tópico antigo aqui, mas eu queria colocar meus próprios 2 centavos aqui, caso alguém precise disso, como eu fiz. Na minha situação específica, eu precisava do resultado em porcentagem e não queria que o tempo da CPU fosse levado em conta.

Eu encontrei o utilitário mpstat na minha máquina (debian) instalado por padrão e acredito que seja um utilitário bastante básico que está disponível para a maioria das distribuições.

executando mpstat 2 1 (um ciclo de 2 segundos - o uso da CPU tem uma média de 2 segundos) fornece a seguinte saída:

Linux 3.16.0-4-amd64 (vm4)  12/14/2017  _x86_64_    (4 CPU)

11:51:51 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:51:53 PM  all    3.02   96.86    0.12    0.00    0.00    0.00    0.00    0.00    0.00    0.00
Average:     all    3.02   96.86    0.12    0.00    0.00    0.00    0.00    0.00    0.00    0.00

Você percebe como tudo está bem explicado para você, a boa coluna e a coluna inativa no final. Você notou que bom é real alto neste caso.

Com um pouco de magia awk usando o comando abaixo (quebrado para maior clareza, espero que você possa acompanhar, este não é um tutorial do awk):

mpstat 2 1| \
awk '$3 ~ /CPU/ { \
 for(i=1;i<=NF;i++) { \
  if ($i ~ /%nice/) {nice=i} \
  if ($i ~ /%idle/) {idle=i} \
 } \
} \
$3 ~ /all/ { print 100 - $nice - $idle }'

obtemos o seguinte resultado:

3.14

que é exatamente o que nós queríamos. Assumimos 100 como a porcentagem total e subtraímos de qualquer tempo ocioso (0,00 neste caso) e qualquer tempo agradável (96,86 neste caso). E voila nós temos o nosso resultado.

No meu caso, uso mpstat 2 1 , mas você também pode usar mpstat 10 1 e o resultado será a média de carga dos últimos 10 segundos. É só que o comando precisa de 10 segundos para terminar, já que tem que amostrar 10 segundos. Mas 2 segundos foram suficientes para que minhas necessidades tivessem uma ideia.

Espero que isso ajude alguém!

    
por 15.12.2017 / 01:10

Tags