premettendo che i vari tool che fanno sti monitoraggi non danno quasi mai gli stessi identici risultati (per diversi motivi: arrotondamenti, considerare o ignorare alcuni dati (pur magari non particolarmente significativi), ecc ecc) certo che un minimo di consistenza ce lo si aspetta. Nota che lo stesso `ps` da qualche parte nel man dice che - con alcuni parametri - difficilmente si arriverà mai a vedere il valore della cpu al 100% (anche quando magari lo è) e , sempre `ps` dà risultati decisamente diversi in base alle opzioni usate. Poi, per dire, top ogni tanto mi segna la cpu al 104%

.
A parte questo, mi viene da pensare che il problema principale di quel comando sia lo sleep molto ridotto, che potrebbe falsare i calcoli e farti ottenere quei valori esagerati. Facendo qualche prova:
Codice: Seleziona tutto
crap0101@orange:~/test$ bash /tmp/cputest.sh
ps ...: 37.0
ps S ...: 64.4
sleep 0.06: 32.1429
***** cpuinfo.awk:
cpu: 20.71%
cpu0: 12.50%
cpu1: 38.00%
cpu2: 12.50%
cpu3: 17.65%
*********
sleep 0.6: 19.8312
crap0101@orange:~/test$ bash /tmp/cputest.sh
ps S ...: 64.4
ps ...: 37.0
sleep 0.06: 31.0345
***** cpuinfo.awk:
cpu: 16.67%
cpu0: 14.58%
cpu1: 20.41%
cpu2: 14.00%
cpu3: 18.37%
*********
sleep 0.6: 17.1548
codice generato da questo test script
Codice: Seleziona tutto
crap0101@orange:~/test$ cat /tmp/cputest.sh
#!/bin/bash
(printf "sleep 0.6: %s\n" $(awk '{
u=$2+$4
t=$2+$4+$5
if (NR==1) {
u1=u
t1=t
} else {
print(($2+$4-u1) * 100 / (t-t1))
}
}' <(grep 'cpu ' /proc/stat) <(sleep 0.6;grep 'cpu ' /proc/stat)) ) &
(printf "sleep 0.06: %s\n" $(awk '{
u=$2+$4
t=$2+$4+$5
if (NR==1) {
u1=u
t1=t
}
else {
print ($2+$4-u1) * 100 / (t-t1)
}
}' <(grep 'cpu ' /proc/stat) <(sleep 0.06;grep 'cpu ' /proc/stat)) ) &
(printf "ps ...: %s\n" $(ps -A -o pcpu | tail -n+2 | paste -sd+ | bc) ) &
(printf "ps S ...: %s\n" $(ps S -A -o pcpu | tail -n+2 | paste -sd+ | bc) ) &
(printf "***** cpuinfo.awk:\n%s\n" "$(awk -v iter=1 -f /home/crap0101/test/cpuinfo.awk)" ) &
wait
decommenta l'ultimo printf o altrimenti scarica il file in questione
da qui
Mentre facevo qualche prova ne ho buttata giù anche una
versione (iniziale) in python, nel caso interessasse.
p.s. (non ps

): con quei due script linkati, dalle prove fatte, ottengo risultati abbastanza in sintonia con quelli che mi restituisce `htop` (e al momento, sotto carico, non sforano il 100%

). Ho usato qualche valore diverso dai tuoi, ma in definitiva nulla di così influente.
p.p.s.
invece del tail puoi usare l'opzione --no-header di ps
...e anche meglio, farlo diventare: