]> granicus.if.org Git - procps-ng/commitdiff
top: limit task cpu % based on total number of threads
authorJim Warner <james.warner@comcast.net>
Tue, 18 Dec 2012 06:00:00 +0000 (00:00 -0600)
committerCraig Small <csmall@enc.com.au>
Sat, 22 Dec 2012 06:10:11 +0000 (17:10 +1100)
Everyone has either accepted this potential distortion
or patched top to eliminate it. Now, the time has come
to regain some consistency when calculating that %CPU.

We'll now limit such values to: 100.0 * total threads.
And, it took way too long to address this little flaw.

(now that we know a '.' + 2 spaces is squeezed to one)
(everything's perfectly justified, but it's just luck)

Reference(s):
http://www.freelists.org/post/procps/top-regression-reports
http://www.freelists.org/post/procps/top-regression-reports,1

Signed-off-by: Jim Warner <james.warner@comcast.net>
top/top.1
top/top.c

index c914e771f89fff9efb6622f8fed8193a29c94186..fb9d740c2373c510e7e0a6a876c75d5f954d6c37 100644 (file)
--- a/top/top.1
+++ b/top/top.1
@@ -454,9 +454,15 @@ Such fields can, however, be scaled differently via the 'e' \*(CI.
  1.\fB %CPU \*(Em \*(PU Usage \fR
 The task's share of the elapsed \*(PU time since the last screen update,
 expressed as a percentage of total \*(PU time.
-In a true SMP environment, if 'Irix mode' is \*F, \*(We will operate
-in 'Solaris mode' where a task's \*(Pu usage will be divided by the total
-number of \*(PUs.
+
+In a true SMP environment, if a process is multi-threaded and \*(We is
+\fInot\fR operating in Threads mode, amounts greater than 100% may be
+reported.
+You toggle Threads mode with the 'H' \*(CI.
+
+Also for multi-processor environments, if 'Irix mode' is \*F, \*(We
+will operate in 'Solaris mode' where a task's \*(Pu usage will be
+divided by the total number of \*(PUs.
 You toggle 'Irix/Solaris' modes with the 'I' \*(CI.
 
 .TP 4
index 3d35ab2200e1fc6ca123d55ed7a1377aa68eceb2..c9678f96c553fdf189f9646c377bef53dcb45864 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -4631,6 +4631,9 @@ static const char *task_show (const WIN_t *q, const proc_t *p) {
             break;
          case P_CPU:
          {  float u = (float)p->pcpu * Frame_etscale;
+            /* process can't use more %cpu than number of threads it has
+             ( thanks Jaromir Capik <jcapik@redhat.com> ) */
+            if (u > 100.0 * p->nlwp) u = 100.0 * p->nlwp;
             if (u > Cpu_pmax) u = Cpu_pmax;
             cp = scale_pcnt(u, W, Jn);
          }