| Index: tools/multi-process-rss.py
|
| diff --git a/tools/multi-process-rss.py b/tools/multi-process-rss.py
|
| deleted file mode 100755
|
| index 100d0f759b1c4660de6904b16899aeab30bd00fd..0000000000000000000000000000000000000000
|
| --- a/tools/multi-process-rss.py
|
| +++ /dev/null
|
| @@ -1,143 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# Copyright 2013 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -# Counts a resident set size (RSS) of multiple processes without double-counts.
|
| -# If they share the same page frame, the page frame is counted only once.
|
| -#
|
| -# Usage:
|
| -# ./multi-process-rss.py <pid>|<pid>r [...]
|
| -#
|
| -# If <pid> has 'r' at the end, all descendants of the process are accounted.
|
| -#
|
| -# Example:
|
| -# ./multi-process-rss.py 12345 23456r
|
| -#
|
| -# The command line above counts the RSS of 1) process 12345, 2) process 23456
|
| -# and 3) all descendant processes of process 23456.
|
| -
|
| -
|
| -import collections
|
| -import logging
|
| -import os
|
| -import psutil
|
| -import sys
|
| -
|
| -
|
| -if sys.platform.startswith('linux'):
|
| - _TOOLS_PATH = os.path.dirname(os.path.abspath(__file__))
|
| - _TOOLS_LINUX_PATH = os.path.join(_TOOLS_PATH, 'linux')
|
| - sys.path.append(_TOOLS_LINUX_PATH)
|
| - import procfs # pylint: disable=F0401
|
| -
|
| -
|
| -class _NullHandler(logging.Handler):
|
| - def emit(self, record):
|
| - pass
|
| -
|
| -
|
| -_LOGGER = logging.getLogger('multi-process-rss')
|
| -_LOGGER.addHandler(_NullHandler())
|
| -
|
| -
|
| -def _recursive_get_children(pid):
|
| - try:
|
| - children = psutil.Process(pid).get_children()
|
| - except psutil.error.NoSuchProcess:
|
| - return []
|
| - descendant = []
|
| - for child in children:
|
| - descendant.append(child.pid)
|
| - descendant.extend(_recursive_get_children(child.pid))
|
| - return descendant
|
| -
|
| -
|
| -def list_pids(argv):
|
| - pids = []
|
| - for arg in argv[1:]:
|
| - try:
|
| - if arg.endswith('r'):
|
| - recursive = True
|
| - pid = int(arg[:-1])
|
| - else:
|
| - recursive = False
|
| - pid = int(arg)
|
| - except ValueError:
|
| - raise SyntaxError("%s is not an integer." % arg)
|
| - else:
|
| - pids.append(pid)
|
| - if recursive:
|
| - children = _recursive_get_children(pid)
|
| - pids.extend(children)
|
| -
|
| - pids = sorted(set(pids), key=pids.index) # uniq: maybe slow, but simple.
|
| -
|
| - return pids
|
| -
|
| -
|
| -def count_pageframes(pids):
|
| - pageframes = collections.defaultdict(int)
|
| - pagemap_dct = {}
|
| - for pid in pids:
|
| - maps = procfs.ProcMaps.load(pid)
|
| - if not maps:
|
| - _LOGGER.warning('/proc/%d/maps not found.' % pid)
|
| - continue
|
| - pagemap = procfs.ProcPagemap.load(pid, maps)
|
| - if not pagemap:
|
| - _LOGGER.warning('/proc/%d/pagemap not found.' % pid)
|
| - continue
|
| - pagemap_dct[pid] = pagemap
|
| -
|
| - for pid, pagemap in pagemap_dct.iteritems():
|
| - for vma in pagemap.vma_internals.itervalues():
|
| - for pageframe, number in vma.pageframes.iteritems():
|
| - pageframes[pageframe] += number
|
| -
|
| - return pageframes
|
| -
|
| -
|
| -def count_statm(pids):
|
| - resident = 0
|
| - shared = 0
|
| - private = 0
|
| -
|
| - for pid in pids:
|
| - statm = procfs.ProcStatm.load(pid)
|
| - if not statm:
|
| - _LOGGER.warning('/proc/%d/statm not found.' % pid)
|
| - continue
|
| - resident += statm.resident
|
| - shared += statm.share
|
| - private += (statm.resident - statm.share)
|
| -
|
| - return (resident, shared, private)
|
| -
|
| -
|
| -def main(argv):
|
| - logging_handler = logging.StreamHandler()
|
| - logging_handler.setLevel(logging.WARNING)
|
| - logging_handler.setFormatter(logging.Formatter(
|
| - '%(asctime)s:%(name)s:%(levelname)s:%(message)s'))
|
| -
|
| - _LOGGER.setLevel(logging.WARNING)
|
| - _LOGGER.addHandler(logging_handler)
|
| -
|
| - if sys.platform.startswith('linux'):
|
| - logging.getLogger('procfs').setLevel(logging.WARNING)
|
| - logging.getLogger('procfs').addHandler(logging_handler)
|
| - pids = list_pids(argv)
|
| - pageframes = count_pageframes(pids)
|
| - else:
|
| - _LOGGER.error('%s is not supported.' % sys.platform)
|
| - return 1
|
| -
|
| - # TODO(dmikurube): Classify this total RSS.
|
| - print len(pageframes) * 4096
|
| -
|
| - return 0
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - sys.exit(main(sys.argv))
|
|
|