Embora a resposta de Matthew Ife tenha sido muito útil e nos tenha levado na direção certa, não foi exatamente o que causou o comportamento em nosso caso. No nosso caso, temos um aplicativo Java multi-thread que usa o conjunto de encadeamentos, por que nenhum trabalho é feito criando as tarefas reais.
No entanto, o trabalho real que os encadeamentos fazem é de curta duração e inclui esperas de IO ou esperas de sincronização. Como Mateus menciona em sua resposta, a média de carga é amostrada pelo SO, portanto, tarefas de curta duração podem ser perdidas.
Eu fiz um programa em Java que reproduziu o comportamento. A seguinte classe Java gera uma utilização da CPU de 28% (650% empilhada) em um dos nossos servidores. Ao fazer isso, a média da carga é de aproximadamente 1,3. A chave aqui é o sleep () dentro do thread, sem que o cálculo da carga esteja correto.
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class MultiThreadLoad {
private ThreadPoolExecutor e = new ThreadPoolExecutor(200, 200, 0l, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(1000), new ThreadPoolExecutor.CallerRunsPolicy());
public void load() {
while (true) {
e.execute(new Runnable() {
@Override
public void run() {
sleep100Ms();
for (long i = 0; i < 5000000l; i++)
;
}
private void sleep100Ms() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
}
}
public static void main(String[] args) {
new MultiThreadLoad().load();
}
}
Para resumir, a teoria é que os threads em nossos aplicativos ficam inativos e executam trabalhos de curta duração, porque as tarefas não são amostradas corretamente pelo cálculo da média de carga.