Support to multi-threading and pthread interface (POSIX.1-2008) (#23)
[lunaix-os.git] / lunaix-os / scripts / gdb / lunadbg / profiling / pmstat.py
1 from ..symbols import LunaixSymbols
2 from ..structs.page import PageStruct
3 from ..pp import MyPrettyPrinter
4 import math
5
6 class PhysicalMemProfile:
7     def __init__(self) -> None:
8         super().__init__()
9         self._pm_list = LunaixSymbols.debug_sym("pmm", "pm_table")
10
11         self.max_mem_pg = int(LunaixSymbols.debug_sym("pmm", "max_pg").value())
12         self.max_mem_sz = self.max_mem_pg * 4096
13         self.mem_distr = []
14
15     def rescan_pmem(self, distr_granule = 256):
16         self.__mem_distr_granule = distr_granule
17         self.mem_distr.clear()
18
19         page_per_granule = self.max_mem_pg / self.__mem_distr_granule
20         page_per_granule = math.ceil(page_per_granule)
21         remainder = self.max_mem_pg % self.__mem_distr_granule
22         bucket = 0
23         non_contig = 0
24         last_contig = False
25         for i in range(self.max_mem_pg):
26             element = PageStruct(self._pm_list[i].address)
27             bucket += int(element.ref > 0)
28             if last_contig:
29                 last_contig = element.ref > 0
30                 non_contig += int(not last_contig)
31             else:
32                 last_contig = element.ref > 0
33
34             if (i + 1) % page_per_granule == 0:
35                 self.mem_distr.append(bucket)
36                 bucket = 0
37         
38         if remainder > 0:
39             if bucket > 0:
40                 bucket += page_per_granule - remainder
41             self.mem_distr.append(bucket)
42
43         self.consumed_pg = sum(self.mem_distr)
44         self.utilisation = self.consumed_pg / self.max_mem_pg
45         self.fragmentation = 2 * non_contig / self.max_mem_pg
46         self.discontig = non_contig
47         self.page_per_granule = page_per_granule
48