Select to view content in your preferred language

ArcSOC widget(s)

793
3
Jump to solution
04-15-2024 08:23 AM
Mike_Tulis
Occasional Contributor

I am looking for help with configuring an ArcGIS Monitor widget(s) that would:

1.   count ArcGIS Server ArcSOCs in use
2.   display sum of min and max ArcSOCs allocated to all services 
3.   show linear chart of top 10 services / ArcSOCs based on memory use. 

We have a wide range of min and max instances across all services on the Server. I am hoping to configure a widget that would help me identify correlation between high number of ArcSOCs in use and hardware/server performance. Many of them area seasonal (used May-October only) and/or used seldom. These widgets would help with hardware sizing or moving services to other machine.  

0 Kudos
1 Solution

Accepted Solutions
GeoJosh
Esri Regular Contributor

@Mike_Tulis, here are a few more ideas that I think answer your questions:

ArcSOC Process Instances, per machine

Data Expression

GeoJosh_0-1713451366450.png

Chart Configuration

NOTE: Edited at 3:52 on 4/18. The previous iteration suggested "Statistic Type: Sum" but "Maximum" is more appropriate for this use case, as pictured below:

GeoJosh_0-1713469903420.png

 

Min/Max ArcSOC Instances

Data Expression

GeoJosh_2-1713451609339.png

Chart Configuration

Change "Statistic Field" to "Instances Min" for minimum number of ArcSOCs.

GeoJosh_3-1713451643515.png

Top Services by Memory Usage

Data Expression

GeoJosh_4-1713452130437.png

Chart Configuration

GeoJosh_5-1713452184489.png

Josh

View solution in original post

3 Replies
AndrewSakowicz
Esri Contributor

perhaps you can use Solved: Analysis from ESRI Developer Summit 2024 - Esri CommunityAndrewSakowicz_1-1713196911695.png

if you want to see memory usage per service, duplicate the above tile and use the following expression 

AndrewSakowicz_0-1713196820168.png

for total number of arcsocs: 

AndrewSakowicz_2-1713197302116.png

Also, the following blogs might be helpful: https://community.esri.com/t5/arcgis-monitor-blog/arcgis-monitor-analysis-elements-for-enterprise/ba...


https://community.esri.com/t5/arcgis-monitor-blog/5-useful-arcgis-server-analysis-elements-in-arcgis...

 

GeoJosh
Esri Regular Contributor

@Mike_Tulis, here are a few more ideas that I think answer your questions:

ArcSOC Process Instances, per machine

Data Expression

GeoJosh_0-1713451366450.png

Chart Configuration

NOTE: Edited at 3:52 on 4/18. The previous iteration suggested "Statistic Type: Sum" but "Maximum" is more appropriate for this use case, as pictured below:

GeoJosh_0-1713469903420.png

 

Min/Max ArcSOC Instances

Data Expression

GeoJosh_2-1713451609339.png

Chart Configuration

Change "Statistic Field" to "Instances Min" for minimum number of ArcSOCs.

GeoJosh_3-1713451643515.png

Top Services by Memory Usage

Data Expression

GeoJosh_4-1713452130437.png

Chart Configuration

GeoJosh_5-1713452184489.png

Josh

MariuszZ_EPL
New Contributor

Hi

For diagnostic purposes, I created a PowerShell script to monitor ArcGIS Server's ArcSOC.exe processes over time. It captures memory usage data at regular intervals and logs the results to a CSV-style text file for further analysis.

Why is the number of arcsoc.exe instances different in the PowerShell script than what ArcGIS Monitor shows?

# Configuration
$logFile = "C:\esri\ArcSOC_Monitoring.log" # Path to the log file
$repeatCount = 30 # Number of measurement repetitions
$intervalMinutes = 1 # Time interval between measurements in minutes

# Add header to the log (if the file does not exist)
if (-not (Test-Path $logFile)) {
"Timestamp,Count,RAM_WorkingSet(GB),RAM_PrivateMemorySize(GB)" | Out-File -Append $logFile
}

# Measurement loop
for ($i = 1; $i -le $repeatCount; $i++) {
# Retrieve ArcSOC.exe processes
$processes = Get-Process -Name ArcSOC -ErrorAction SilentlyContinue

# Count the number of instances
$instanceCount = $processes.Count

# Sum memory: WorkingSet
$totalMemoryWorkingSet = ($processes | Measure-Object -Property WorkingSet -Sum).Sum
$totalMemoryWorkingSetGB = if ($totalMemoryWorkingSet) { [math]::Round($totalMemoryWorkingSet / 1GB, 2) } else { 0 }

# Sum memory: PrivateMemorySize
$totalMemoryPrivate = ($processes | Measure-Object -Property PrivateMemorySize -Sum).Sum
$totalMemoryPrivateGB = if ($totalMemoryPrivate) { [math]::Round($totalMemoryPrivate / 1GB, 2) } else { 0 }

# Get timestamp
$timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")

# Write to log
"$timestamp,$instanceCount,$totalMemoryWorkingSetGB,$totalMemoryPrivateGB" | Out-File -Append $logFile

# Display results in console
Write-Output "[$timestamp] Instance count: $instanceCount | WorkingSet: $totalMemoryWorkingSetGB GB | PrivateMemory: $totalMemoryPrivateGB GB"

# Sleep interval (skipped after the last measurement)
if ($i -lt $repeatCount) {
Start-Sleep -Seconds ($intervalMinutes * 60)
}
}

Write-Output "Monitoring completed. Results saved in file: $logFile"

 

 

0 Kudos