Network Management

Cisco Catalyst 9000 Series Switches Reporting Incorrect Memory Utilization in SolarWinds NPM

SolarWinds NPM reports significantly lower memory utilization on Cisco Catalyst 9000 series switches than what the switch reports locally via the CLI command show processes memory platform sorted. This occurs because the N.Memory.SNMP.CiscoAsr poller is assigned to Catalyst 9000 devices, which queries the IOS virtual process memory pool via CISCO-MEMORY-POOL-MIB instead of the full physical platform DRAM. This article covers how to identify affected nodes, validate the correct replacement poller via Poller Checker, and apply the fix in bulk via SSMS.

First published date

7/29/2026 12:04 AM

Last published date

7/29/2026 5:46 PM

Overview

Symptoms

  • SolarWinds NPM reports memory utilization significantly lower than the physical DRAM installed in the switch

  • The Cisco CLI command show processes memory platform sorted reports total platform DRAM significantly higher than what SolarWinds displays for the same device

  • The discrepancy is consistent across all polling cycles — it is not intermittent or stale data

  • Issue affects Cisco Catalyst 9000 series switches (9200, 9300, 9400, 9500, 9600, 9800 WLC) running CAT9K_IOSXE

Product section

Network Performance Monitor

Cause

The N.Memory.SNMP.CiscoAsr poller is assigned to Cisco Catalyst 9000 devices. This poller queries ciscoMemoryPoolUsed and ciscoMemoryPoolFree from CISCO-MEMORY-POOL-MIB (OID .1.3.6.1.4.1.9.9.48).

On Cisco Catalyst 9000 series switches running CAT9K_IOSXE, this MIB returns only the IOS virtual process memory pool — not the full physical platform DRAM installed in the switch.

The CLI command show processes memory platform sorted reflects Linux kernel-level platform memory, which includes all processes running on the underlying IOS-XE OS. These two values measure fundamentally different memory domains and are not directly comparable.

SolarWinds is reporting accurately for the poller assigned. The discrepancy is caused by the wrong poller type being used for this platform. N.Memory.SNMP.CiscoAsr is designed for Cisco ASR routers.

Note: There is currently no native out-of-the-box SolarWinds memory poller that maps directly to the IOS-XE Linux kernel platform memory view from show processes memory platform sorted. This is an open feature request submitted to SolarWinds Product Management.

Resolution

Step 1 — Identify Affected Nodes

Run the following query in SSMS against SolarWindsOrion to identify all nodes that have N.Memory.SNMP.CiscoAsr assigned and are not Cisco ASR routers or VG450 gateways:

-- Scripts are not supported under any SolarWinds support program or service.
-- Scripts are provided AS IS without warranty of any kind. SolarWinds further
-- disclaims all warranties including, without limitation, any implied warranties
-- of merchantability or of fitness for a particular purpose. The risk arising
-- out of the use or performance of the scripts and documentation stays with you.
-- In no event shall SolarWinds or anyone else involved in the creation,
-- production, or delivery of the scripts be liable for any damages whatsoever
-- (including, without limitation, damages for loss of business profits, business
-- interruption, loss of business information, or other pecuniary loss) arising
-- out of the use of or inability to use the scripts or documentation.

SELECT n.NodeID, n.Caption, n.IP_Address, n.MachineType, n.IOSVersion, n.EngineID, p.PollerType, p.Enabled FROM Pollers p INNER JOIN NodesData n ON p.NetObjectID = n.NodeID WHERE p.PollerType = 'N.Memory.SNMP.CiscoAsr' AND p.NetObjectType = 'N' AND p.Enabled = 1 AND n.MachineType NOT LIKE '%ASR%' AND n.MachineType NOT LIKE '%VG450%' ORDER BY n.MachineType, n.Caption

Step 2 — Validate Correct Replacement Poller via Poller Checker

Before applying any bulk changes, validate the correct replacement poller on one representative node per device group via Poller Checker.

  • RDP to the polling engine assigned to the test node

  • Navigate to [InstallPath]\SolarWinds.PollerChecker.Gui.exe and run it as Administrator

    • Note: Verify the actual installation path from SolarWindsInstallation.csv in the SWDiagnostics bundle. Do not assume the default path.

  • Set Polling Method to SNMP and Test on to Nodes

  • Search for the sample node by IP address

  • Select Memory in the middle pane and click Detect Pollers

  • Review the results:

    • Dark green = supported and currently assigned

    • Light green = supported, not yet assigned

    • Red = not supported on this device

  • Right-click each light green memory poller and select Poll Now

  • Note the Total Memory value returned

The target poller is the one that returns a Total Memory value closest to the physical DRAM installed in the switch.

The following replacement pollers are applicable based on device type. Validate via Poller Checker on a representative node before applying to any group:

  • Cisco Catalyst 9000 series (IOS-XE) — N.Memory.SNMP.CiscoGen4 has been confirmed as a supported poller on Catalyst 94010R (IOS-XE 17.3.4) in tested environments. Validate via Poller Checker on a representative node from your environment before applying to other Catalyst 9000 models.

  • Cisco Nexus (NX-OS) — N.Memory.SNMP.CiscoGen4 per official poller documentation

  • Cisco Catalyst 4000/3000 series (IOS) — N.Memory.SNMP.CiscoGen3. Validate via Poller Checker on a representative node before applying in bulk.

  • Firepower / ASA — N.Memory.SNMP.HrStorage. Validate via Poller Checker on a representative node before applying in bulk.

  • Cisco ASR routers — no change required; N.Memory.SNMP.CiscoAsr is correct for this platform

  • Cisco VG450 gateways — no change required; N.Memory.SNMP.CiscoAsr is correct for this platform


Step 3 — Apply Fix on a Single Node First

After Poller Checker confirms the correct replacement poller on the test node, apply the fix on that single node before proceeding to bulk:

  • In the SolarWinds web console, navigate to the node details page of the test node

  • Click List Resources

  • Under CPU & Memory, uncheck N.Memory.SNMP.CiscoAsr

  • Confirm the replacement poller is checked

  • Click Submit

  • Return to the node details page and click Poll Now

  • Verify the Total Memory value now reflects the physical DRAM of the switch

Note: If both N.Memory.SNMP.CiscoAsr and the replacement poller are enabled simultaneously, memory values will be unstable — both pollers write to the same database columns and whichever writes last determines the displayed value. Ensure N.Memory.SNMP.CiscoAsr is removed before polling resumes.


Step 4 — Apply Bulk Fix via SSMS (After Single-Node Confirmation)

Take a full backup of the SolarWindsOrion database before running any bulk SQL.

The bulk fix requires two operations per node group:

  • DELETE the existing N.Memory.SNMP.CiscoAsr row from the Pollers table

  • INSERT a new row for the correct replacement poller

An UPDATE is not sufficient — the replacement poller rows do not exist in the Pollers table for affected nodes and must be inserted.

Run each group in its own transaction block in SSMS. Verify the row count output after each DELETE and INSERT before proceeding to the next group. A post-check query and rollback block should be included in the script.

The bulk script must be executed from SSMS directly on the SQL Server — not via SolarWinds Database Manager. Database Manager does not support transaction rollback properly and may time out on large operations.

Use the following template SQL script. Validate the MachineType filter patterns against your environment using the Step 1 query before running.

-- Scripts are not supported under any SolarWinds support program or service.
-- Scripts are provided AS IS without warranty of any kind. SolarWinds further
-- disclaims all warranties including, without limitation, any implied warranties
-- of merchantability or of fitness for a particular purpose. The risk arising
-- out of the use or performance of the scripts and documentation stays with you.
-- In no event shall SolarWinds or anyone else involved in the creation,
-- production, or delivery of the scripts be liable for any damages whatsoever
-- (including, without limitation, damages for loss of business profits, business
-- interruption, loss of business information, or other pecuniary loss) arising
-- out of the use of or inability to use the scripts or documentation.

-- ============================================================ -- PRE-CHECK: Count all CiscoAsr rows on non-ASR/VG450 nodes -- ============================================================ SELECT n.MachineType, COUNT(*) AS [CiscoAsr Row Count] FROM Pollers p INNER JOIN NodesData n ON p.NetObjectID = n.NodeID WHERE p.PollerType = 'N.Memory.SNMP.CiscoAsr' AND p.NetObjectType = 'N' AND p.Enabled = 1 AND n.MachineType NOT LIKE '%ASR%' AND n.MachineType NOT LIKE '%VG450%' GROUP BY n.MachineType ORDER BY n.MachineType; -- ============================================================ -- GROUP A: Catalyst 9000 series (IOS-XE) -- DELETE CiscoAsr, INSERT CiscoGen4 -- ============================================================ BEGIN TRANSACTION; DELETE p FROM Pollers p INNER JOIN NodesData n ON p.NetObjectID = n.NodeID WHERE p.PollerType = 'N.Memory.SNMP.CiscoAsr' AND p.NetObjectType = 'N' AND n.MachineType LIKE '%Catalyst 9%'; -- Verify: expected row count matches Group A node count from Pre-Check -- If row count is unexpected, run ROLLBACK before proceeding PRINT 'Group A DELETE row count: ' + CAST(@@ROWCOUNT AS VARCHAR); INSERT INTO Pollers (NetObject, NetObjectType, NetObjectID, PollerType, Enabled) SELECT p.NetObject, p.NetObjectType, p.NetObjectID, 'N.Memory.SNMP.CiscoGen4', 1 FROM Pollers p INNER JOIN NodesData n ON p.NetObjectID = n.NodeID WHERE p.PollerType = 'N.Memory.SNMP.CiscoAsr' AND p.NetObjectType = 'N' AND n.MachineType LIKE '%Catalyst 9%'; -- Note: The INSERT above selects from the already-deleted rows if run in the -- same transaction. If 0 rows are inserted, verify the DELETE committed first -- by running each statement separately. PRINT 'Group A INSERT row count: ' + CAST(@@ROWCOUNT AS VARCHAR); COMMIT; -- ============================================================ -- GROUP B: Legacy Catalyst 4000/3000 series (IOS) -- DELETE CiscoAsr, INSERT CiscoGen3 -- ============================================================ BEGIN TRANSACTION; DELETE p FROM Pollers p INNER JOIN NodesData n ON p.NetObjectID = n.NodeID WHERE p.PollerType = 'N.Memory.SNMP.CiscoAsr' AND p.NetObjectType = 'N' AND (n.MachineType LIKE '%Catalyst 4%' OR n.MachineType LIKE '%Catalyst 3%'); PRINT 'Group B DELETE row count: ' + CAST(@@ROWCOUNT AS VARCHAR); INSERT INTO Pollers (NetObject, NetObjectType, NetObjectID, PollerType, Enabled) SELECT p.NetObject, p.NetObjectType, p.NetObjectID, 'N.Memory.SNMP.CiscoGen3', 1 FROM Pollers p INNER JOIN NodesData n ON p.NetObjectID = n.NodeID WHERE p.PollerType = 'N.Memory.SNMP.CiscoAsr' AND p.NetObjectType = 'N' AND (n.MachineType LIKE '%Catalyst 4%' OR n.MachineType LIKE '%Catalyst 3%'); PRINT 'Group B INSERT row count: ' + CAST(@@ROWCOUNT AS VARCHAR); COMMIT; -- ============================================================ -- GROUP C: Nexus (NX-OS), Firepower, ASA -- DELETE CiscoAsr, INSERT HrStorage -- ============================================================ BEGIN TRANSACTION; DELETE p FROM Pollers p INNER JOIN NodesData n ON p.NetObjectID = n.NodeID WHERE p.PollerType = 'N.Memory.SNMP.CiscoAsr' AND p.NetObjectType = 'N' AND (n.MachineType LIKE '%Nexus%' OR n.MachineType LIKE '%Firepower%' OR n.MachineType LIKE '%ASA%'); PRINT 'Group C DELETE row count: ' + CAST(@@ROWCOUNT AS VARCHAR); INSERT INTO Pollers (NetObject, NetObjectType, NetObjectID, PollerType, Enabled) SELECT p.NetObject, p.NetObjectType, p.NetObjectID, 'N.Memory.SNMP.HrStorage', 1 FROM Pollers p INNER JOIN NodesData n ON p.NetObjectID = n.NodeID WHERE p.PollerType = 'N.Memory.SNMP.CiscoAsr' AND p.NetObjectType = 'N' AND (n.MachineType LIKE '%Nexus%' OR n.MachineType LIKE '%Firepower%' OR n.MachineType LIKE '%ASA%'); PRINT 'Group C INSERT row count: ' + CAST(@@ROWCOUNT AS VARCHAR); COMMIT; -- ============================================================ -- POST-CHECK: Confirm zero CiscoAsr rows remain on affected nodes -- ============================================================ SELECT COUNT(*) AS [Remaining CiscoAsr Rows] FROM Pollers p INNER JOIN NodesData n ON p.NetObjectID = n.NodeID WHERE p.PollerType = 'N.Memory.SNMP.CiscoAsr' AND p.NetObjectType = 'N' AND n.MachineType NOT LIKE '%ASR%' AND n.MachineType NOT LIKE '%VG450%'; -- Expected result: 0 -- ============================================================ -- ROLLBACK (commented out — uncomment only if recovery needed) -- ============================================================ -- If any group produced an unexpected row count, rollback that -- group's transaction before it is committed: -- ROLLBACK; -- -- To re-insert CiscoAsr rows after a rollback, run: -- INSERT INTO Pollers (NetObject, NetObjectType, NetObjectID, PollerType, Enabled) -- SELECT NetObject, NetObjectType, NetObjectID, 'N.Memory.SNMP.CiscoAsr', 1 -- FROM Pollers -- WHERE NetObjectID IN (<comma-separated NodeIDs>) -- AND NetObjectType = 'N';

Important notes:

  • Validate the MachineType LIKE filter patterns against your environment using the Step 1 query before running. MachineType values vary by environment — adjust patterns to match exactly what your environment returns.

  • ASR routers and VG450 gateways are excluded by the WHERE clause. Do not add them to any group.

  • Each INSERT sets Enabled = 1. Do not change this value.

  • Run each group one at a time. Do not run all groups in a single execution without verifying row counts between groups.

After the bulk script completes, spot-check 2–3 nodes per group in the web console via Poll Now to confirm memory values are now reporting correctly.


Notes and Limitations

  • The N.Memory.SNMP.CiscoAsr poller is the correct poller for Cisco ASR routers. Do not remove it from ASR nodes.

  • The N.Memory.SNMP.CiscoAsr poller is the correct poller for Cisco VG450 Analog Voice Gateways running IOS. Do not remove it from VG450 nodes.

  • SolarWinds does not currently have a native out-of-the-box poller that returns the same memory value as show processes memory platform sorted on Cisco Catalyst 9000 IOS-XE devices. This has been submitted to SolarWinds Product Management as a feature request for a future release.

  • The List Resources page in the SolarWinds web console only allows poller changes one node at a time. Bulk poller reassignment across multiple nodes is not supported via the GUI and requires SSMS SQL or OrionSDK PowerShell.

  • The Poller Checker tool uses the SolarWinds polling engine SNMP stack, not the Windows SNMP Service — it works correctly even on polling engines where the Windows SNMP GUI tools (e.g., SnmpWalk) fail due to FIPS mode.