From b6af10d3a445707d31d98d2956745021b6e18c4b Mon Sep 17 00:00:00 2001 From: Guillaume Raffy Date: Tue, 13 Aug 2024 17:24:19 +0200 Subject: [PATCH] refactored and documented showmem into expe000 --- measurements/expe000/readme.md | 15 +++++++++++++++ src/linuxmem/__init__.py | 2 +- src/linuxmem/linuxmem.py | 21 ++------------------- src/memavail.py | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 20 deletions(-) create mode 100644 measurements/expe000/readme.md create mode 100755 src/memavail.py diff --git a/measurements/expe000/readme.md b/measurements/expe000/readme.md new file mode 100644 index 0000000..b11f43d --- /dev/null +++ b/measurements/expe000/readme.md @@ -0,0 +1,15 @@ +This experimentation explores how meminfo's MemAvailable is computed, via an attempt to replicate code used in linux ([file://../../reference/show_mem.c]) + + +```sh +20240813-16:48:45 graffy@graffy-ws2:~/work/linuxram.git$ ./src/memavail.py +{'MemTotal': 201214205952, 'MemFree': 803061760, 'MemAvailable': 131466833920, 'Buffers': 31981568, 'Cached': 130939863040, 'SwapCached': 1088724992, 'Active': 103304773632, 'Inactive': 94177337344, 'Active(anon)': 39671312384, 'Inactive(anon)': 26918952960, 'Active(file)': 63633461248, 'Inactive(file)': 67258384384, 'Unevictable': 23019520, 'Mlocked': 19873792, 'SwapTotal': 32765898752, 'SwapFree': 0, 'Zswap': 0, 'Zswapped': 0, 'Dirty': 8546779136, 'Writeback': 5550080, 'AnonPages': 65442127872, 'Mapped': 120565760, 'Shmem': 69955584, 'KReclaimable': 1252827136, 'Slab': 1991671808, 'SReclaimable': 1252827136, 'SUnreclaim': 738844672, 'KernelStack': 17088512, 'PageTables': 218902528, 'SecPageTables': 0, 'NFS_Unstable': 0, 'Bounce': 0, 'WritebackTmp': 0, 'CommitLimit': 133373001728, 'Committed_AS': 141631254528, 'VmallocTotal': 35184372087808, 'VmallocUsed': 302333952, 'VmallocChunk': 0, 'Percpu': 215089152, 'HardwareCorrupted': 53248, 'AnonHugePages': 49218060288, 'ShmemHugePages': 0, 'ShmemPmdMapped': 0, 'FileHugePages': 0, 'FilePmdMapped': 0, 'Hugepagesize': 2097152, 'Hugetlb': 0, 'DirectMap4k': 554131456, 'DirectMap2M': 6434062336, 'DirectMap1G': 199715979264} +0: {'DMA': 4, 'DMA32': 529, 'Normal': 34991, 'Movable': 0, 'Device': 0}1: {'DMA': 0, 'DMA32': 0, 'Normal': 36110, 'Movable': 0, 'Device': 0}2: {} +free memory : 784240.0 KiB +cache memory : 127537532.0 KiB +reclaimable memory : 2160392.0 KiB +meminfo's MemAvailable : 128385580.0 KiB +computed available memory : 128691460.0 KiB +computed - meminfo = 305880.0 KiB (76470.0 pages) +last command status : [0] +``` diff --git a/src/linuxmem/__init__.py b/src/linuxmem/__init__.py index da8754b..ab4e119 100644 --- a/src/linuxmem/__init__.py +++ b/src/linuxmem/__init__.py @@ -5,4 +5,4 @@ from .linuxmem import read_meminfo_stdout # noqa from .linuxmem import meminfo_diff # noqa from .linuxmem import find_diff # noqa from .linuxmem import get_stabilized_meminfo # noqa - +from .linuxmem import compute_mem_avail # noqa diff --git a/src/linuxmem/linuxmem.py b/src/linuxmem/linuxmem.py index e602309..15e24bf 100755 --- a/src/linuxmem/linuxmem.py +++ b/src/linuxmem/linuxmem.py @@ -4,7 +4,6 @@ import re from pathlib import Path import subprocess import time -# code to userstand how meminfo's MemAvailable is computed MeminfoVarId = str MemUnit = int # in bytes @@ -224,7 +223,8 @@ def estimate_mem_available(meminfo_data: Dict[MeminfoVarId, MemUnit], zoneinfo_d return num_available_pages * page_size -def show_memory_state(meminfo_stdout_file_path: Path, grepped_zoneinfo_file_path: Path): +def compute_mem_avail(meminfo_stdout_file_path: Path, grepped_zoneinfo_file_path: Path): + # code to userstand how meminfo's MemAvailable is computed meminfo_data = read_meminfo_stdout(meminfo_stdout_file_path) print(meminfo_data) @@ -235,20 +235,3 @@ def show_memory_state(meminfo_stdout_file_path: Path, grepped_zoneinfo_file_path assert meminfo_data['Active'] == (meminfo_data['Active(file)'] + meminfo_data['Active(anon)']) assert meminfo_data['Inactive'] == (meminfo_data['Inactive(file)'] + meminfo_data['Inactive(anon)']) - - -def main(): - - set_id = 'stressed_alambix97' - # set_id = 'validation_alambix98' - if set_id == 'stressed_alambix97': - meminfo_stdout_file_path = Path('/home/graffy/work/tickets/bug3897/alambix97/20240805-191606-meminfo.stdout') - grepped_zoneinfo_file_path = Path('/home/graffy/work/tickets/bug3897/alambix98/20240806-202043-grepped-zoneinfo.stdout') # I didn't have a chance to get zone infor before it crashed so I used another measure, hoping that zoneinfo is minimal - elif set_id == 'validation_alambix98': - meminfo_stdout_file_path = Path('/home/graffy/work/tickets/bug3897/alambix98/20240806-223916-meminfo.stdout') - grepped_zoneinfo_file_path = Path('/home/graffy/work/tickets/bug3897/alambix98/20240806-223916-grepped-zoneinfo.stdout') - - show_memory_state(meminfo_stdout_file_path, grepped_zoneinfo_file_path) - - -main() diff --git a/src/memavail.py b/src/memavail.py new file mode 100755 index 0000000..f8f778c --- /dev/null +++ b/src/memavail.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +""" +code to userstand how meminfo's MemAvailable is computed + +how to use: + +```sh +20240813-16:43:33 graffy@graffy-ws2:~/work/linuxram.git$ export LINUXRAM_ROOT=$(pwd) +20240813-16:48:20 graffy@graffy-ws2:~/work/linuxram.git$ ./src/test_tmpfs.py +``` + +""" +from pathlib import Path +import os +from linuxmem import compute_mem_avail + + +def main(): + + set_id = 'stressed_alambix97' + # set_id = 'validation_alambix98' + linuxram_root_dir = Path(os.getenv('LINUXRAM_ROOT')) + + if set_id == 'stressed_alambix97': + meminfo_stdout_file_path = linuxram_root_dir / 'measurements/bug3897/alambix97/20240805-191606-meminfo.stdout' + grepped_zoneinfo_file_path = linuxram_root_dir / 'measurements/bug3897/alambix98/20240806-202043-grepped-zoneinfo.stdout' # I didn't have a chance to get zone info before it crashed so I used another measure, hoping that zoneinfo is minimal + elif set_id == 'validation_alambix98': + meminfo_stdout_file_path = linuxram_root_dir / 'measurements/alambix98/20240806-223916-meminfo.stdout' + grepped_zoneinfo_file_path = linuxram_root_dir / 'measurements/bug3897/alambix98/20240806-223916-grepped-zoneinfo.stdout' + + compute_mem_avail(meminfo_stdout_file_path, grepped_zoneinfo_file_path) + + +main()