Author: fijal Branch: memory-accounting Changeset: r93011:5e198814c5f6 Date: 2017-11-14 10:19 +0100 http://bitbucket.org/pypy/pypy/changeset/5e198814c5f6/
Log: add tracking of memory diff --git a/pypy/module/gc/__init__.py b/pypy/module/gc/__init__.py --- a/pypy/module/gc/__init__.py +++ b/pypy/module/gc/__init__.py @@ -19,6 +19,7 @@ space.config.translation.gctransformer == "framework"): self.appleveldefs.update({ 'dump_rpy_heap': 'app_referents.dump_rpy_heap', + 'get_stats': 'app_referents.get_stats', }) self.interpleveldefs.update({ 'get_rpy_roots': 'referents.get_rpy_roots', @@ -28,7 +29,7 @@ 'get_objects': 'referents.get_objects', 'get_referents': 'referents.get_referents', 'get_referrers': 'referents.get_referrers', - 'get_stats': 'referents.get_stats', + '_get_stats': 'referents.get_stats', '_dump_rpy_heap': 'referents._dump_rpy_heap', 'get_typeids_z': 'referents.get_typeids_z', 'get_typeids_list': 'referents.get_typeids_list', diff --git a/pypy/module/gc/app_referents.py b/pypy/module/gc/app_referents.py --- a/pypy/module/gc/app_referents.py +++ b/pypy/module/gc/app_referents.py @@ -48,3 +48,42 @@ file.flush() fd = file.fileno() gc._dump_rpy_heap(fd) + +class GcStats(object): + def __init__(self, s): + self._s = s + for item in ('total_gc_memory', 'jit_backend_used', 'total_memory_pressure', + 'total_allocated_memory', 'jit_backend_allocated'): + setattr(self, item, self._format(getattr(self._s, item))) + self.memory_used_sum = self._format(self._s.total_gc_memory + self._s.total_memory_pressure + + self._s.jit_backend_used) + self.memory_allocated_sum = self._format(self._s.total_allocated_memory + self._s.total_memory_pressure + + self._s.jit_backend_allocated) + + def _format(self, v): + if v < 1000000: + # bit unlikely ;-) + return "%.1fkB" % (v / 1024.) + return "%.1fMB" % (v / 1024. / 1024.) + + def repr(self): + return """Total memory consumed: +GC used: %s +raw assembler used: %s +memory pressure: %s +----------------------------- +Total: %s + +Total memory allocated: +GC allocated: %s +raw assembler allocated: %s +memory pressure: %s +----------------------------- +Total: %s +""" % (self.total_gc_memory, self.jit_backend_used, self.total_memory_pressure, + self.memory_used_sum, + self.total_allocated_memory, self.jit_backend_allocated, self.total_memory_pressure, + self.memory_allocated_sum) + +def get_stats(): + return GcStats(gc._get_stats()) diff --git a/pypy/module/gc/referents.py b/pypy/module/gc/referents.py --- a/pypy/module/gc/referents.py +++ b/pypy/module/gc/referents.py @@ -1,7 +1,7 @@ -from rpython.rlib import rgc +from rpython.rlib import rgc, jit_hooks from pypy.interpreter.baseobjspace import W_Root from pypy.interpreter.typedef import TypeDef, interp_attrproperty -from pypy.interpreter.gateway import unwrap_spec +from pypy.interpreter.gateway import unwrap_spec, interp2app from pypy.interpreter.error import oefmt, wrap_oserror from rpython.rlib.objectmodel import we_are_translated @@ -175,12 +175,21 @@ def __init__(self): self.total_memory_pressure = rgc.get_stats(rgc.TOTAL_MEMORY_PRESSURE) self.total_gc_memory = rgc.get_stats(rgc.TOTAL_MEMORY) + self.total_allocated_memory = rgc.get_stats(rgc.TOTAL_ALLOCATED_MEMORY) + self.jit_backend_allocated = jit_hooks.stats_asmmemmgr_allocated(None) + self.jit_backend_used = jit_hooks.stats_asmmemmgr_used(None) W_GcStats.typedef = TypeDef("GcStats", total_memory_pressure=interp_attrproperty("total_memory_pressure", cls=W_GcStats, wrapfn="newint"), total_gc_memory=interp_attrproperty("total_gc_memory", - cls=W_GcStats, wrapfn="newint") + cls=W_GcStats, wrapfn="newint"), + total_allocated_memory=interp_attrproperty("total_allocated_memory", + cls=W_GcStats, wrapfn="newint"), + jit_backend_allocated=interp_attrproperty("jit_backend_allocated", + cls=W_GcStats, wrapfn="newint"), + jit_backend_used=interp_attrproperty("jit_backend_used", + cls=W_GcStats, wrapfn="newint"), ) def get_stats(space): diff --git a/rpython/memory/gc/incminimark.py b/rpython/memory/gc/incminimark.py --- a/rpython/memory/gc/incminimark.py +++ b/rpython/memory/gc/incminimark.py @@ -1184,6 +1184,11 @@ """ return self.ac.total_memory_used + self.rawmalloced_total_size + def get_total_memory_alloced(self): + """ Return the total memory allocated + """ + return self.ac.total_memory_alloced + self.rawmalloced_total_size + def threshold_reached(self, extra=0): return (self.next_major_collection_threshold - float(self.get_total_memory_used())) < float(extra) @@ -2925,7 +2930,7 @@ if stats_no == rgc.TOTAL_MEMORY: return intmask(self.get_total_memory_used() + self.nursery_size) elif stats_no == rgc.TOTAL_ALLOCATED_MEMORY: - return 0 + return intmask(self.get_total_memory_alloced() + self.nursery_size) elif stats_no == rgc.TOTAL_MEMORY_PRESSURE: return inspector.count_memory_pressure(self) return 0 diff --git a/rpython/memory/gc/minimarkpage.py b/rpython/memory/gc/minimarkpage.py --- a/rpython/memory/gc/minimarkpage.py +++ b/rpython/memory/gc/minimarkpage.py @@ -294,6 +294,7 @@ # 'arena_base' points to the start of malloced memory; it might not # be a page-aligned address arena_base = llarena.arena_malloc(self.arena_size, False) + self.total_memory_alloced += self.arena_size if not arena_base: out_of_memory("out of memory: couldn't allocate the next arena") arena_end = arena_base + self.arena_size @@ -398,6 +399,7 @@ # The whole arena is empty. Free it. llarena.arena_reset(arena.base, self.arena_size, 4) llarena.arena_free(arena.base) + self.total_memory_alloced -= self.arena_size lltype.free(arena, flavor='raw', track_allocation=False) # else: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit