Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(303)

Unified Diff: tools/multi-process-rss.py

Issue 108073002: Error handling and refactoring in tools/linux/procfs.py, and rename multi-process-rss.py. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/linux/procfs.py ('k') | tools/multi_process_rss.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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))
« no previous file with comments | « tools/linux/procfs.py ('k') | tools/multi_process_rss.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698