ps: Add PSS and USS fields
The library added smaps_rollup fields in the referenced commit.
This commit exploits the new fields to give pss and uss options.
These options were first proposed back in 2015 by Petr Malat
and, with the library update, they are finally made it into ps.
Why use proportional or unique segment size? It is argued that
these give a better idea of the "real" memory usage of a process.
References:
commit 12543b6c76
issue #112
https://www.freelists.org/post/procps/PSS-and-USS-support-for-ps
https://lwn.net/Articles/230975/
Signed-off-by: Craig Small <csmall@dropbear.xyz>
This commit is contained in:
parent
e75bbeb117
commit
e782b1d859
1
NEWS
1
NEWS
@ -7,6 +7,7 @@ procps-ng-NEXT
|
|||||||
* pkill: Check for lt- variants of program name issue #192
|
* pkill: Check for lt- variants of program name issue #192
|
||||||
* ps: Add OOM and OOMADJ fields issue #198
|
* ps: Add OOM and OOMADJ fields issue #198
|
||||||
* ps: Add IO Accounting fields issue #184
|
* ps: Add IO Accounting fields issue #184
|
||||||
|
* ps: Add PSS and USS fields issue #112
|
||||||
* slabtop: Don't combine d and o options issue #160
|
* slabtop: Don't combine d and o options issue #160
|
||||||
* top: exploit some library smaps_rollup provisions issue #112
|
* top: exploit some library smaps_rollup provisions issue #112
|
||||||
|
|
||||||
|
@ -144,6 +144,9 @@ makEXT(SIGCATCH)
|
|||||||
makEXT(SIGIGNORE)
|
makEXT(SIGIGNORE)
|
||||||
makEXT(SIGNALS)
|
makEXT(SIGNALS)
|
||||||
makEXT(SIGPENDING)
|
makEXT(SIGPENDING)
|
||||||
|
makEXT(SMAP_PRV_CLEAN)
|
||||||
|
makEXT(SMAP_PRV_DIRTY)
|
||||||
|
makEXT(SMAP_PSS)
|
||||||
makEXT(STATE)
|
makEXT(STATE)
|
||||||
makEXT(SUPGIDS)
|
makEXT(SUPGIDS)
|
||||||
makEXT(SUPGROUPS)
|
makEXT(SUPGROUPS)
|
||||||
|
@ -131,6 +131,9 @@ makREL(SIGCATCH)
|
|||||||
makREL(SIGIGNORE)
|
makREL(SIGIGNORE)
|
||||||
makREL(SIGNALS)
|
makREL(SIGNALS)
|
||||||
makREL(SIGPENDING)
|
makREL(SIGPENDING)
|
||||||
|
makREL(SMAP_PRV_CLEAN)
|
||||||
|
makREL(SMAP_PRV_DIRTY)
|
||||||
|
makREL(SMAP_PSS)
|
||||||
makREL(STATE)
|
makREL(STATE)
|
||||||
makREL(SUPGIDS)
|
makREL(SUPGIDS)
|
||||||
makREL(SUPGROUPS)
|
makREL(SUPGROUPS)
|
||||||
|
13
ps/output.c
13
ps/output.c
@ -1009,6 +1009,11 @@ setREL1(PROCESSOR)
|
|||||||
return snprintf(outbuf, COLWID, "%d", rSv(PROCESSOR, u_int, pp));
|
return snprintf(outbuf, COLWID, "%d", rSv(PROCESSOR, u_int, pp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pr_pss(char *restrict const outbuf, const proc_t *restrict const pp){
|
||||||
|
setREL1(SMAP_PSS)
|
||||||
|
return snprintf(outbuf, COLWID, "%lu", rSv(SMAP_PSS, ul_int, pp));
|
||||||
|
}
|
||||||
|
|
||||||
static int pr_numa(char *restrict const outbuf, const proc_t *restrict const pp){
|
static int pr_numa(char *restrict const outbuf, const proc_t *restrict const pp){
|
||||||
setREL1(PROCESSOR_NODE)
|
setREL1(PROCESSOR_NODE)
|
||||||
return snprintf(outbuf, COLWID, "%d", rSv(PROCESSOR_NODE, s_int, pp));
|
return snprintf(outbuf, COLWID, "%d", rSv(PROCESSOR_NODE, s_int, pp));
|
||||||
@ -1117,6 +1122,12 @@ setREL1(SIGCATCH)
|
|||||||
return help_pr_sig(outbuf, rSv(SIGCATCH, str, pp));
|
return help_pr_sig(outbuf, rSv(SIGCATCH, str, pp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pr_uss(char *restrict const outbuf, const proc_t *restrict const pp){
|
||||||
|
setREL2(SMAP_PRV_CLEAN, SMAP_PRV_DIRTY)
|
||||||
|
return snprintf(outbuf, COLWID, "%lu",
|
||||||
|
rSv(SMAP_PRV_CLEAN, ul_int, pp) + rSv(SMAP_PRV_DIRTY, ul_int, pp));
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1707,6 +1718,7 @@ static const format_struct format_array[] = { /*
|
|||||||
{"projid", "PROJID", pr_nop, PIDS_noop, 5, SUN, PO|RIGHT},
|
{"projid", "PROJID", pr_nop, PIDS_noop, 5, SUN, PO|RIGHT},
|
||||||
{"pset", "PSET", pr_nop, PIDS_noop, 4, DEC, TO|RIGHT},
|
{"pset", "PSET", pr_nop, PIDS_noop, 4, DEC, TO|RIGHT},
|
||||||
{"psr", "PSR", pr_psr, PIDS_PROCESSOR, 3, DEC, TO|RIGHT},
|
{"psr", "PSR", pr_psr, PIDS_PROCESSOR, 3, DEC, TO|RIGHT},
|
||||||
|
{"pss", "PSS", pr_pss, PIDS_SMAP_PSS, 5, XXX, PO|RIGHT},
|
||||||
{"psxpri", "PPR", pr_nop, PIDS_noop, 3, DEC, TO|RIGHT},
|
{"psxpri", "PPR", pr_nop, PIDS_noop, 3, DEC, TO|RIGHT},
|
||||||
{"rbytes", "RBYTES", pr_rbytes, PIDS_IO_READ_BYTES, 5, LNX, TO|RIGHT},
|
{"rbytes", "RBYTES", pr_rbytes, PIDS_IO_READ_BYTES, 5, LNX, TO|RIGHT},
|
||||||
{"rchars", "RCHARS", pr_rchars, PIDS_IO_READ_CHARS, 5, LNX, TO|RIGHT},
|
{"rchars", "RCHARS", pr_rchars, PIDS_IO_READ_CHARS, 5, LNX, TO|RIGHT},
|
||||||
@ -1802,6 +1814,7 @@ static const format_struct format_array[] = { /*
|
|||||||
{"userns", "USERNS", pr_userns, PIDS_NS_USER, 10, LNX, ET|RIGHT},
|
{"userns", "USERNS", pr_userns, PIDS_NS_USER, 10, LNX, ET|RIGHT},
|
||||||
{"usertime", "USER", pr_nop, PIDS_noop, 4, DEC, ET|RIGHT},
|
{"usertime", "USER", pr_nop, PIDS_noop, 4, DEC, ET|RIGHT},
|
||||||
{"usrpri", "UPR", pr_nop, PIDS_noop, 3, DEC, TO|RIGHT}, /*upr*/
|
{"usrpri", "UPR", pr_nop, PIDS_noop, 3, DEC, TO|RIGHT}, /*upr*/
|
||||||
|
{"uss", "USS", pr_uss, PIDS_SMAP_PRV_CLEAN, 5, XXX, PO|RIGHT},
|
||||||
{"util", "C", pr_c, PIDS_extra, 2, SGI, ET|RIGHT}, // not sure about "C"
|
{"util", "C", pr_c, PIDS_extra, 2, SGI, ET|RIGHT}, // not sure about "C"
|
||||||
{"utime", "UTIME", pr_nop, PIDS_TICS_USER, 6, LNx, ET|RIGHT},
|
{"utime", "UTIME", pr_nop, PIDS_TICS_USER, 6, LNx, ET|RIGHT},
|
||||||
{"utsns", "UTSNS", pr_utsns, PIDS_NS_UTS, 10, LNX, ET|RIGHT},
|
{"utsns", "UTSNS", pr_utsns, PIDS_NS_UTS, 10, LNX, ET|RIGHT},
|
||||||
|
12
ps/ps.1
12
ps/ps.1
@ -4,7 +4,7 @@
|
|||||||
.\" Quick hack conversion by Albert Cahalan, 1998.
|
.\" Quick hack conversion by Albert Cahalan, 1998.
|
||||||
.\" Licensed under version 2 of the Gnu General Public License.
|
.\" Licensed under version 2 of the Gnu General Public License.
|
||||||
.\"
|
.\"
|
||||||
.TH PS "1" "2021-03-29" "procps-ng" "User Commands"
|
.TH PS "1" "2021-06-16" "procps-ng" "User Commands"
|
||||||
.\"
|
.\"
|
||||||
.\" To render this page:
|
.\" To render this page:
|
||||||
.\" groff -t -b -man -X -P-resolution -P100 -Tps ps.1 &
|
.\" groff -t -b -man -X -P-resolution -P100 -Tps ps.1 &
|
||||||
@ -1524,6 +1524,11 @@ psr PSR T{
|
|||||||
processor that process last executed on.
|
processor that process last executed on.
|
||||||
T}
|
T}
|
||||||
|
|
||||||
|
pss PSS T{
|
||||||
|
Proportional share size, the non-swapped physical memory, with shared memory
|
||||||
|
proportionally accounted to all tasks mapping it.
|
||||||
|
T}
|
||||||
|
|
||||||
rbytes RBYTES T{
|
rbytes RBYTES T{
|
||||||
Number of bytes which this process really did cause to be fetched from the storage layer.
|
Number of bytes which this process really did cause to be fetched from the storage layer.
|
||||||
T}
|
T}
|
||||||
@ -1855,6 +1860,11 @@ See
|
|||||||
.IR namespaces (7).
|
.IR namespaces (7).
|
||||||
T}
|
T}
|
||||||
|
|
||||||
|
uss USS T{
|
||||||
|
Unique set size, the non-swapped physical memory, which
|
||||||
|
is not shared with an another task.
|
||||||
|
T}
|
||||||
|
|
||||||
utsns UTSNS T{
|
utsns UTSNS T{
|
||||||
Unique inode number describing the namespace the process belongs to.
|
Unique inode number describing the namespace the process belongs to.
|
||||||
See
|
See
|
||||||
|
Loading…
Reference in New Issue
Block a user