Пример #1
0
 def process_request(self, request: HttpRequest) -> HttpResponse:
     self._tracker = ClassTracker()
     for cls in apps.get_models() + self.classes:
         self._tracker.track_class(cls)
     self._tracker.create_snapshot('before')
     self.record_stats({'before': ProcessMemoryInfo()})
     response = super(MemoryPanel, self).process_request(request)
     self.record_stats({'after': ProcessMemoryInfo()})
     self._tracker.create_snapshot('after')
     stats = self._tracker.stats
     stats.annotate()
     self.record_stats({'stats': stats})
     return response
Пример #2
0
    def _check_memory(self):
        if not self.pmi:
            self.pmi = ProcessMemoryInfo()
            self.last_vsz = self.pmi.vsz
            self.initial_vsz = self.pmi.vsz

        utc = datetime.datetime.utcnow()
        check = self.last_time is None
        if self.last_time:
            diff = utc - self.last_time
            if diff.seconds > 30:
                check = True
        if check:
            self.last_time = utc
            self.pmi.update()
            diff = (self.pmi.vsz - self.last_vsz) / 1000
            idiff = (self.pmi.vsz - self.initial_vsz) / 1000
            self.total_processed += self.processed
            per_message = 0
            if self.total_processed:
                per_message = idiff / self.total_processed
            LOG.debug("%20s %6dk/%6dk ram, "
                      "%3d/%4d msgs @ %6dk/msg" %
                      (self.name, diff, idiff, self.processed,
                       self.total_processed, per_message))
            self.last_vsz = self.pmi.vsz
            self.processed = 0
Пример #3
0
 def profiler_handler(req):
     self._tracker.create_snapshot('before')
     before = ProcessMemoryInfo()
     req_before = get_memory_object(req.registry)
     try:
         result = handler(req)
     except:
         raise
     finally:
         after = ProcessMemoryInfo()
         self._tracker.create_snapshot('after')
         class_stats = self._tracker.stats
         class_stats.annotate()
         self.stats = dict(
             before=before,
             after=after,
             class_stats=class_stats,
             req_before=req_before,
             req_after=get_memory_object(req.registry),
         )
     return result
Пример #4
0
def _getProcessMemory():
    """Utility function that defined the logic to get memory."""
    return ProcessMemoryInfo().rss
Пример #5
0
 def process_response(self, request, response):
     self.record_stats({'after': ProcessMemoryInfo()})
     self._tracker.create_snapshot('after')
     stats = self._tracker.stats
     stats.annotate()
     self.record_stats({'stats': stats})
Пример #6
0
 def process_request(self, request):
     self._tracker = ClassTracker()
     for cls in apps.get_models() + self.classes:
         self._tracker.track_class(cls)
     self._tracker.create_snapshot('before')
     self.record_stats({'before': ProcessMemoryInfo()})
Пример #7
0
def root():
    """Get overview."""
    pmi = ProcessMemoryInfo()
    return dict(processinfo=pmi)
Пример #8
0
def process():
    """Get process overview."""
    pmi = ProcessMemoryInfo()
    threads = get_current_threads()
    return dict(info=pmi, threads=threads)
Пример #9
0
        def track_memory_wrapper(*args, **kwargs):

            memory_info = {}
            tracker = ClassTracker()
            for cls in apps.get_models() + [Context, Template]:
                # track all models from registered apps, plus some standard Django ones
                tracker.track_class(cls)

            try:
                tracker.create_snapshot("before")
                memory_info["before"] = ProcessMemoryInfo()
                result = fn(*args, **kwargs)
                memory_info["after"] = ProcessMemoryInfo()
                tracker.create_snapshot("after")
                memory_info["stats"] = tracker.stats
                memory_info["stats"].annotate()
                return result

            finally:

                # record a whole bunch of memory statistics...
                resources = [
                    ("resident set size", memory_info["after"].rss),
                    ("virtual size", memory_info["after"].vsz),
                ]
                resources.extend(memory_info["after"] - memory_info["before"])
                resources = [(k, pp(v)) for k, v in resources]
                resources.extend(memory_info["after"].os_specific)

                # record each tracked class as of the final snapshot...
                classes_stats = []
                snapshot = memory_info["stats"].snapshots[-1]
                for class_name in memory_info["stats"].tracked_classes:
                    # history is a list of tuples that is updated on every creation/deletions: (timestamp, n_instances)
                    history = [
                        n for _, n in memory_info["stats"].history[class_name]
                    ]
                    if history:
                        classes_stats.append({
                            "name":
                            class_name,
                            "n_instances":
                            len(history),
                            "min_instances":
                            min(history),
                            "max_instances":
                            max(history),
                            "size":
                            pp(
                                snapshot.classes.get(class_name,
                                                     {}).get("sum", 0)),
                        })

                if not path:
                    stream = sys.stdout
                else:
                    stream = open(path, "w")

                print("\nRESOURCES", file=stream)
                for k, v in resources:
                    print(f"{k:<26}: {v:>10}", file=stream)
                print("\nCLASSES", file=stream)
                for class_stats in classes_stats:
                    print(
                        "{name}: created/deleted {n_instances} times for a min/max of {min_instances}/{max_instances} instances: {size:>10}"
                        .format(**class_stats),
                        file=stream,
                    )

                stream.closed
                tracker.detach_all_classes()
Пример #10
0
 def process_response(self, request, response):
     self._after = ProcessMemoryInfo()
     self._tracker.create_snapshot('after')
Пример #11
0
 def process_request(self, request):
     self._tracker = ClassTracker()
     for cls in get_models() + self.classes:
         self._tracker.track_class(cls, keep=True)
     self._tracker.create_snapshot('before')
     self._before = ProcessMemoryInfo()