]> granicus.if.org Git - procps-ng/commitdiff
top: avoid yet more overhead of accessing /proc/status
authorJim Warner <james.warner@comcast.net>
Sat, 20 Aug 2016 05:00:00 +0000 (00:00 -0500)
committerCraig Small <csmall@enc.com.au>
Tue, 23 Aug 2016 11:12:32 +0000 (21:12 +1000)
After discovering those terrible costs associated with
/proc/status vs. /proc/stat, the build_header function
changed to favor the latter for a field found in both.

Well, low-and-behold, this top program still used some
flags that needlessly caused 'status' to still be read
when 'statm' could have served. And, while top's needs
require conversion from pages to KiB, that's still far
less costly than reading that gosh darn 'status' file.

[ this patch parallels similar changes to newlib top ]

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

index 48a6b715b836efee0946969f3c9a0ac855ba116a..d9730d863adbac56a5a62c83bb64a1dc8211e402 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -282,7 +282,7 @@ SCB_NUMx(PGD, pgrp)
 SCB_NUMx(PID, tid)
 SCB_NUMx(PPD, ppid)
 SCB_NUMx(PRI, priority)
-SCB_NUM1(RES, vm_rss)                  // also serves MEM !
+SCB_NUM1(RES, resident)                // also serves MEM !
 SCB_NUM1(RZA, vm_rss_anon)
 SCB_NUM1(RZF, vm_rss_file)
 SCB_NUM1(RZL, vm_lock)
@@ -1743,21 +1743,21 @@ static FLD_t Fieldstab[] = {
    {     6,     -1,  A_right,  SF(TME),  L_stat    },
    {     9,     -1,  A_right,  SF(TME),  L_stat    }, // EU_TM2 slot
 #ifdef BOOST_PERCNT
-   {     5,     -1,  A_right,  SF(RES),  L_status  }, // EU_MEM slot
+   {     5,     -1,  A_right,  SF(RES),  L_stat  }, // EU_MEM slot
 #else
-   {     4,     -1,  A_right,  SF(RES),  L_status  }, // EU_MEM slot
+   {     4,     -1,  A_right,  SF(RES),  L_stat  }, // EU_MEM slot
 #endif
 #ifndef NOBOOST_MEMS
    {     7,  SK_Kb,  A_right,  SF(VRT),  L_statm   },
    {     6,  SK_Kb,  A_right,  SF(SWP),  L_status  },
-   {     6,  SK_Kb,  A_right,  SF(RES),  L_status  },
+   {     6,  SK_Kb,  A_right,  SF(RES),  L_stat  },
    {     6,  SK_Kb,  A_right,  SF(COD),  L_statm   },
    {     7,  SK_Kb,  A_right,  SF(DAT),  L_statm   },
    {     6,  SK_Kb,  A_right,  SF(SHR),  L_statm   },
 #else
    {     5,  SK_Kb,  A_right,  SF(VRT),  L_statm   },
    {     4,  SK_Kb,  A_right,  SF(SWP),  L_status  },
-   {     4,  SK_Kb,  A_right,  SF(RES),  L_status  },
+   {     4,  SK_Kb,  A_right,  SF(RES),  L_stat  },
    {     4,  SK_Kb,  A_right,  SF(COD),  L_statm   },
    {     5,  SK_Kb,  A_right,  SF(DAT),  L_statm   },
    {     4,  SK_Kb,  A_right,  SF(SHR),  L_statm   },
@@ -1940,7 +1940,7 @@ static void build_headers (void) {
          if (hdrmax + w->hdrcaplen < (x = strlen(w->columnhdr))) hdrmax = x - w->hdrcaplen;
 #endif
          // with forest view mode, we'll need tgid, ppid & start_time...
-         if (CHKw(w, Show_FOREST)) Frames_libflags |= (L_status | L_stat);
+         if (CHKw(w, Show_FOREST)) Frames_libflags |= L_stat;
          // for 'busy' only processes, we'll need pcpu (utime & stime)...
          if (!CHKw(w, Show_IDLEPS)) Frames_libflags |= L_stat;
          // we must also accommodate an out of view sort field...
@@ -5405,7 +5405,7 @@ static const char *task_show (const WIN_t *q, const proc_t *p) {
             cp = make_str(p->lxcname, W, Js, EU_LXC);
             break;
          case EU_MEM:
-            cp = scale_pcnt((float)p->vm_rss * 100 / kb_main_total, W, Jn);
+            cp = scale_pcnt((float)pages2K(p->resident) * 100 / kb_main_total, W, Jn);
             break;
          case EU_NCE:
             cp = make_num(p->nice, W, Jn, AUTOX_NO, 1);
@@ -5442,7 +5442,7 @@ static const char *task_show (const WIN_t *q, const proc_t *p) {
                cp = make_num(p->priority, W, Jn, AUTOX_NO, 0);
             break;
          case EU_RES:
-            cp = scale_mem(S, p->vm_rss, W, Jn);
+            cp = scale_mem(S, pages2K(p->resident), W, Jn);
             break;
          case EU_RZA:
             cp = scale_mem(S, p->vm_rss_anon, W, Jn);