[mono] Fix sgen_gc_info.memory_load_bytes - #53364

Merged
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load
May 31, 2021
Merged

[mono] Fix sgen_gc_info.memory_load_bytes#53364
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load

Conversation

@radekdoulik

Copy link
Copy Markdown
Member

Set it to used memory size instead of available memory size

Set it to used memory size instead of available memory size
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @BrzVlad
See info in area-owners.md if you want to be subscribed.

Issue Details

Set it to used memory size instead of available memory size

Author:radekdoulik
Assignees:-
Labels:

area-GC-mono

Milestone:-

@nariccnaricc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thanks for fixing this.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Let see how the CI build will look. I think we might need to update also the mono_determine_physical_ram_available_size to not return 0 in case the information is not available. And also handle cases where sysconf returns -1.

@lateralusX

Copy link
Copy Markdown
Member

Let me try this tomorrow together with EventPipe and RuntimeEventSource since it presents a bunch of GC data to tools like dotnet-counters.

For systems without information about available physical memory size
Also handle -1 return values from sysconf calls
@lateralusX

Copy link
Copy Markdown
Member

Looks like RuntimeEventSource won't be affected since this metric is currently not published as an EventSource counter.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Did we check this property against coreclr GC? Just looking at the documentation won't tell what is actually returned, looking at coreclr GC implementation of the property it is calculated like this:

*lastRecordedMemLoadBytes = (uint64_t) (((double)(last_gc_info->memory_load)) / 100 * gc_heap::total_physical_mem);

where last_gc_info->memory_load seems to either be memory load on last GC enter/exit representing memory load on process/system, coming from GCToOSInterface::GetMemoryStatus that has the following comment,

// Get memory status
// Parameters:
// restricted_limit - The amount of physical memory in bytes that the current process is being restricted to. If non-zero, it used to calculate
// memory_load and available_physical. If zero, memory_load and available_physical is calculate based on all available memory.
// memory_load - A number between 0 and 100 that specifies the approximate percentage of physical memory
// that is in use (0 indicates no memory use and 100 indicates full memory use).
// available_physical - The amount of physical memory currently available, in bytes.
// available_page_file - The maximum amount of memory the current process can commit, in bytes.

That calculation take into account if there are restrictions on amount of memory that can be used by GC.

and gc_heap::total_physical_mem is set to:

gc_heap::total_physical_mem = (size_t)GCConfig::GetGCTotalPhysicalMemory();

and that seems to return either total amount of physical memory or any restricted limitation setup.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

On Windows it looks like at least one coreclr GC code path (ignoring memory restrictions and limitations) will just fall through using dwMemoryLoad here, https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-memorystatusex, and total physical is ullTotalPhys from that same struct, so then it will just calculate percent used out of total physical memory and that should be total physical bytes used, similar to our mono_determine_physical_ram_size() - mono_determine_physical_ram_available_size (), but we don't go over using the memory load (in percent) reducing some complexity in the calculations. Not sure how well this works with heap size restrictions on Mono though.

@lateralusX

Copy link
Copy Markdown
Member

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

Makes sense. I will change it to use mono_determine_physical_ram_size() in the calculation. I didn't notice the total_available_memory_bytes can be overriden.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

That might not work very well either. Let me think more about it.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Looks like CoreCLR uses different calculations when having heap size limitations, using process working set size in calculation, see GCToOSInterface::GetMemoryStatus.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

I made it to scale the memory load by total_available_memory_bytes/physical_ram_size. I think that might work for now and we can improve it later, if it leads to some issues?

The PhysicalMemoryMonitor should work ok with it.

@runfoapprunfoappBot mentioned this pull request May 28, 2021

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point in time we should probably do calculation against process working set when having a heap max limit instead of using system global memory state, but if current fix solves memory monitor issue I believe it will give us a good enough representation of this metric and way better than what we had (that was doing the opposite to what it should have done).

@radekdoulik
radekdoulik merged commit 93cf5df into dotnet:mainMay 31, 2021
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@radekdoulik@lateralusX@naricc
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[mono] Fix sgen_gc_info.memory_load_bytes - #53364

Merged
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load
May 31, 2021
Merged

[mono] Fix sgen_gc_info.memory_load_bytes#53364
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load

Conversation

@radekdoulik

Copy link
Copy Markdown
Member

Set it to used memory size instead of available memory size

Set it to used memory size instead of available memory size
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @BrzVlad
See info in area-owners.md if you want to be subscribed.

Issue Details

Set it to used memory size instead of available memory size

Author:radekdoulik
Assignees:-
Labels:

area-GC-mono

Milestone:-

@nariccnaricc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thanks for fixing this.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Let see how the CI build will look. I think we might need to update also the mono_determine_physical_ram_available_size to not return 0 in case the information is not available. And also handle cases where sysconf returns -1.

@lateralusX

Copy link
Copy Markdown
Member

Let me try this tomorrow together with EventPipe and RuntimeEventSource since it presents a bunch of GC data to tools like dotnet-counters.

For systems without information about available physical memory size
Also handle -1 return values from sysconf calls
@lateralusX

Copy link
Copy Markdown
Member

Looks like RuntimeEventSource won't be affected since this metric is currently not published as an EventSource counter.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Did we check this property against coreclr GC? Just looking at the documentation won't tell what is actually returned, looking at coreclr GC implementation of the property it is calculated like this:

*lastRecordedMemLoadBytes = (uint64_t) (((double)(last_gc_info->memory_load)) / 100 * gc_heap::total_physical_mem);

where last_gc_info->memory_load seems to either be memory load on last GC enter/exit representing memory load on process/system, coming from GCToOSInterface::GetMemoryStatus that has the following comment,

// Get memory status
// Parameters:
// restricted_limit - The amount of physical memory in bytes that the current process is being restricted to. If non-zero, it used to calculate
// memory_load and available_physical. If zero, memory_load and available_physical is calculate based on all available memory.
// memory_load - A number between 0 and 100 that specifies the approximate percentage of physical memory
// that is in use (0 indicates no memory use and 100 indicates full memory use).
// available_physical - The amount of physical memory currently available, in bytes.
// available_page_file - The maximum amount of memory the current process can commit, in bytes.

That calculation take into account if there are restrictions on amount of memory that can be used by GC.

and gc_heap::total_physical_mem is set to:

gc_heap::total_physical_mem = (size_t)GCConfig::GetGCTotalPhysicalMemory();

and that seems to return either total amount of physical memory or any restricted limitation setup.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

On Windows it looks like at least one coreclr GC code path (ignoring memory restrictions and limitations) will just fall through using dwMemoryLoad here, https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-memorystatusex, and total physical is ullTotalPhys from that same struct, so then it will just calculate percent used out of total physical memory and that should be total physical bytes used, similar to our mono_determine_physical_ram_size() - mono_determine_physical_ram_available_size (), but we don't go over using the memory load (in percent) reducing some complexity in the calculations. Not sure how well this works with heap size restrictions on Mono though.

@lateralusX

Copy link
Copy Markdown
Member

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

Makes sense. I will change it to use mono_determine_physical_ram_size() in the calculation. I didn't notice the total_available_memory_bytes can be overriden.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

That might not work very well either. Let me think more about it.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Looks like CoreCLR uses different calculations when having heap size limitations, using process working set size in calculation, see GCToOSInterface::GetMemoryStatus.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

I made it to scale the memory load by total_available_memory_bytes/physical_ram_size. I think that might work for now and we can improve it later, if it leads to some issues?

The PhysicalMemoryMonitor should work ok with it.

@runfoapprunfoappBot mentioned this pull request May 28, 2021

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point in time we should probably do calculation against process working set when having a heap max limit instead of using system global memory state, but if current fix solves memory monitor issue I believe it will give us a good enough representation of this metric and way better than what we had (that was doing the opposite to what it should have done).

@radekdoulik
radekdoulik merged commit 93cf5df into dotnet:mainMay 31, 2021
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@radekdoulik@lateralusX@naricc
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[mono] Fix sgen_gc_info.memory_load_bytes - #53364

Merged
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load
May 31, 2021
Merged

[mono] Fix sgen_gc_info.memory_load_bytes#53364
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load

Conversation

@radekdoulik

Copy link
Copy Markdown
Member

Set it to used memory size instead of available memory size

Set it to used memory size instead of available memory size
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @BrzVlad
See info in area-owners.md if you want to be subscribed.

Issue Details

Set it to used memory size instead of available memory size

Author:radekdoulik
Assignees:-
Labels:

area-GC-mono

Milestone:-

@nariccnaricc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thanks for fixing this.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Let see how the CI build will look. I think we might need to update also the mono_determine_physical_ram_available_size to not return 0 in case the information is not available. And also handle cases where sysconf returns -1.

@lateralusX

Copy link
Copy Markdown
Member

Let me try this tomorrow together with EventPipe and RuntimeEventSource since it presents a bunch of GC data to tools like dotnet-counters.

For systems without information about available physical memory size
Also handle -1 return values from sysconf calls
@lateralusX

Copy link
Copy Markdown
Member

Looks like RuntimeEventSource won't be affected since this metric is currently not published as an EventSource counter.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Did we check this property against coreclr GC? Just looking at the documentation won't tell what is actually returned, looking at coreclr GC implementation of the property it is calculated like this:

*lastRecordedMemLoadBytes = (uint64_t) (((double)(last_gc_info->memory_load)) / 100 * gc_heap::total_physical_mem);

where last_gc_info->memory_load seems to either be memory load on last GC enter/exit representing memory load on process/system, coming from GCToOSInterface::GetMemoryStatus that has the following comment,

// Get memory status
// Parameters:
// restricted_limit - The amount of physical memory in bytes that the current process is being restricted to. If non-zero, it used to calculate
// memory_load and available_physical. If zero, memory_load and available_physical is calculate based on all available memory.
// memory_load - A number between 0 and 100 that specifies the approximate percentage of physical memory
// that is in use (0 indicates no memory use and 100 indicates full memory use).
// available_physical - The amount of physical memory currently available, in bytes.
// available_page_file - The maximum amount of memory the current process can commit, in bytes.

That calculation take into account if there are restrictions on amount of memory that can be used by GC.

and gc_heap::total_physical_mem is set to:

gc_heap::total_physical_mem = (size_t)GCConfig::GetGCTotalPhysicalMemory();

and that seems to return either total amount of physical memory or any restricted limitation setup.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

On Windows it looks like at least one coreclr GC code path (ignoring memory restrictions and limitations) will just fall through using dwMemoryLoad here, https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-memorystatusex, and total physical is ullTotalPhys from that same struct, so then it will just calculate percent used out of total physical memory and that should be total physical bytes used, similar to our mono_determine_physical_ram_size() - mono_determine_physical_ram_available_size (), but we don't go over using the memory load (in percent) reducing some complexity in the calculations. Not sure how well this works with heap size restrictions on Mono though.

@lateralusX

Copy link
Copy Markdown
Member

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

Makes sense. I will change it to use mono_determine_physical_ram_size() in the calculation. I didn't notice the total_available_memory_bytes can be overriden.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

That might not work very well either. Let me think more about it.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Looks like CoreCLR uses different calculations when having heap size limitations, using process working set size in calculation, see GCToOSInterface::GetMemoryStatus.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

I made it to scale the memory load by total_available_memory_bytes/physical_ram_size. I think that might work for now and we can improve it later, if it leads to some issues?

The PhysicalMemoryMonitor should work ok with it.

@runfoapprunfoappBot mentioned this pull request May 28, 2021

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point in time we should probably do calculation against process working set when having a heap max limit instead of using system global memory state, but if current fix solves memory monitor issue I believe it will give us a good enough representation of this metric and way better than what we had (that was doing the opposite to what it should have done).

@radekdoulik
radekdoulik merged commit 93cf5df into dotnet:mainMay 31, 2021
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@radekdoulik@lateralusX@naricc
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[mono] Fix sgen_gc_info.memory_load_bytes - #53364

Merged
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load
May 31, 2021
Merged

[mono] Fix sgen_gc_info.memory_load_bytes#53364
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load

Conversation

@radekdoulik

Copy link
Copy Markdown
Member

Set it to used memory size instead of available memory size

Set it to used memory size instead of available memory size
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @BrzVlad
See info in area-owners.md if you want to be subscribed.

Issue Details

Set it to used memory size instead of available memory size

Author:radekdoulik
Assignees:-
Labels:

area-GC-mono

Milestone:-

@nariccnaricc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thanks for fixing this.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Let see how the CI build will look. I think we might need to update also the mono_determine_physical_ram_available_size to not return 0 in case the information is not available. And also handle cases where sysconf returns -1.

@lateralusX

Copy link
Copy Markdown
Member

Let me try this tomorrow together with EventPipe and RuntimeEventSource since it presents a bunch of GC data to tools like dotnet-counters.

For systems without information about available physical memory size
Also handle -1 return values from sysconf calls
@lateralusX

Copy link
Copy Markdown
Member

Looks like RuntimeEventSource won't be affected since this metric is currently not published as an EventSource counter.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Did we check this property against coreclr GC? Just looking at the documentation won't tell what is actually returned, looking at coreclr GC implementation of the property it is calculated like this:

*lastRecordedMemLoadBytes = (uint64_t) (((double)(last_gc_info->memory_load)) / 100 * gc_heap::total_physical_mem);

where last_gc_info->memory_load seems to either be memory load on last GC enter/exit representing memory load on process/system, coming from GCToOSInterface::GetMemoryStatus that has the following comment,

// Get memory status
// Parameters:
// restricted_limit - The amount of physical memory in bytes that the current process is being restricted to. If non-zero, it used to calculate
// memory_load and available_physical. If zero, memory_load and available_physical is calculate based on all available memory.
// memory_load - A number between 0 and 100 that specifies the approximate percentage of physical memory
// that is in use (0 indicates no memory use and 100 indicates full memory use).
// available_physical - The amount of physical memory currently available, in bytes.
// available_page_file - The maximum amount of memory the current process can commit, in bytes.

That calculation take into account if there are restrictions on amount of memory that can be used by GC.

and gc_heap::total_physical_mem is set to:

gc_heap::total_physical_mem = (size_t)GCConfig::GetGCTotalPhysicalMemory();

and that seems to return either total amount of physical memory or any restricted limitation setup.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

On Windows it looks like at least one coreclr GC code path (ignoring memory restrictions and limitations) will just fall through using dwMemoryLoad here, https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-memorystatusex, and total physical is ullTotalPhys from that same struct, so then it will just calculate percent used out of total physical memory and that should be total physical bytes used, similar to our mono_determine_physical_ram_size() - mono_determine_physical_ram_available_size (), but we don't go over using the memory load (in percent) reducing some complexity in the calculations. Not sure how well this works with heap size restrictions on Mono though.

@lateralusX

Copy link
Copy Markdown
Member

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

Makes sense. I will change it to use mono_determine_physical_ram_size() in the calculation. I didn't notice the total_available_memory_bytes can be overriden.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

That might not work very well either. Let me think more about it.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Looks like CoreCLR uses different calculations when having heap size limitations, using process working set size in calculation, see GCToOSInterface::GetMemoryStatus.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

I made it to scale the memory load by total_available_memory_bytes/physical_ram_size. I think that might work for now and we can improve it later, if it leads to some issues?

The PhysicalMemoryMonitor should work ok with it.

@runfoapprunfoappBot mentioned this pull request May 28, 2021

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point in time we should probably do calculation against process working set when having a heap max limit instead of using system global memory state, but if current fix solves memory monitor issue I believe it will give us a good enough representation of this metric and way better than what we had (that was doing the opposite to what it should have done).

@radekdoulik
radekdoulik merged commit 93cf5df into dotnet:mainMay 31, 2021
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@radekdoulik@lateralusX@naricc
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[mono] Fix sgen_gc_info.memory_load_bytes - #53364

Merged
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load
May 31, 2021
Merged

[mono] Fix sgen_gc_info.memory_load_bytes#53364
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load

Conversation

@radekdoulik

Copy link
Copy Markdown
Member

Set it to used memory size instead of available memory size

Set it to used memory size instead of available memory size
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @BrzVlad
See info in area-owners.md if you want to be subscribed.

Issue Details

Set it to used memory size instead of available memory size

Author:radekdoulik
Assignees:-
Labels:

area-GC-mono

Milestone:-

@nariccnaricc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thanks for fixing this.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Let see how the CI build will look. I think we might need to update also the mono_determine_physical_ram_available_size to not return 0 in case the information is not available. And also handle cases where sysconf returns -1.

@lateralusX

Copy link
Copy Markdown
Member

Let me try this tomorrow together with EventPipe and RuntimeEventSource since it presents a bunch of GC data to tools like dotnet-counters.

For systems without information about available physical memory size
Also handle -1 return values from sysconf calls
@lateralusX

Copy link
Copy Markdown
Member

Looks like RuntimeEventSource won't be affected since this metric is currently not published as an EventSource counter.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Did we check this property against coreclr GC? Just looking at the documentation won't tell what is actually returned, looking at coreclr GC implementation of the property it is calculated like this:

*lastRecordedMemLoadBytes = (uint64_t) (((double)(last_gc_info->memory_load)) / 100 * gc_heap::total_physical_mem);

where last_gc_info->memory_load seems to either be memory load on last GC enter/exit representing memory load on process/system, coming from GCToOSInterface::GetMemoryStatus that has the following comment,

// Get memory status
// Parameters:
// restricted_limit - The amount of physical memory in bytes that the current process is being restricted to. If non-zero, it used to calculate
// memory_load and available_physical. If zero, memory_load and available_physical is calculate based on all available memory.
// memory_load - A number between 0 and 100 that specifies the approximate percentage of physical memory
// that is in use (0 indicates no memory use and 100 indicates full memory use).
// available_physical - The amount of physical memory currently available, in bytes.
// available_page_file - The maximum amount of memory the current process can commit, in bytes.

That calculation take into account if there are restrictions on amount of memory that can be used by GC.

and gc_heap::total_physical_mem is set to:

gc_heap::total_physical_mem = (size_t)GCConfig::GetGCTotalPhysicalMemory();

and that seems to return either total amount of physical memory or any restricted limitation setup.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

On Windows it looks like at least one coreclr GC code path (ignoring memory restrictions and limitations) will just fall through using dwMemoryLoad here, https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-memorystatusex, and total physical is ullTotalPhys from that same struct, so then it will just calculate percent used out of total physical memory and that should be total physical bytes used, similar to our mono_determine_physical_ram_size() - mono_determine_physical_ram_available_size (), but we don't go over using the memory load (in percent) reducing some complexity in the calculations. Not sure how well this works with heap size restrictions on Mono though.

@lateralusX

Copy link
Copy Markdown
Member

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

Makes sense. I will change it to use mono_determine_physical_ram_size() in the calculation. I didn't notice the total_available_memory_bytes can be overriden.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

That might not work very well either. Let me think more about it.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Looks like CoreCLR uses different calculations when having heap size limitations, using process working set size in calculation, see GCToOSInterface::GetMemoryStatus.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

I made it to scale the memory load by total_available_memory_bytes/physical_ram_size. I think that might work for now and we can improve it later, if it leads to some issues?

The PhysicalMemoryMonitor should work ok with it.

@runfoapprunfoappBot mentioned this pull request May 28, 2021

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point in time we should probably do calculation against process working set when having a heap max limit instead of using system global memory state, but if current fix solves memory monitor issue I believe it will give us a good enough representation of this metric and way better than what we had (that was doing the opposite to what it should have done).

@radekdoulik
radekdoulik merged commit 93cf5df into dotnet:mainMay 31, 2021
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@radekdoulik@lateralusX@naricc
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[mono] Fix sgen_gc_info.memory_load_bytes - #53364

Merged
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load
May 31, 2021
Merged

[mono] Fix sgen_gc_info.memory_load_bytes#53364
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load

Conversation

@radekdoulik

Copy link
Copy Markdown
Member

Set it to used memory size instead of available memory size

Set it to used memory size instead of available memory size
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @BrzVlad
See info in area-owners.md if you want to be subscribed.

Issue Details

Set it to used memory size instead of available memory size

Author:radekdoulik
Assignees:-
Labels:

area-GC-mono

Milestone:-

@nariccnaricc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thanks for fixing this.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Let see how the CI build will look. I think we might need to update also the mono_determine_physical_ram_available_size to not return 0 in case the information is not available. And also handle cases where sysconf returns -1.

@lateralusX

Copy link
Copy Markdown
Member

Let me try this tomorrow together with EventPipe and RuntimeEventSource since it presents a bunch of GC data to tools like dotnet-counters.

For systems without information about available physical memory size
Also handle -1 return values from sysconf calls
@lateralusX

Copy link
Copy Markdown
Member

Looks like RuntimeEventSource won't be affected since this metric is currently not published as an EventSource counter.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Did we check this property against coreclr GC? Just looking at the documentation won't tell what is actually returned, looking at coreclr GC implementation of the property it is calculated like this:

*lastRecordedMemLoadBytes = (uint64_t) (((double)(last_gc_info->memory_load)) / 100 * gc_heap::total_physical_mem);

where last_gc_info->memory_load seems to either be memory load on last GC enter/exit representing memory load on process/system, coming from GCToOSInterface::GetMemoryStatus that has the following comment,

// Get memory status
// Parameters:
// restricted_limit - The amount of physical memory in bytes that the current process is being restricted to. If non-zero, it used to calculate
// memory_load and available_physical. If zero, memory_load and available_physical is calculate based on all available memory.
// memory_load - A number between 0 and 100 that specifies the approximate percentage of physical memory
// that is in use (0 indicates no memory use and 100 indicates full memory use).
// available_physical - The amount of physical memory currently available, in bytes.
// available_page_file - The maximum amount of memory the current process can commit, in bytes.

That calculation take into account if there are restrictions on amount of memory that can be used by GC.

and gc_heap::total_physical_mem is set to:

gc_heap::total_physical_mem = (size_t)GCConfig::GetGCTotalPhysicalMemory();

and that seems to return either total amount of physical memory or any restricted limitation setup.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

On Windows it looks like at least one coreclr GC code path (ignoring memory restrictions and limitations) will just fall through using dwMemoryLoad here, https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-memorystatusex, and total physical is ullTotalPhys from that same struct, so then it will just calculate percent used out of total physical memory and that should be total physical bytes used, similar to our mono_determine_physical_ram_size() - mono_determine_physical_ram_available_size (), but we don't go over using the memory load (in percent) reducing some complexity in the calculations. Not sure how well this works with heap size restrictions on Mono though.

@lateralusX

Copy link
Copy Markdown
Member

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

Makes sense. I will change it to use mono_determine_physical_ram_size() in the calculation. I didn't notice the total_available_memory_bytes can be overriden.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

That might not work very well either. Let me think more about it.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Looks like CoreCLR uses different calculations when having heap size limitations, using process working set size in calculation, see GCToOSInterface::GetMemoryStatus.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

I made it to scale the memory load by total_available_memory_bytes/physical_ram_size. I think that might work for now and we can improve it later, if it leads to some issues?

The PhysicalMemoryMonitor should work ok with it.

@runfoapprunfoappBot mentioned this pull request May 28, 2021

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point in time we should probably do calculation against process working set when having a heap max limit instead of using system global memory state, but if current fix solves memory monitor issue I believe it will give us a good enough representation of this metric and way better than what we had (that was doing the opposite to what it should have done).

@radekdoulik
radekdoulik merged commit 93cf5df into dotnet:mainMay 31, 2021
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@radekdoulik@lateralusX@naricc
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[mono] Fix sgen_gc_info.memory_load_bytes - #53364

Merged
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load
May 31, 2021
Merged

[mono] Fix sgen_gc_info.memory_load_bytes#53364
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load

Conversation

@radekdoulik

Copy link
Copy Markdown
Member

Set it to used memory size instead of available memory size

Set it to used memory size instead of available memory size
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @BrzVlad
See info in area-owners.md if you want to be subscribed.

Issue Details

Set it to used memory size instead of available memory size

Author:radekdoulik
Assignees:-
Labels:

area-GC-mono

Milestone:-

@nariccnaricc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thanks for fixing this.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Let see how the CI build will look. I think we might need to update also the mono_determine_physical_ram_available_size to not return 0 in case the information is not available. And also handle cases where sysconf returns -1.

@lateralusX

Copy link
Copy Markdown
Member

Let me try this tomorrow together with EventPipe and RuntimeEventSource since it presents a bunch of GC data to tools like dotnet-counters.

For systems without information about available physical memory size
Also handle -1 return values from sysconf calls
@lateralusX

Copy link
Copy Markdown
Member

Looks like RuntimeEventSource won't be affected since this metric is currently not published as an EventSource counter.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Did we check this property against coreclr GC? Just looking at the documentation won't tell what is actually returned, looking at coreclr GC implementation of the property it is calculated like this:

*lastRecordedMemLoadBytes = (uint64_t) (((double)(last_gc_info->memory_load)) / 100 * gc_heap::total_physical_mem);

where last_gc_info->memory_load seems to either be memory load on last GC enter/exit representing memory load on process/system, coming from GCToOSInterface::GetMemoryStatus that has the following comment,

// Get memory status
// Parameters:
// restricted_limit - The amount of physical memory in bytes that the current process is being restricted to. If non-zero, it used to calculate
// memory_load and available_physical. If zero, memory_load and available_physical is calculate based on all available memory.
// memory_load - A number between 0 and 100 that specifies the approximate percentage of physical memory
// that is in use (0 indicates no memory use and 100 indicates full memory use).
// available_physical - The amount of physical memory currently available, in bytes.
// available_page_file - The maximum amount of memory the current process can commit, in bytes.

That calculation take into account if there are restrictions on amount of memory that can be used by GC.

and gc_heap::total_physical_mem is set to:

gc_heap::total_physical_mem = (size_t)GCConfig::GetGCTotalPhysicalMemory();

and that seems to return either total amount of physical memory or any restricted limitation setup.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

On Windows it looks like at least one coreclr GC code path (ignoring memory restrictions and limitations) will just fall through using dwMemoryLoad here, https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-memorystatusex, and total physical is ullTotalPhys from that same struct, so then it will just calculate percent used out of total physical memory and that should be total physical bytes used, similar to our mono_determine_physical_ram_size() - mono_determine_physical_ram_available_size (), but we don't go over using the memory load (in percent) reducing some complexity in the calculations. Not sure how well this works with heap size restrictions on Mono though.

@lateralusX

Copy link
Copy Markdown
Member

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

Makes sense. I will change it to use mono_determine_physical_ram_size() in the calculation. I didn't notice the total_available_memory_bytes can be overriden.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

That might not work very well either. Let me think more about it.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Looks like CoreCLR uses different calculations when having heap size limitations, using process working set size in calculation, see GCToOSInterface::GetMemoryStatus.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

I made it to scale the memory load by total_available_memory_bytes/physical_ram_size. I think that might work for now and we can improve it later, if it leads to some issues?

The PhysicalMemoryMonitor should work ok with it.

@runfoapprunfoappBot mentioned this pull request May 28, 2021

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point in time we should probably do calculation against process working set when having a heap max limit instead of using system global memory state, but if current fix solves memory monitor issue I believe it will give us a good enough representation of this metric and way better than what we had (that was doing the opposite to what it should have done).

@radekdoulik
radekdoulik merged commit 93cf5df into dotnet:mainMay 31, 2021
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@radekdoulik@lateralusX@naricc
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[mono] Fix sgen_gc_info.memory_load_bytes - #53364

Merged
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load
May 31, 2021
Merged

[mono] Fix sgen_gc_info.memory_load_bytes#53364
radekdoulik merged 3 commits into
dotnet:mainfrom
radekdoulik:pr-mono-memory-load

Conversation

@radekdoulik

Copy link
Copy Markdown
Member

Set it to used memory size instead of available memory size

Set it to used memory size instead of available memory size
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @BrzVlad
See info in area-owners.md if you want to be subscribed.

Issue Details

Set it to used memory size instead of available memory size

Author:radekdoulik
Assignees:-
Labels:

area-GC-mono

Milestone:-

@nariccnaricc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thanks for fixing this.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Let see how the CI build will look. I think we might need to update also the mono_determine_physical_ram_available_size to not return 0 in case the information is not available. And also handle cases where sysconf returns -1.

@lateralusX

Copy link
Copy Markdown
Member

Let me try this tomorrow together with EventPipe and RuntimeEventSource since it presents a bunch of GC data to tools like dotnet-counters.

For systems without information about available physical memory size
Also handle -1 return values from sysconf calls
@lateralusX

Copy link
Copy Markdown
Member

Looks like RuntimeEventSource won't be affected since this metric is currently not published as an EventSource counter.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Did we check this property against coreclr GC? Just looking at the documentation won't tell what is actually returned, looking at coreclr GC implementation of the property it is calculated like this:

*lastRecordedMemLoadBytes = (uint64_t) (((double)(last_gc_info->memory_load)) / 100 * gc_heap::total_physical_mem);

where last_gc_info->memory_load seems to either be memory load on last GC enter/exit representing memory load on process/system, coming from GCToOSInterface::GetMemoryStatus that has the following comment,

// Get memory status
// Parameters:
// restricted_limit - The amount of physical memory in bytes that the current process is being restricted to. If non-zero, it used to calculate
// memory_load and available_physical. If zero, memory_load and available_physical is calculate based on all available memory.
// memory_load - A number between 0 and 100 that specifies the approximate percentage of physical memory
// that is in use (0 indicates no memory use and 100 indicates full memory use).
// available_physical - The amount of physical memory currently available, in bytes.
// available_page_file - The maximum amount of memory the current process can commit, in bytes.

That calculation take into account if there are restrictions on amount of memory that can be used by GC.

and gc_heap::total_physical_mem is set to:

gc_heap::total_physical_mem = (size_t)GCConfig::GetGCTotalPhysicalMemory();

and that seems to return either total amount of physical memory or any restricted limitation setup.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

On Windows it looks like at least one coreclr GC code path (ignoring memory restrictions and limitations) will just fall through using dwMemoryLoad here, https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-memorystatusex, and total physical is ullTotalPhys from that same struct, so then it will just calculate percent used out of total physical memory and that should be total physical bytes used, similar to our mono_determine_physical_ram_size() - mono_determine_physical_ram_available_size (), but we don't go over using the memory load (in percent) reducing some complexity in the calculations. Not sure how well this works with heap size restrictions on Mono though.

@lateralusX

Copy link
Copy Markdown
Member

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

Setting a explicit max heap size will probably cause issues the way the calculation is currently done, since sgen_gc_info.total_available_memory_bytes is then set by user, but mono_determine_physical_ram_available_size will still reflect the amount of physical memory available on the system.

Makes sense. I will change it to use mono_determine_physical_ram_size() in the calculation. I didn't notice the total_available_memory_bytes can be overriden.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

That might not work very well either. Let me think more about it.

@lateralusX

lateralusX commented May 28, 2021

Copy link
Copy Markdown
Member

Looks like CoreCLR uses different calculations when having heap size limitations, using process working set size in calculation, see GCToOSInterface::GetMemoryStatus.

@radekdoulik

Copy link
Copy Markdown
MemberAuthor

I made it to scale the memory load by total_available_memory_bytes/physical_ram_size. I think that might work for now and we can improve it later, if it leads to some issues?

The PhysicalMemoryMonitor should work ok with it.

@runfoapprunfoappBot mentioned this pull request May 28, 2021

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At some point in time we should probably do calculation against process working set when having a heap max limit instead of using system global memory state, but if current fix solves memory monitor issue I believe it will give us a good enough representation of this metric and way better than what we had (that was doing the opposite to what it should have done).

@radekdoulik
radekdoulik merged commit 93cf5df into dotnet:mainMay 31, 2021
thaystg added a commit to thaystg/runtime that referenced this pull request Jun 1, 2021
…asm_debugger_and_use_debugger_agent
* upstream/main: (597 commits)
Fix42292 (dotnet#52463)
[mono] Remove some obsolete emscripten flags. (dotnet#53486)
Fixed path to projects (dotnet#53435)
support ServerCertificateContext in quic (dotnet#53175)
Socket: delete unix local endpoint filename on Close (dotnet#52103)
[mono] Fix sgen_gc_info.memory_load_bytes (dotnet#53364)
Refactor MsQuic's native IP address types. (dotnet#53461)
Re-enabled optimizations for gtFoldExprConst (dotnet#53347)
Add diagnostic support into sample app and AppBuilders on Mono. (dotnet#53361)
Fix issues with virtuals and mdarrays (dotnet#53400)
Split Variant marshalling tests (dotnet#53035)
Update clrjit.natvis to cover GT_SIMD and GT_HWINTRINSIC (dotnet#53470)
remove WSL checks in tests (dotnet#53475)
Always spawn message loop thread for SystemEvents (dotnet#53467)
add AcceptAsync cancellation overloads (dotnet#53340)
Remove unnecessary reference to iOS workload pack in the Mono workload (dotnet#53425)
Add CookieContainer.GetAllCookies (dotnet#53441)
Remove DynamicallyAccessedMembers on JsonSerializer (dotnet#53235)
[wasm] Re-enable Wasm.Build.Tests (dotnet#53433)
[libraries] Move library tests Feature Switches defaults to Functional tests (dotnet#53253)
...
@ghostghost locked as resolved and limited conversation to collaborators Jun 30, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@radekdoulik@lateralusX@naricc