summaryrefslogtreecommitdiffstats
path: root/tools/linux
diff options
context:
space:
mode:
authordmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-03 03:46:39 +0000
committerdmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-03 03:46:39 +0000
commitb47705b738ab75d2243c3f9be2e28158b9f75b5d (patch)
tree0e3f5a91f60bf08d3df5f63fc40d9ed43e9f4ad6 /tools/linux
parenta336b01aa36dd8e9dce63ffd7a5e8be4598da237 (diff)
downloadchromium_src-b47705b738ab75d2243c3f9be2e28158b9f75b5d.zip
chromium_src-b47705b738ab75d2243c3f9be2e28158b9f75b5d.tar.gz
chromium_src-b47705b738ab75d2243c3f9be2e28158b9f75b5d.tar.bz2
Resident set size (RSS) of multiple processes without double-counts on Linux.
It fixes logging and in-process duplication counting in tools/linux/procfs.py at the same time. BUG=324194 TEST=None NOTRY=True Review URL: https://codereview.chromium.org/98423003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@238295 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools/linux')
-rwxr-xr-xtools/linux/procfs.py27
1 files changed, 16 insertions, 11 deletions
diff --git a/tools/linux/procfs.py b/tools/linux/procfs.py
index bbf2019..6308fdd 100755
--- a/tools/linux/procfs.py
+++ b/tools/linux/procfs.py
@@ -18,7 +18,13 @@ import struct
import sys
-LOGGER = logging.getLogger('procfs')
+class _NullHandler(logging.Handler):
+ def emit(self, record):
+ pass
+
+
+_LOGGER = logging.getLogger('procfs')
+_LOGGER.addHandler(_NullHandler())
class ProcStat(object):
@@ -547,6 +553,7 @@ class ProcPagemap(object):
total_vsize = 0
in_process_dup = 0
vma_internals = collections.OrderedDict()
+ process_pageframe_set = set()
pagemap_fd = os.open(
os.path.join('/proc', str(pid), 'pagemap'), os.O_RDONLY)
@@ -555,22 +562,21 @@ class ProcPagemap(object):
swapped = 0
vsize = 0
pageframes = collections.defaultdict(int)
- pageframes_set = set()
begin_offset = ProcPagemap._offset(vma.begin)
chunk_size = ProcPagemap._offset(vma.end) - begin_offset
os.lseek(pagemap_fd, begin_offset, os.SEEK_SET)
buf = os.read(pagemap_fd, chunk_size)
if len(buf) < chunk_size:
- LOGGER.warn('Failed to read pagemap at 0x%x.' % vma.begin)
+ _LOGGER.warn('Failed to read pagemap at 0x%x in %d.' % (vma.begin, pid))
pagemap_values = struct.unpack(
'=%dQ' % (len(buf) / ProcPagemap._BYTES_PER_PAGEMAP_VALUE), buf)
for pagemap_value in pagemap_values:
vsize += ProcPagemap._BYTES_PER_OS_PAGE
if pagemap_value & ProcPagemap._MASK_PRESENT:
- if (pagemap_value & ProcPagemap._MASK_PFN) in pageframes_set:
+ if (pagemap_value & ProcPagemap._MASK_PFN) in process_pageframe_set:
in_process_dup += ProcPagemap._BYTES_PER_OS_PAGE
else:
- pageframes_set.add(pagemap_value & ProcPagemap._MASK_PFN)
+ process_pageframe_set.add(pagemap_value & ProcPagemap._MASK_PFN)
if (pagemap_value & ProcPagemap._MASK_PFN) not in pageframes:
present += ProcPagemap._BYTES_PER_OS_PAGE
pageframes[pagemap_value & ProcPagemap._MASK_PFN] += 1
@@ -680,13 +686,12 @@ class _ProcessMemory(object):
def main(argv):
"""The main function for manual testing."""
-
- LOGGER.setLevel(logging.DEBUG)
+ _LOGGER.setLevel(logging.WARNING)
handler = logging.StreamHandler()
- handler.setLevel(logging.INFO)
- formatter = logging.Formatter('%(message)s')
- handler.setFormatter(formatter)
- LOGGER.addHandler(handler)
+ handler.setLevel(logging.WARNING)
+ handler.setFormatter(logging.Formatter(
+ '%(asctime)s:%(name)s:%(levelname)s:%(message)s'))
+ _LOGGER.addHandler(handler)
pids = []
for arg in argv[1:]: