A server can recognize every DIMM, report the expected total capacity, and run the memory at a supported data rate-yet a database or virtual machine may still suffer from inconsistent latency. One possible cause is NUMA locality: the CPUs doing the work and the physical memory holding that work's data are not optimally aligned. This is a topology and workload-placement question, not proof that the DIMMs are defective or that higher-speed modules are required.
Start with evidence, not a purchase order. Check the system's NUMA topology, compare process memory placement with CPU execution placement, examine per-node available capacity and memory policy, and reproduce the problem using an agreed workload metric. Only then decide whether the action belongs in the operating system, hypervisor, firmware configuration, DIMM population plan, or purchasing process.
Quick triage: what must be true before ordering more RAM?
- Confirm a repeatable workload symptom, not just a nonzero NUMA counter.
- Map running CPUs and resident memory pages to the same host and time window.
- Check scheduler, memory policy, virtualization and per-node pressure before changing hardware.
- Request a DIMM population and capacity change only when the measured constraint and OEM configuration support it.
NUMA locality in one practical explanation
NUMA stands for Non-Uniform Memory Access. A processor can typically access some physical memory through a more local path and other memory through a less local path. Local and remote do not label good and bad DIMMs; they describe the relationship between the processor performing an access and the memory that supplies it. A remote access may involve additional interconnect traffic and latency. The actual impact varies with the platform, cache behavior, thread placement and workload.
An access within a node is local; a CPU accessing memory associated with another node follows a remote path. This teaching diagram is not a physical motherboard, socket map or platform-specific performance claim.
A NUMA node is the locality domain exposed to the operating system. A simple dual-socket system may present one node per socket, but that is not a universal rule. Some systems split a socket into multiple NUMA domains through platform-specific modes, while firmware interleaving settings can change what the OS sees. Consequently, "two sockets" does not guarantee "two NUMA nodes," and a node number should never be treated as a fixed DIMM slot number.
Dell's PowerEdge BIOS tuning guidance describes Node Interleaving and its relationship with NUMA-aware operating systems; Red Hat's NUMA documentation explains that workloads sensitive to performance can benefit when their memory is local to the CPUs that use it. These are conditional architectural principles-not a benchmark or a claim about every server. [1][2]
Local versus remote is not the same as channel interleaving
- Memory channel population concerns which DIMM sockets are populated and which controller channels can operate together.
- NUMA topology concerns which processor or logical NUMA domain is close to an allocation.
- DIMM rated speed describes a module specification; effective system speed is a platform configuration decision.
- NUMA node interleaving is a firmware term on certain systems and should not be confused automatically with channel-level interleaving.
An installation can have a correct DIMM count and still show inconvenient NUMA behavior. Conversely, a process can span nodes by design with no measurable business impact. The point of troubleshooting is to distinguish both cases.

When a locality investigation is justified
Look for a pattern rather than treating any cross-node allocation as failure. Examples worth checking include a database whose tail latency increases after a host consolidation, a virtual machine showing CPU scheduling pressure while memory remains plentiful elsewhere in the host, or a multi-process service that becomes less predictable after a topology-related BIOS change. These are investigation triggers only: storage I/O, swapping, network contention, core scheduling, thermal constraints and application locking can create similar symptoms.
| Observation | What it may suggest | What it does not establish |
|---|---|---|
| Total installed RAM matches firmware and OS inventory | Detection is probably not the immediate issue | That the memory is locally available to each workload |
| One NUMA node has little available memory while another has substantial headroom | A placement or per-node capacity constraint | That the total machine needs more DIMMs |
| Workload allocations appear on multiple nodes | A process is using distributed memory | That the distribution is automatically inefficient |
| NUMA counters grow during a workload | The kernel is reporting allocation behavior | The application's measured latency penalty |
| Performance shifts after firmware or VM placement changes | Topology policy deserves comparison | That a specific BIOS toggle will improve performance |
First preserve a baseline
Before changing affinity, BIOS settings, or a memory order, record the host model, installed processors, firmware revision, DIMM inventory by slot and CPU, current memory operating mode, workload version, and the hypervisor/OS version. Capture an agreed service metric-such as application response-time distribution or throughput-along with CPU utilization, memory pressure and storage/network signals. Compare equivalent periods or repeatable test conditions. Otherwise an apparent "NUMA improvement" can just be a different workload.
Step 1: Identify the NUMA topology the operating system actually sees
On a Linux host, the following are read-only inventory commands. Run them with access appropriate to your environment; output and available options vary with distribution and installed packages.
lscpu numactl --hardware cat /sys/devices/system/node/online
lscpu supplies socket, CPU and NUMA information where supported. numactl --hardware displays the available NUMA nodes, the CPUs associated with them, memory totals/free amounts and node distances when provided by the kernel. The online file reports the operating system's online NUMA nodes. Do not assume the same node numbering will survive every hardware or firmware change. The numactl manual documents the --hardware option. [3]
Record the topology as a compact worksheet:
| Field | Evidence to record | Why it matters |
|---|---|---|
| Socket / logical CPU mapping | lscpu and NUMA-node CPU lists | Shows where the workload's threads may run |
| NUMA nodes visible | numactl --hardware | Confirms whether firmware exposes one or several domains |
| Memory size and free memory per node | NUMA hardware summary and numastat -m | Distinguishes aggregate capacity from local headroom |
| Reported NUMA distances | Hardware summary, if present | Helps interpret locality without assuming identical distance scales |
| Firmware NUMA/interleaving setting | Actual platform manual and BIOS inventory | Explains a possible topology difference |
| DIMM population by processor | Platform service manual and slot inventory | Detects a physical asymmetry requiring platform-specific analysis |
If the operating system reports a single NUMA node, stop interpreting per-node remote/local behavior as though it had two nodes. Verify whether the platform is expected to expose multiple nodes and whether virtualization hides physical topology. Do not change BIOS settings merely to force a desired node count.
Step 2: Check per-node memory without misreading the counters
For Linux, numastat is one of the most useful starting tools. Red Hat lists it as a method of showing node-level system and process memory distribution, and the Linux kernel documents what the underlying allocation counters mean. [2][4]
numastat numastat -m numastat -p <PID>
The default numastat report shows per-node kernel allocation counters (normally page counts). numastat -m is a different report: it shows meminfo-like memory categories by node. numastat -p <PID> shows a process's resident memory distribution across nodes, subject to the tool version and process visibility. The latter does not show which CPU threads accessed each page or directly measure remote-access latency. Replace <PID> with a real process ID before running the command. [4][6]
| Read-only observation | What it can show | What it cannot prove alone |
|---|---|---|
| numastat | Kernel allocation events by NUMA node | Application latency or a hardware fault |
| numastat -m | Per-node memory usage categories | The affected process has exhausted local headroom |
| numastat -p <PID> | Resident pages mapped to the specified process by node | Which CPU accessed those pages or how often |
| /proc/<PID>/numa_maps | Mapped pages, per-mapping policies and node counts | An access-frequency profile or end-user performance impact |
Interpretation matters more than the presence of a nonzero value. In the Linux kernel documentation, numa_hit counts successful preferred-node allocations; numa_miss and numa_foreign describe allocations involving other nodes. local_node and other_node reflect whether memory was allocated on a node local to the CPU associated with an allocation. These counters are allocation statistics, not direct hardware latency measurements. Their meanings also depend on memory policies and special cases such as memoryless nodes. [4]
The numa_miss count is incremented on the node where a fallback allocation succeeded; the corresponding numa_foreign count is attributed to the preferred node. other_node is also an allocation counter, not a count of remote reads during the workload. Read the selected node columns and units before comparing values. Memory policies, memoryless nodes and shared pages may complicate interpretation. [4][6]
Avoid calculating a universal "remote-memory percentage" from arbitrary fields and using it as a rejection threshold. Kernel counters may be cumulative from boot, workload phases differ, and counters may capture processes unrelated to the application you are investigating. Instead, record an initial sample, wait through a defined workload interval, record another sample, and review the change alongside process placement, node pressure and application metrics.
What a suspicious pattern looks like
Consider this explicitly illustrative, non-measured scenario: a two-node host reports 128 GiB installed on each node. A particular process uses approximately 110 GiB on Node 1, while an administrator observes that the process's active threads run predominantly on CPUs belonging to Node 0. This mismatch is a reason to investigate CPU and memory placement. It is not proof of a fault: the process may use shared mappings, threads may migrate, NUMA balancing may be active, or the measured period may not be representative.
A better next question is: During the same workload interval, what CPU locations were active, where were the process's memory pages, was Node 0 under pressure, and did the service-level metric deteriorate? A yes/no decision cannot be made from numastat -p alone.
Step 3: Identify whether CPU placement or memory policy explains the mismatch
Memory locality is a two-sided relationship. Measuring memory location without knowing where threads run can lead to a false diagnosis. Check process CPU affinity, application-level pinning, cgroups/cpuset restrictions, container orchestration settings, hypervisor placement and the applicable NUMA memory policy. A pinned CPU set may conflict with memory preferences; conversely, automatic scheduler decisions may be appropriate for an elastic service but suboptimal for a highly latency-sensitive workload.
Useful read-only checks may include:
ps -T -p <PID> -o pid,tid,psr,comm taskset -pc <PID> cat /proc/<PID>/numa_maps cat /proc/sys/kernel/numa_balancing
ps -T samples the process threads and their last observed CPUs; psr is not a continuous CPU residency trace. taskset -pc reports a process affinity mask, not every thread's runtime history. /proc/<PID>/numa_maps summarizes page mappings and effective memory policies; entries such as N0= and N1= are page counts, not NUMA access counts. Interpret large/shared pages and changing mappings with care. The final read reports the global NUMA-balancing setting for this kernel; it does not prove that a particular application is benefiting from automatic balancing. [7][8]
Automatic NUMA balancing is another variable to record. Depending on kernel settings and application policies, the scheduler and memory manager may migrate tasks or memory pages over time. Manual pinning or cpuset limits can interact with that behavior, and a snapshot after migration may not represent initial allocation. Compare samples within the same workload phase; do not toggle automatic balancing just to make counters look better. [8]
Do not apply numactl --membind, CPU pinning, or changes to kernel NUMA balancing on a production database based on a blog recipe. Binding to one node can worsen out-of-memory behavior or increase contention even when the host has unused RAM on another node. Experiment in an approved change window with rollback and workload-specific validation. The Red Hat performance guides distinguish observation tools from configuration tools, and the numactl manual documents policy behavior. [2][3]
Step 4: Separate host NUMA from guest NUMA in virtualized environments
For a VM, there are at least two placement layers: where physical host CPUs and memory reside, and what the guest OS is shown as virtual CPUs and virtual NUMA nodes. A guest's NUMA view is not necessarily a literal map of DIMM slots or physical sockets. The correct level to examine depends on the hypervisor and management policy.
Treat guest-locality measurements and host-locality measurements as different coordinate systems. A guest node number does not necessarily identify a host NUMA node, and guest-side numastat alone cannot establish where the hypervisor placed the VM's backing pages. Correlate guest observations with the host or hypervisor's supported placement evidence before suggesting an affinity change. [5]
A virtual machine can have enough assigned RAM yet still experience performance inconsistency if vCPU placement, memory backing and host-node pressure change. Review host NUMA configuration, VM size relative to available per-node resources, processor oversubscription, migration settings, memory overcommit/ballooning policies and workload-specific metrics. Red Hat's virtualization guidance includes process-level numastat observations for qemu-kvm and notes that VM memory distributed across multiple host NUMA nodes may warrant review in context. [5]
A simple four-part evidence collection avoids premature hardware orders:
- Capture the host's physical NUMA node CPU lists and per-node memory totals.
- Capture the hypervisor's host/guest topology and placement settings using supported management tools.
- Capture the affected VM/process memory distribution during the incident window.
- Compare application performance and host pressure before deciding whether a VM placement change or capacity change is appropriate.
Do not assume that placing every large VM on a single node is possible or desirable. Some VMs intentionally span nodes; the appropriate configuration depends on topology, resource contention and the hypervisor's supported policy.
Step 5: Understand firmware options before changing them
Many enterprise systems expose settings described as Node Interleaving, NUMA Nodes Per Socket, NPS, Sub-NUMA Clustering or other vendor-specific options. The names and interactions differ across CPU generations, OEMs and firmware revisions. It is unsafe to prescribe one universal setting for every server.
For example, Dell's PowerEdge 16G BIOS tuning guidance says that disabling Node Interleaving lets a NUMA-aware OS detect locality, while enabling it offers a more interleaved view for operating systems that are not NUMA-aware. That is Dell's documented guidance for its covered configurations, not a universal performance guarantee. Dell also documents workload profiles that combine several processor and memory settings. [1]
Do not toggle a NUMA-related BIOS feature as an isolated experiment without checking: (a) the exact server/CPU guide, (b) whether the OS/hypervisor expects the topology, (c) firmware version, (d) the maintenance and rollback plan, and (e) whether other settings change as a side effect. A topology change can affect VM placement assumptions and resource management. Record before-and-after screenshots or exports of the relevant settings.
Step 6: Reconcile the physical DIMM population with NUMA capacity
If topology investigation reveals materially different memory capacity available to different CPU domains, the slot inventory becomes relevant. On a multi-socket platform, memory channels and slots may be owned by specific processors. The correct population order and supported balancing rules are specific to the installed server, processor and DIMM architecture. Merely knowing that the system has 256 GiB installed is insufficient.
Ask the maintenance or procurement team for a DIMM table listing CPU/socket, channel/slot identifier from the OEM manual, present capacity, DDR generation, module architecture, part number, speed and any applicable rank restrictions. Compare it with the OEM's memory population instructions. Confirm whether a server has disabled slots, unsupported placement, an active memory protection mode or another reason for unequal node memory. Do not infer slot ownership from generic photographs.
When reconciling slots and processor-owned memory channels, use our server memory compatibility checklist as a pre-order evidence worksheet. It helps organize the platform, CPU, DIMM type, rank, speed and population checks; it does not replace the exact OEM memory population instructions.
If the replacement DIMM architecture is uncertain, our RDIMM, LRDIMM and ECC UDIMM comparison explains why registered, load-reduced and unbuffered modules are not interchangeable. Neither article demonstrates that buying different DIMMs will correct NUMA locality; verify the actual topology and supported configuration first.
Step 7: Decide whether adding RAM is actually the right intervention
To avoid confusing system-wide free capacity with a particular node's available headroom, build a before/after placement and capacity table. Below is a hypothetical calculation for teaching only; it is not a customer project, benchmark or validation result.
Assume a host has two exposed NUMA nodes with 128 GiB of usable host memory per node. During the critical workload interval, Node 0 has only 12 GiB available while Node 1 has 70 GiB available. An upcoming workload requires an additional 28 GiB of working-set headroom close to CPUs on Node 0. Adding 12 and 70 gives 82 GiB available in aggregate, but that does not mean 28 GiB can necessarily be supplied locally to the workload without considering placement, policy and the platform's supported behavior.
| Question | What the hypothetical numbers say | Required follow-up |
|---|---|---|
| Is there enough free memory somewhere on the host? | 82 GiB aggregate | Check whether pressure is localized or distributed |
| Is Node 0's 12 GiB headroom enough for 28 GiB extra local demand? | Not under that simplified assumption | Review moving work, policy, and actual working-set behavior |
| Would more DIMMs automatically solve locality? | No conclusion | Verify CPU/channel population, OS policy and node mapping |
| Is the proposed capacity increase supported? | Unknown | Confirm exact server, CPU, rank, DIMM architecture and OEM population rules |
A useful decision separates four cases:
- Placement issue: capacity exists but task or VM affinity appears unfavorable. Review software scheduling or host topology before purchasing.
- Local node pressure: one node is constrained during peak demand. Review resource placement, VM sizing and platform-appropriate population changes.
- Total capacity shortage: the workload genuinely exhausts useful machine-wide capacity under approved limits. Prepare a memory capacity and compatibility plan.
- Unresolved cause: evidence does not isolate NUMA, or performance changes with I/O and CPU contention. Continue diagnosis instead of attributing the problem to memory.
Purchase decision checkpoint: Local-node pressure is not itself proof that additional DIMMs are the only fix. Document whether a reversible placement or scheduling review was possible, whether the working set still exceeds the capacity available to the approved CPU/domain under representative load, and whether the OEM's supported slot and channel rules allow the proposed change. If any answer is unknown, request further platform evidence rather than describing the order as a verified NUMA fix.
A business case for memory expansion should include observed peak working set, growth assumptions explicitly labeled as forecasts, available slots/channel population, supported capacity limits, post-change validation and rollback criteria. It should not rely on a generic claim that more RAM produces a particular percentage of speed improvement. When hardware expansion is justified, use our server memory upgrade specification guide to document the current inventory, proposed capacity, compatible DIMM architecture and purchasing requirements. Keep the NUMA measurements with the request; do not represent a hardware purchase as a proven locality fix before validation.
A decision worksheet for operations and procurement
| Gate | Evidence required | Possible decision |
|---|---|---|
| 1. Problem definition | Workload metric, incident time and competing bottleneck checks | Continue diagnosis if symptom unconfirmed |
| 2. Topology inventory | Sockets, visible NUMA nodes, CPU lists, node memory totals | Correct misunderstanding of the topology |
| 3. Runtime placement | Process/VM page distribution, CPU execution, memory policy | Propose controlled placement trial |
| 4. Platform population | Exact OEM manual, current slot/CPU matrix | Request hardware configuration review |
| 5. Procurement trigger | Demonstrated per-node or total capacity shortfall after software review | Produce compatible BOM / RFQ |
| 6. Acceptance | Same workload metric before/after, error logs, capacity and topology | Approve, revert or escalate |
For a purchase request, include the exact hardware inventory, target node/CPU capacity objective, operating mode, accepted DIMM architecture, quantity and required post-installation checks. Send the verified evidence with the request through the site's contact and RFQ channel. A supplier can help quote specified modules, but approval of CPU/NUMA topology and performance claims rests on the actual platform documentation and measured workload. This contact address also requires a live URL check before production deployment.
A controlled comparison that can distinguish locality from other bottlenecks
A useful NUMA investigation should test one hypothesis at a time rather than changing affinity, memory size, firmware and VM scheduling together. Before any trial, define the workload that matters-same request mix, data size, concurrency and collection interval. Document what a successful outcome would look like, such as a reproducible improvement in the affected application metric without increased memory pressure, higher error rates or slower unaffected workloads. Do not select a universal performance threshold from an unrelated platform.
For an approved nonproduction or maintenance-window trial, consider this sequence:
- Baseline: Capture the application metric, thread or VM placement, per-node free memory, process NUMA distribution, page faults, system pressure and relevant logs under the original supported configuration. Keep the raw timestamped output.
- Single planned variable: If evidence points to CPU/memory placement, make one reversible placement adjustment using the workload owner's supported tools. Do not simultaneously swap DIMMs or modify node-interleaving firmware. Make a rollback record before the change.
- Repeat: Run an equivalent workload for a comparable interval. Record whether the same code path, host load and data set were used. If the workload has a cache warm-up phase, assess like-for-like phases rather than comparing a cold start with a warm application.
- Guardrail: Check for regressions on other processes, higher local-node pressure, memory-allocation failures, out-of-memory events or VM scheduling disruption. A gain for one process does not justify a host-wide regression.
- Decision: If locality indicators and application metrics improve consistently, document the supported configuration and change owner. If the indicators change but the application does not, do not claim a measured benefit. If results conflict, revert and investigate another bottleneck.
| Comparison item | Baseline record | Post-change record | Acceptance rule |
|---|---|---|---|
| Workload definition | Version, load and interval | Same or explicitly comparable | Reject mismatched test conditions |
| NUMA topology | Nodes and CPU maps | Maps after change | Explain unexpected topology changes |
| Placement evidence | Process pages and CPU location | Same commands and timestamps | Compare trend, not a single cumulative counter |
| Application service metric | Actual observed value and variability | Actual observed value and variability | Use agreed workload-specific success condition |
| Safety and regression | Memory pressure, errors, other services | Same protections and checks | Revert if guardrails fail |
This protocol supplies a falsifiable decision rather than a promise that a specific tuning option will help. It also protects buyers from ordering an additional memory batch when the evidence instead points to a software scheduling or capacity-distribution problem.
Post-change validation: measure the thing you intended to improve
After an approved OS, hypervisor, BIOS or memory-population change, repeat the original workload and review the same measurements. Check for changed NUMA node count, CPU-to-node mapping, page placement trends, memory pressure, paging, error logs and the original service-level metric. If a change appears to help only in an idle test, it has not yet established its value under production-like load.
A defensible handover records: configuration revision, precise change made, command output timestamps, baseline and new application metrics, any unexpected regression, and a rollback owner. Where a new memory purchase was involved, reconcile delivered P/N, quantity, installed slots and post-install BIOS inventory with the approved BOM. Do not present a successful boot or a passing memory test as evidence of reduced remote-memory latency; those are different validation jobs.
Frequently asked questions
Does high remote NUMA memory usage mean a DIMM is defective?
No. Remote allocation is a locality relationship between the accessing CPUs and memory, not an ECC failure or failed-module indicator. Diagnose application placement and node pressure; investigate a physical DIMM only when error logs, inventory or platform diagnostics provide relevant evidence.
Is a dual-socket server always a two-NUMA-node server?
No. Firmware and processor topology options may expose more than one NUMA domain per socket or change the topology shown to the OS. Use the actual system inventory and platform documentation rather than inferring node count from socket count.
Should I always turn off Node Interleaving?
There is no universal one-line answer. Dell documents configurations in which NUMA-aware operating systems benefit from visibility into the topology, but the correct setting depends on the supported platform, OS, workload and other BIOS settings. Review the exact OEM guidance before changing it.
Can numastat prove my application's latency is caused by remote memory?
No. It reports allocation and placement information, not an application-level causal benchmark. Collect CPU placement, per-node pressure and application latency under the same workload interval; use an approved controlled comparison if a change is warranted.
Can I fix NUMA locality simply by buying higher-speed RDIMMs?
Not reliably. Higher rated memory speed and local-versus-remote access are different dimensions. First check the CPU-memory topology, process/VM placement and supported DIMM layout. Any later purchase still needs exact platform compatibility approval.
How much memory should I install per CPU?
There is no safe universal figure. Base the plan on workload capacity, redundancy modes, the OEM's slot/channel population rules, CPU support and measured node-level headroom. Record the required capacity for each supported NUMA domain and obtain platform-specific approval before ordering.
