All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v5 0/3] mm, proc: Implement /proc/<pid>/totmaps
@ 2016-09-05 20:14 ` robert.foss
  0 siblings, 0 replies; 43+ messages in thread
From: robert.foss @ 2016-09-05 20:14 UTC (permalink / raw)
  To: corbet, akpm, vbabka, hughd, mhocko, koct9i, n-horiguchi,
	robert.foss, kirill.shutemov, john.stultz, minchan, ross.zwisler,
	jmarchan, hannes, keescook, oleg, viro, mguzik, jdanis,
	calvinowens, adobriyan, ebiederm, sonnyrao, seth.forshee, tixxdz,
	linux-doc, linux-kernel, Ben Zhang, Bryan Freed,
	Filipe Brandenburger, Jann Horn, Michal Hocko, linux-api,
	Jacek Anaszewski

From: Robert Foss <robert.foss@collabora.com>

This series provides the /proc/PID/totmaps feature, which
summarizes the information provided by /proc/PID/smaps for
improved performance and usability reasons.

A use case is to speed up monitoring of memory consumption in
environments where RSS isn't precise.

For example Chrome tends to many processes which have hundreds of VMAs
with a substantial amount of shared memory, and the error of using
RSS rather than PSS tends to be very large when looking at overall
memory consumption.  PSS isn't kept as a single number that's exported
like RSS, so to calculate PSS means having to parse a very large smaps
file.

This process is slow and has to be repeated for many processes, and we
found that the just act of doing the parsing was taking up a
significant amount of CPU time, so this patch is an attempt to make
that process cheaper.

/proc/PID/totmaps provides roughly a 2x speedup compared to parsing
/proc/PID/smaps with awk.

$ ps aux | grep firefox
robertfoss   5025 24.3 13.7 3562820 2219616 ?     Rl   Aug15 277:44 /usr/lib/firefox/firefox https://allg.one/xpb
$ awk '/^[0-9a-f]/{print}' /proc/5025/smaps | wc -l
1503
$ /usr/bin/time -v -p zsh -c "(repeat 25 {cat /proc/5025/totmaps})"
[...]
	Command being timed: "zsh -c (repeat 25 {cat /proc/5025/totmaps})"
	User time (seconds): 0.00
	System time (seconds): 0.40
	Percent of CPU this job got: 90%
	Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.45

$ /usr/bin/time -v -p zsh -c "repeat 25 { awk '/^Rss/{rss+=\$2} /^Pss/{pss+=\$2} END {printf \"rss:%d pss:%d\n\", rss, pss}\' /proc/5025/smaps }"
[...]
	Command being timed: "zsh -c repeat 25 { awk '/^Rss/{rss+=$2} /^Pss/{pss+=$2} END {printf "rss:%d pss:%d\n", rss, pss}\' /proc/5025/smaps }"
	User time (seconds): 0.37
	System time (seconds): 0.45
	Percent of CPU this job got: 92%
	Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.89


Changes since v1:
- Removed IS_ERR check from get_task_mm() function
- Changed comment format
- Moved proc_totmaps_operations declaration inside internal.h
- Switched to using do_maps_open() in totmaps_open() function,
  which provides privilege checking
- Error handling reworked for totmaps_open() function
- Switched to stack allocated struct mem_size_stats mss_sum in
  totmaps_proc_show() function
- Removed get_task_mm() in totmaps_proc_show() since priv->mm
  already is available
- Added support to proc_map_release() fork priv==NULL, to allow
  function to be used for all failure cases
- Added proc_totmaps_op and for it helper functions
- Added documention in separate patch
- Removed totmaps_release() since it was just a wrapper for proc_map_release()

Changes since v2:
- Removed struct mem_size_stats *mss from struct proc_maps_private
- Removed priv->task assignment in totmaps_open() call
- Moved some assignements calls totmaps_open() around to increase code
  clarity
- Moved some function calls to unlock data structures before printing

Changes since v3:
- Fixed typo in totmaps documentation
- Fixed issue where proc_map_release wasn't called on error
- Fixed put_task_struct not being called during .release()

Changes since v4:
- Prevent access to invalid processes

Robert Foss (3):
  mm, proc: Implement /proc/<pid>/totmaps
  Documentation/filesystems: Fixed typo
  Documentation/filesystems: Added /proc/PID/totmaps documentation

 Documentation/filesystems/proc.txt |  23 +++++-
 fs/proc/base.c                     |   1 +
 fs/proc/internal.h                 |   2 +
 fs/proc/task_mmu.c                 | 148 +++++++++++++++++++++++++++++++++++++
 4 files changed, 173 insertions(+), 1 deletion(-)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 43+ messages in thread

end of thread, other threads:[~2016-09-20  0:37 UTC | newest]

Thread overview: 43+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-05 20:14 [PATCH v5 0/3] mm, proc: Implement /proc/<pid>/totmaps robert.foss
2016-09-05 20:14 ` robert.foss
2016-09-05 20:14 ` [PATCH v5 1/3] " robert.foss
2016-09-05 20:14   ` robert.foss
2016-09-07 12:58   ` Oleg Nesterov
2016-09-07 12:58     ` Oleg Nesterov
2016-09-12 22:12     ` Robert Foss
2016-09-12 22:12       ` Robert Foss
2016-09-05 20:14 ` [PATCH v5 2/3] Documentation/filesystems: Fixed typo robert.foss
2016-09-05 20:14   ` robert.foss-ZGY8ohtN/8qB+jHODAdFcQ
2016-09-07 23:22   ` Kees Cook
2016-09-07 23:22     ` Kees Cook
2016-09-08  0:22     ` Robert Foss
2016-09-08  0:22       ` Robert Foss
2016-09-08  6:23       ` Jonathan Corbet
2016-09-08  6:23         ` Jonathan Corbet
2016-09-05 20:14 ` [PATCH v5 3/3] Documentation/filesystems: Added /proc/PID/totmaps documentation robert.foss
2016-09-05 20:14   ` robert.foss
2016-09-12 12:02 ` [PATCH v5 0/3] mm, proc: Implement /proc/<pid>/totmaps Michal Hocko
2016-09-12 15:31   ` Sonny Rao
2016-09-12 15:31     ` Sonny Rao
2016-09-12 17:15     ` Michal Hocko
2016-09-12 17:15       ` Michal Hocko
2016-09-12 17:28       ` Sonny Rao
2016-09-12 17:28         ` Sonny Rao
2016-09-13  7:12         ` Michal Hocko
2016-09-13  7:12           ` Michal Hocko
2016-09-13 20:27           ` Sonny Rao
2016-09-13 20:27             ` Sonny Rao
2016-09-14  9:12             ` Michal Hocko
2016-09-14  9:12               ` Michal Hocko
2016-09-19 15:16               ` Robert Foss
2016-09-19 15:16                 ` Robert Foss
2016-09-19 19:32                 ` Michal Hocko
2016-09-19 19:32                   ` Michal Hocko
     [not found]                   ` <20160919194001.GE2903@pc.thejh.net>
     [not found]                     ` <20160919195109.GB28639@dhcp22.suse.cz>
2016-09-19 19:56                       ` Jann Horn
2016-09-19 19:56                         ` Jann Horn
2016-09-19 20:15                         ` Sonny Rao
2016-09-19 20:15                           ` Sonny Rao
2016-09-20  0:27                   ` Robert Foss
2016-09-20  0:27                     ` Robert Foss
2016-09-20  0:29                     ` Sonny Rao
2016-09-20  0:29                       ` Sonny Rao

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.