library: miscellaneous additional efficiencies, <pids>

This patch contains the following miscellaneous stuff:

. The pids_stacks_fetch() routine might call for newly
allocated stacks to be itemized. However, that job was
already tended to by the pids_stacks_alloc() function.

So, this patch just eliminates a redundant invocation.
------------------------------------------------------

. The concept of 'dirty_stacks' has not kept pace with
the evolving stacks implementation. Originally, stacks
were considered dirty only if free() of dynamic memory
was needed before refreshing any single result struct.

Later, with the introduction of the 'extra' item and a
promise to reset it to zero, 'dirty' was much broader.

So, this patch just treats the dirty flg as others do.
------------------------------------------------------

. Lastly, a word or three about performance & timings.

Tuning efforts concentrated on the <pids> API and top.
And unless an oldlib equivalent to the preceding patch
is applied (favoring stat vs. status), newlib top will
often outperform the oldlib version (obviously wrong).

So assuming /proc/stat is preferred in both libraries,
generally speaking, a cpu and elapsed time increase of
1-5% was found for this new stacks oriented interface.
Of course, there's also an increased memory footprint.

There are some occasions, however, when the newlib top
is at a substantial disadvantage. For example if WCHAN
or TTY is displayed, such items will be present in all
newlib reaped stacks (i.e. every process). But old top
would only incur such overhead with displayable tasks.

Thus, oldlib top could outperform newlib by up to 25%,
for example, if only fields requiring NO library flags
were displayed. However, such a scenario is not likely
since only GID, UID, PID, TGID & WCHAN would be shown.
In the usual case, that overhead associated with WCHAN
and/or TTY is overshadowed by other top runtime costs.

All in all a pleasing outcome I deem quite acceptable.
------------------------------------------------------

Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
Jim Warner 2016-08-21 00:00:00 -05:00 committed by Craig Small
parent e9c101edcb
commit acda6f40d1

View File

@ -76,7 +76,7 @@ struct pids_info {
struct fetch_support fetch; // support for procps_pids_reap & select struct fetch_support fetch; // support for procps_pids_reap & select
int history_yes; // need historical data int history_yes; // need historical data
struct history_info *hist; // pointer to historical support data struct history_info *hist; // pointer to historical support data
int dirty_stacks; // extents need dynamic storage clean int dirty_stacks; // stacks results need attention
proc_t*(*read_something)(PROCTAB*, proc_t*); // readproc/readeither via which proc_t*(*read_something)(PROCTAB*, proc_t*); // readproc/readeither via which
unsigned pgs2k_shift; // to convert some proc vaules unsigned pgs2k_shift; // to convert some proc vaules
unsigned oldflags; // the old library PROC_FILL flagss unsigned oldflags; // the old library PROC_FILL flagss
@ -773,7 +773,6 @@ static inline void pids_assign_results (
if (item >= PIDS_logical_end) if (item >= PIDS_logical_end)
break; break;
Item_table[item].setsfunc(info, this, p); Item_table[item].setsfunc(info, this, p);
info->dirty_stacks |= Item_table[item].freefunc ? 1 : 0;
++this; ++this;
} }
return; return;
@ -1062,7 +1061,6 @@ static int pids_stacks_fetch (
return -ENOMEM; return -ENOMEM;
memset(info->fetch.anchor, 0, sizeof(void *) * n_alloc); memset(info->fetch.anchor, 0, sizeof(void *) * n_alloc);
memcpy(info->fetch.anchor, ext->stacks, sizeof(void *) * n_alloc); memcpy(info->fetch.anchor, ext->stacks, sizeof(void *) * n_alloc);
pids_itemize_stacks_all(info);
} }
pids_cleanup_stacks_all(info); pids_cleanup_stacks_all(info);
pids_toggle_history(info); pids_toggle_history(info);
@ -1095,6 +1093,7 @@ static int pids_stacks_fetch (
} }
memcpy(info->fetch.results.stacks, info->fetch.anchor, sizeof(void *) * n_inuse); memcpy(info->fetch.results.stacks, info->fetch.anchor, sizeof(void *) * n_inuse);
info->fetch.results.stacks[n_inuse] = NULL; info->fetch.results.stacks[n_inuse] = NULL;
info->dirty_stacks = 1;
return n_inuse; // callers beware, this might be zero ! return n_inuse; // callers beware, this might be zero !
#undef n_alloc #undef n_alloc