Monthly Archives: September 2017

Understanding CPU Metrics in a Linux environment

Português/English

The purpose of this blog post is just compile some information I have been around in the last weeks, while producing reports on some Oracle database environments for one of our clients.

When it comes to CPU metrics, there is always some confusion about the real understanding of each metric.

I am not an Operating System specialist, so my intention here is not produce a long article explaining all the details. I will just put together some notes that would be useful to me in the future, and hopefully for someone else that reads it. I will also point some links that explains better the metrics. They helped me a lot to understand them.

CPU Metrics

The CPU has 3 main states:

sy (Sys): time the CPUs spent running system (kernel-related, operating system) processes.
us (User): time the CPUs spent running user (i.e., not kernel-related) processes.
id (Idle): time the CPUs were doing nothing.

But they have other sub-types, to compose the seven metrics shown in the “top” command:

ni (Nice): time the CPUs spent running user processes that have been niced.
wa (I/O Wait): time the CPUs were doing nothing, while there were runnable processes waiting for I/O operations to complete.
hi (Hardware Interrupts): time the CPUs spent dealing with hardware interrupts.
si (Software Interrupts): time the CPUs spent dealing with software interrupts.
st (Steal Time): (only for Virtual Machines) time the virtual CPUs spent waiting to be served with a real CPU from the Hypervisor.

The sum of those seven metrics is 100%.

Load Average

Load Average is the average number of runnable processes during a period of time. This includes ALL runnable processes:

  • Those that are really running.
  • Those that are waiting for a CPU to become available.
  • Those that are waiting for an I/O operation to complete.

The number usually agreed as a maximum good number for Load Average is 70% of the CPU Threads. So, if you have a server with, say, 4 CPU cores with 2 threads each, the Load Average should not be higher than 5.6 (70% of 8).

My Summary and Conclusions

  • Beware of average values. A “good” average could hide huge and even long spikes.
  • If the Load Average is between 70% and 100% of the CPU Threads, then probably you have processes wasting part of their time waiting for CPU.
  • If the Load Average is over 100% of the CPU Threads, then you probably is having huge CPU bottlenecks.
  • If you have high Load Average and low CPU Idle, then you have a CPU bottleneck in that moment/period.
  • If you have high Load Average, high I/O Wait Time but also high Idle Time, then the processes in the run queue are really waiting for I/O, not CPU.
  • If you don’t have I/O Wait Time, it does not mean you are not having I/O bottlenecks.
    • The I/O Wait Time only show up in the CPU metrics when there are some CPU Idle.
    • If the CPUs are all loaded, then I/O Wait is ZERO even if there are processes waiting for I/O. In this case, these processes would show up in the Load Average.

Links

Understanding Linux CPU stats

Understanding Linux CPU Load – when should you be worried?

Linux performance metric myths (Load Average, % IO Wait)

That’s it. If you find something wrong here, or want to add something, let me know.

I will update this post whenever I find more important information related.

See you!


Entendendo as métricas de CPU em um ambiente Linux

O propósito deste post é apenas compilar algumas informações que eu estive pesquisando nas últimas semanas, enquanto estava produzindo um relatório sobre alguns ambientes Oracle de um de nossos clientes.

Quando se trata de métricas de CPU, sempre há alguma confusão sobre o real significado de cada métrica.

Eu não sou um especialista em Sistema Operacional, e portanto minha intenção não é escrever um artigo longo explicando todos os detalhes. Eu vou apenas juntar algumas notas que me podem ser úteis no futuro, e espero que também sejam úteis para alguém mais que leia isto. Colocarei alguns links que explicam melhor as métricas. Eles me ajudaram muito a entendê-las.

Métricas de CPU

A CPU tem 3 estados principais:

sy (Sys): tempo que as CPUs gastaram executando processos do sistema (relacionados com o kernel do Sistema Operacional).
us (User): tempo que as CPUs gastaram executando processos de usuários (isto é, não relacionados diretamente com o funcionamento do Sistema Operacional).
id (Idle): tempo em que as CPUs não estavam executando nada.

Mas eles têm outros sub-tipos, que compõe as sete métricas exibidas no comando “top”:

ni (Nice): tempo que as CPUs gastaram executando processos que receberam prioridade (nice).
wa (I/O Wait): tempo em que as CPUs não estavam executando nada, mas havia processos esperando por operações de I/O terminarem.
hi (Hardware Interrupts): tempo que as CPUs gastaram lidando com interrupções de hardware.
si (Software Interrupts): tempo que as CPUs gastaram lidando com interrupções de software.
st (Steal Time): (somente para Máquinas Virtuais) tempo que as CPUs virtuais perderam esperando que o Hypervisor disponibilizasse uma CPU real.

A soma destas sete métricas é 100%.

Load Average

O Load Average é a quantidade média de processos prontos para executar em um período de tempo. Isto inclui TODOS os processos considerados prontos para executar:

  • Aqueles realmente executando.
  • Aqueles que estavam esperando por uma CPU ficar disponível.
  • Aqueles que estavam esperando por operações de I/O.

O número normalmente tido como consenso como máximo aceitável para o Load Average é o equivalente a 70% do número de CPU Threads. Então, se você tem um servidor com, digamos, 4 CPU cores e 2 threads em cada CPU, o Load Average não deveria ser maior do que 5.6 (70% de 8).

Meu Resumo e Conclusões

  • Cuidado com valores médios. Uma média “boa” pode esconder picos enormes e longos.
  • Se o Load Average está entre 70% e 100% das CPU Threads, então provavelmente você já tem processos perdendo parte do seu tempo esperando por CPU.
  • Se o Load Average está acima de 100% das the CPU Threads, então você provavelmente tem um sério gargalo de CPU.
  • Se você tem um Load Average alto e baixo CPU Idle, então você tem um gargalo de CPU naquele período/momento.
  • Se você tem um Load Average alto, I/O Wait Time alto mas também Idle Time alto, então os processos na fila estão na verdade esperando por I/O, não por CPU.
  • Se você não tem I/O Wait Time, isso não significa que você não tenha gargalos de I/O.
    • O I/O Wait Time só aparece nas métricas de CPU quando há tempo de CPU Idle.
    • Se as CPUs estão todas sobrecarregadas, então o I/O Wait será ZERO mesmo que você tenha processos esperando por I/O. Neste caso, estes processos devem aparecer no Load Average.

Links

Understanding Linux CPU stats

Understanding Linux CPU Load – when should you be worried?

Linux performance metric myths (Load Average, % IO Wait)

É isso. Se você encontrar algo errado aqui, ou quiser adicionar alguma coisa, me avise.

Eu vou atualizar este post sempre que encontrar alguma informação importante relacionada.

Até a próxima!

Advertisements