Como calcular% de CPU com base em pulsos de CPU brutos no SNMP

5

De acordo com o link ssCpuUser , ssCpuSystem , ssCpuIdle , etc são preteridos em favor das variantes cruas ( ssCpuRawUser , etc).

Os valores anteriores (que não cobrem coisas como nice, wait, kernel, interrupt, etc) retornaram um valor percentual:

The percentage of CPU time spent processing user-level code, calculated over the last minute.

This object has been deprecated in favour of 'ssCpuRawUser(50)', which can be used to calculate the same metric, but over any desired time period.

Os valores brutos retornam o número "bruto" de pulsos que a CPU gastou:

The number of 'ticks' (typically 1/100s) spent processing user-level code.

On a multi-processor system, the 'ssCpuRaw*' counters are cumulative over all CPUs, so their sum will typically be N*100 (for N processors).

Minha pergunta é: como você transforma o número de ticks em porcentagem?

Ou seja, como você sabe quantos ticks por segundo (normalmente - o que implica nem sempre - 1 / 100s, o que significa 1 a cada 100 segundos ou que um tique representa 1 / 100th de um segundo).

Eu imagino que você também precisa saber quantas CPUs existem ou você precisa buscar todos os valores de CPU para adicioná-los todos juntos. Eu não consigo encontrar um MIB que lhe dá um valor inteiro para # de CPUs, o que torna a rota antiga inábil. A última rota parece não ser confiável porque alguns dos números se sobrepõem ( às vezes ). Por exemplo, ssCpuRawWait tem o seguinte aviso:

This object will not be implemented on hosts where the underlying operating system does not measure this particular CPU metric. This time may also be included within the 'ssCpuRawSystem(52)' counter.

Alguma ajuda seria apreciada. Em todos os lugares parece apenas dizer que% está obsoleto porque pode ser derivado, mas não encontrei nenhum lugar que mostre a maneira padrão oficial de realizar essa derivação.

O segundo componente é que esses "ticks" parecem ser cumulativos, em vez de ao longo de algum período de tempo. Como faço para amostrar valores ao longo de algum período de tempo?

A informação final que eu quero é:% de usuário, sistema, ocioso, legal (e idealmente roubar, embora não pareça haver um MIB padrão para isso) "atualmente" (nos últimos 1-60s provavelmente ser suficiente, com uma preferência por períodos de tempo menores).

    
por Bo Jeanes 24.10.2012 / 18:45

3 respostas

4

Como esses são contadores absolutos, você teria que recuperá-los regularmente métricas e, em seguida, faça o cálculo sozinho. Então, se você quiser o número mais o minuto seguinte , você teria que obter os números, esperar um minuto e obter os números novamente. O SNMP não atualizaria esses números com muita frequência, não será capaz de conseguir isso a cada segundo de qualquer maneira.

Depois de ter o usuário bruto, agradável, sistema, ocioso, interrompe os contadores que você pode obter o número total de ticks, somando-os. Mesmo a descrição da MIB diz que adicioná-los é esperado.

$ snmptranslate -Td .1.3.6.1.4.1.2021.11.52
UCD-SNMP-MIB::ssCpuRawSystem
...
    This object may sometimes be implemented as the
    combination of the 'ssCpuRawWait(54)' and
    'ssCpuRawKernel(55)' counters, so care must be
    taken when summing the overall raw counters."

Em seguida, independentemente de quanto tempo passou desde que você realizou as medições, O número total de tiques durante esse período é total1 - total0 . E o ocioso porcentagem seria (idle1-idle0)/(total1-total0) .

Você está perguntando "como você sabe quantos tiques por segundo é normalmente", mas como você pode ver, você não precisa saber disso.

    
por 24.10.2012 / 19:27
3

Como a maioria das distros Linux tem 1/100 de ticks, uma maneira muito simples de fazer isso é via bash:

[myhost]# echo "scale=2; -1 * ('snmpget -Oqv -v2c -c public localhost .1.3.6.1.4.1.2021.11.54.0;sleep 5' - 'snmpget -Oqv -v2c -c public localhost .1.3.6.1.4.1.2021.11.54.0' )/'snmpwalk -Oqu -v2c -c public localhost 1.3.6.1.2.1.25.3.3.1.2 | wc -l'/5" | bc | sed 's/^\./0./' | awk '{print "CPU_IOWAIT% " $1}'

IOWAIT 0.07

[myhost]#

No RH / Centos e no Ubuntu, funciona bem e com precisão por 5 s de intervalo ... Menos que isso, o snmp não incrementa o Counter32, e você obtém zeros o tempo todo.

Eu fiz loops e comparei com iostat -c 5 100 , também gerando IO com dd , e funcionou bem.

Você pode usar qualquer um dos OIDs ssCPUraw (1.3.6.1.4.1.2021.11.5x de 50 a 57, se eu não estiver errado, no meu exemplo eu usei ssCPURawWait, 54), e o 1.3.6.1.2.1.25.3.3.1.2 | wc -l é para obtenha o número de núcleos ...

Você precisa dividir o "delta" do contador / intervalo - no meu caso, 5 / - isso é basicamente o que o script faz!

    
por 12.11.2015 / 11:51
1

Além do que já foi escrito por chutz, a referência à duração de um tick pode ser encontrada em man 2 times :

The number of clock ticks per second can be obtained using:

     sysconf(_SC_CLK_TCK);

que é uma função do sistema a ser chamada em C, mas também pode ser obtida simplesmente executando getconf CLK_TCK em seu shell. Esse número é uma constante de tempo de compilação e poderia ser alterado por qualquer pessoa que toque os arquivos de origem, mas isso seria um evento bastante raro - as distribuições comuns do Linux vêm com o valor 100.

    
por 24.10.2012 / 20:45