Clear-UDCache how to

@adam

During my testing with Clear-UDCache the physical memory still continue to grow, my dashboard setup is as follows:

1- scheduled endpoint to cache services using get-service command that runs every 10 seconds.
2- users are able to start/stop services and refresh to update service status.

will Clear-UDCache works in this scenario to prevent Ram growing, if so how to use it in above example.

it will be nice also to implement a cache clear percentage like clearing 33% of the cache items so UD still populating the data from last cache and doing so will prevent the need for recycling the apppool more often or every night.

Thank you

No amount of cache clearing features will fix memory leaks etc. right?

Like the issues with endpoints not being destroyed, or simply bad code.

@PorreKaj

will in my scenario the cache will keep building up in memory cause am running it throw a schedule which is needed in my case cause if i did the cache 1 time then for example if a user start a stopped service it wont reflect the updated status since you have the 1 cache when the service status was stopped.
but when you have a new cache executed every 10 seconds it seems that UD keep adding it to memory without overwriting previews cache which will increase the RAM usage over time.

am trying to see if there is a solution that will prevent appPool recycle every so often and thought clear-udcache will do so but looks like clear-udcache is implemented to target something else

Sounds interesting, can ya share the problematic code?

I’ve personally dropped using schedules for data that needs to be near live. Ran into too many issues with cache.

1 Like

Are the issues that the data isn’t consistent? The cache is now a simple dictionary rather than a MemoryCache object. It should give way more control over what is stored and for how long.

I’d be curious to see how you are using the cache as well.

@adam

below is my full code

$Schedule1 = New-UDEndpointSchedule -Every 10 -Second

Enable-UDLogging -Level Error -FilePath "Z:\inetpub\ServiceManagerWeb\Logs.log"


$Services = New-UDEndpoint -Schedule $Schedule1 -Endpoint {
   
              
           $Cache:Services = (Get-Service -ComputerName "lmspapp001" -Name "*Certification*","*Notification*","*Distribution*") | Select-Object Name,Status | Sort-Object Name | % { 
                    
                    
                    $FontColor = 'Green'

                    if ($_.Status -ne 'Running') {
                        
                    $FontColor = 'Red'
                     }
                    
                    
                    
                    [PSCustomObject]@{
                        Name = $_.Name
                        Status = New-UDElement -Tag 'div' -Attributes @{ style = @{ color = $FontColor } } -Content { $_.Status.ToString() }
                        Select = if($_.Status -eq 'Stopped'){

                        New-UDTooltip -Type info -Effect float -Place top -TooltipContent { "Start service!" } -Content {
                        New-UDButton -BackgroundColor "Red" -Text "Start" -OnClick {
                        Get-Service -ComputerName "lmspapp001" -Name $_.Name | Start-Service
                        Show-UDToast -Message "Service Started!" -MessageColor Green -Title $_.Name -Position topCenter -Duration 2500
                        }
                        }

                        }else{

                        if($_.Status -eq 'Running'){

                        New-UDTooltip -Type info -Effect float -Place top -TooltipContent { "Stop service!" } -Content {
                        New-UDButton -BackgroundColor "#26a69a" -Text "Stop" -Icon stop_circle -OnClick {
                        Get-Service -ComputerName "lmspapp001" -Name $_.Name | Stop-Service
                        Show-UDToast -Message "Service Stopped!" -MessageColor Red -Title $_.Name -Position topCenter -Duration 2500
                        
                           }
                        }
                     }
                  }
               }
            }
         }

$HomePage = New-UDPage -Name "Home" -Icon home -Content {
    New-UDCard -Title "Welcome to Tasks Manager Dashboard! You can begin by clicking hamburger menu icon above"

    New-UdRow {
            New-UdColumn -Size 6 -Content {
                New-UdRow {
                    New-UdColumn -Size 12 -Content {
                        New-UdTable -Title "Server Information" -Headers @(" ", " ") -Endpoint {
                            @{
                                'Computer Name' = $env:COMPUTERNAME
                                'Operating System' = (Get-CimInstance -ClassName Win32_OperatingSystem).Caption
                                'Total Disk Space (C:)' = (Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DeviceID='C:'").Size / 1GB | ForEach-Object { "$([Math]::Round($_, 2)) GBs " }
                                'Free Disk Space (C:)' = (Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DeviceID='C:'").FreeSpace / 1GB | ForEach-Object { "$([Math]::Round($_, 2)) GBs " }
                            }.GetEnumerator() | Out-UDTableData -Property @("Name", "Value")
                        }
                    }
                }
                New-UdRow {
                    New-UdColumn -Size 3 -Content {
                        New-UdChart -Title "Memory by Process" -Type Doughnut -RefreshInterval 5 -Endpoint {
                            Get-Process | ForEach-Object { [PSCustomObject]@{ Name = $_.Name; WorkingSet = [Math]::Round($_.WorkingSet / 1MB, 2) }} |  Out-UDChartData -DataProperty "WorkingSet" -LabelProperty Name
                        } -Options @{
                            legend = @{
                                display = $false
                            }
                        }
                    }
                    New-UdColumn -Size 3 -Content {
                        New-UdChart -Title "CPU by Process" -Type Doughnut -RefreshInterval 5 -Endpoint {
                            Get-Process | ForEach-Object { [PSCustomObject]@{ Name = $_.Name; CPU = $_.CPU } } |  Out-UDChartData -DataProperty "CPU" -LabelProperty Name
                        } -Options @{
                            legend = @{
                                display = $false
                            }
                        }
                    }
                    New-UdColumn -Size 3 -Content {
                        New-UdChart -Title "Handle by Process" -Type Doughnut -RefreshInterval 5 -Endpoint {
                            Get-Process | Out-UDChartData -DataProperty "HandleCount" -LabelProperty Name
                        } -Options @{
                            legend = @{
                                display = $false
                            }
                        }
                    }
                    New-UdColumn -Size 3 -Content {
                        New-UdChart -Title "Threads by Process" -Type Doughnut -RefreshInterval 5 -Endpoint {
                            Get-Process | ForEach-Object { [PSCustomObject]@{ Name = $_.Name; Threads = $_.Threads.Count } } |  Out-UDChartData -DataProperty "Threads" -LabelProperty Name
                        } -Options @{
                            legend = @{
                                display = $false
                            }
                        }
                    }
                }
                New-UdRow {
                    New-UdColumn -Size 12 -Content {
                        New-UdChart -Title "Disk Space by Drive" -Type Bar -AutoRefresh -Endpoint {
                            Get-CimInstance -ClassName Win32_LogicalDisk | ForEach-Object {
                                    [PSCustomObject]@{ DeviceId = $_.DeviceID;
                                                       Size = [Math]::Round($_.Size / 1GB, 2);
                                                       FreeSpace = [Math]::Round($_.FreeSpace / 1GB, 2); } } | Out-UDChartData -LabelProperty "DeviceID" -Dataset @(
                                New-UdChartDataset -DataProperty "Size" -Label "Size" -BackgroundColor "#80962F23" -HoverBackgroundColor "#80962F23"
                                New-UdChartDataset -DataProperty "FreeSpace" -Label "Free Space" -BackgroundColor "#8014558C" -HoverBackgroundColor "#8014558C"
                            )
                          } -Options @{
                              scales = @{
                                yAxes = @(@{
                                    min = 0
                                })
                            }
                        }
                    }
                }
            }
            New-UdColumn -Size 6 -Content {
                New-UdRow {
                    New-UdColumn -Size 6 -Content {
                        New-UdMonitor -Title "CPU (% processor time)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#80FF6B63' -ChartBorderColor '#FFFF6B63'  -Endpoint {
						    try {
								Get-Counter '\Processor(_Total)\% Processor Time' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
							}
                            catch {
								0 | Out-UDMonitorData
							}
                        }
                    }
                    New-UdColumn -Size 6 -Content {
                        New-UdMonitor -Title "Memory (% in use)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#8028E842' -ChartBorderColor '#FF28E842'  -Endpoint {
							try {
								Get-Counter '\memory\% committed bytes in use' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
							}
                            catch {
								0 | Out-UDMonitorData
							}
                        }
                    }
                }
                New-UdRow {
                    New-UdColumn -Size 6 -Content {
                        New-UdMonitor -Title "Network (IO Read Bytes/sec)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#80E8611D' -ChartBorderColor '#FFE8611D'  -Endpoint {
							try {
								Get-Counter '\Process(_Total)\IO Read Bytes/sec' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
							}
                            catch {
								0 | Out-UDMonitorData
							}
                        }
                    }
                    New-UdColumn -Size 6 -Content {
                        New-UdMonitor -Title "Disk (% disk time)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#80E8611D' -ChartBorderColor '#FFE8611D'  -Endpoint {
							try {
								Get-Counter '\physicaldisk(_total)\% disk time' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
							}
							catch {
								0 | Out-UDMonitorData
							}
                        }
                    }
                }
                New-UdRow {
                    New-UdColumn -Size 12 {
                        New-UdGrid -Title "Processes" -Headers @("Name", "ID", "Working Set", "CPU") -Properties @("Name", "Id", "WorkingSet", "CPU") -AutoRefresh -RefreshInterval 60 -Endpoint {
                            Get-Process | Select Name,ID,WorkingSet,CPU | Out-UDGridData
                        }
                    }
                }
            }
        }
    }


$Page1 = New-UDPage -Name "Services" -Icon server -Content { 

         New-UDElement -Id "Services" -Tag div4 -EndPoint {
    
        New-UDGrid -Id "Grid" -Title "Services" -Headers @("Name","Status","Select") -Properties @("Name","Status","Select") -Endpoint {
        
                $Cache:Services | Out-UDGridData
               
                  }
                                 
              }  
                        
             New-UDButton -BackgroundColor "#26a69a" -Text "Refresh" -OnClick {
             Sync-UDElement -Id "Grid" -Broadcast       
          } 
      } 
      

Start-UDDashboard -Wait -Endpoint @($Services) -Content{  
New-UDDashboard -Pages @($HomePage,$Page1) -Title "Tasks Manager" -Color '#FF050F7F'
} -Port 80 -Name ServiceManager