From 94f21f58fdaed8da814c5492882e0340fb88ae6e Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Thu, 27 May 2021 17:56:08 +0200 Subject: [PATCH 1/3] [mono] Fix sgen_gc_info.memory_load_bytes Set it to used memory size instead of available memory size --- src/mono/mono/sgen/sgen-memory-governor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/sgen/sgen-memory-governor.c b/src/mono/mono/sgen/sgen-memory-governor.c index 525942d5c21c4c..79faa488c4b288 100644 --- a/src/mono/mono/sgen/sgen-memory-governor.c +++ b/src/mono/mono/sgen/sgen-memory-governor.c @@ -144,7 +144,7 @@ update_gc_info (mword used_slots_size) sgen_gc_info.heap_size_bytes = major_size + sgen_los_memory_usage_total; sgen_gc_info.fragmented_bytes = sgen_gc_info.heap_size_bytes - sgen_los_memory_usage - major_size_in_use; - sgen_gc_info.memory_load_bytes = mono_determine_physical_ram_available_size (); + sgen_gc_info.memory_load_bytes = sgen_gc_info.total_available_memory_bytes - mono_determine_physical_ram_available_size (); sgen_gc_info.total_committed_bytes = major_size_in_use + sgen_los_memory_usage; sgen_gc_info.total_promoted_bytes = sgen_total_promoted_size - total_promoted_size_start; sgen_gc_info.total_major_size_bytes = major_size; From c8df406a92de75167d52ae471b4508117c583352 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Thu, 27 May 2021 22:34:07 +0200 Subject: [PATCH 2/3] Change the default size For systems without information about available physical memory size Also handle -1 return values from sysconf calls --- src/mono/mono/utils/memfuncs.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/mono/mono/utils/memfuncs.c b/src/mono/mono/utils/memfuncs.c index 4b30d1e0d09d27..5ffb16b25912ec 100644 --- a/src/mono/mono/utils/memfuncs.c +++ b/src/mono/mono/utils/memfuncs.c @@ -240,6 +240,8 @@ mono_gc_memmove_atomic (void *dest, const void *src, size_t size) mono_gc_memmove_aligned (dest, src, size); } +#define _DEFAULT_MEM_SIZE 134217728 + guint64 mono_determine_physical_ram_size (void) { @@ -267,30 +269,30 @@ mono_determine_physical_ram_size (void) sysctl (mib, 2, &value, &size_sys, NULL, 0); if (value == 0) - return 134217728; + return _DEFAULT_MEM_SIZE; return (guint64)value; #elif defined (HAVE_SYSCONF) - guint64 page_size = 0, num_pages = 0; + gint64 page_size = -1, num_pages = -1; /* sysconf works on most *NIX operating systems, if your system doesn't have it or if it * reports invalid values, please add your OS specific code below. */ #ifdef _SC_PAGESIZE - page_size = (guint64)sysconf (_SC_PAGESIZE); + page_size = (gint64)sysconf (_SC_PAGESIZE); #endif #ifdef _SC_PHYS_PAGES - num_pages = (guint64)sysconf (_SC_PHYS_PAGES); + num_pages = (gint64)sysconf (_SC_PHYS_PAGES); #endif - if (!page_size || !num_pages) { + if (page_size == -1 || num_pages == -1) { g_warning ("Your operating system's sysconf (3) function doesn't correctly report physical memory size!"); - return 134217728; + return _DEFAULT_MEM_SIZE; } - return page_size * num_pages; + return (guint64)page_size * (guint64)num_pages; #else - return 134217728; + return _DEFAULT_MEM_SIZE; #endif } @@ -342,25 +344,25 @@ mono_determine_physical_ram_available_size (void) return (guint64) vmstat.free_count * page_size; #elif defined (HAVE_SYSCONF) - guint64 page_size = 0, num_pages = 0; + gint64 page_size = -1, num_pages = -1; /* sysconf works on most *NIX operating systems, if your system doesn't have it or if it * reports invalid values, please add your OS specific code below. */ #ifdef _SC_PAGESIZE - page_size = (guint64)sysconf (_SC_PAGESIZE); + page_size = (gint64)sysconf (_SC_PAGESIZE); #endif #ifdef _SC_AVPHYS_PAGES - num_pages = (guint64)sysconf (_SC_AVPHYS_PAGES); + num_pages = (gint64)sysconf (_SC_AVPHYS_PAGES); #endif - if (!page_size || !num_pages) { + if (page_size == -1 || num_pages == -1) { g_warning ("Your operating system's sysconf (3) function doesn't correctly report physical memory size!"); - return 0; + return _DEFAULT_MEM_SIZE; } - return page_size * num_pages; + return (guint64)page_size * (guint64)num_pages; #else - return 0; + return _DEFAULT_MEM_SIZE; #endif } From 59ccd3970da034d94d30a3bb01ad565e156b398b Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 28 May 2021 12:31:32 +0200 Subject: [PATCH 3/3] Scale the memory load by total_available/ram_size --- src/mono/mono/sgen/sgen-memory-governor.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mono/mono/sgen/sgen-memory-governor.c b/src/mono/mono/sgen/sgen-memory-governor.c index 79faa488c4b288..ac801a24a92f02 100644 --- a/src/mono/mono/sgen/sgen-memory-governor.c +++ b/src/mono/mono/sgen/sgen-memory-governor.c @@ -144,7 +144,8 @@ update_gc_info (mword used_slots_size) sgen_gc_info.heap_size_bytes = major_size + sgen_los_memory_usage_total; sgen_gc_info.fragmented_bytes = sgen_gc_info.heap_size_bytes - sgen_los_memory_usage - major_size_in_use; - sgen_gc_info.memory_load_bytes = sgen_gc_info.total_available_memory_bytes - mono_determine_physical_ram_available_size (); + guint64 physical_ram_size = mono_determine_physical_ram_size (); + sgen_gc_info.memory_load_bytes = physical_ram_size ? sgen_gc_info.total_available_memory_bytes - (guint64)(((double)sgen_gc_info.total_available_memory_bytes*mono_determine_physical_ram_available_size ())/physical_ram_size) : 0; sgen_gc_info.total_committed_bytes = major_size_in_use + sgen_los_memory_usage; sgen_gc_info.total_promoted_bytes = sgen_total_promoted_size - total_promoted_size_start; sgen_gc_info.total_major_size_bytes = major_size;