Add iptsp-cpuio.md
This is the initail analysis for troubleshoots
This commit is contained in:
298
iptsp-cpuio.md
Normal file
298
iptsp-cpuio.md
Normal file
@@ -0,0 +1,298 @@
|
|||||||
|
# IPTSP Troubleshooting Guide
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Problem Overview
|
||||||
|
|
||||||
|
### CPU Steal
|
||||||
|
|
||||||
|
* Occurs when the **guest VM wants CPU time but the hypervisor does not schedule it**
|
||||||
|
* Indicates contention **outside the VM**
|
||||||
|
* **Root Cause Domain:** Host-level CPU scheduling
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### CPU I/O Wait
|
||||||
|
|
||||||
|
* Occurs when the **guest is blocked waiting for disk I/O**
|
||||||
|
* Typically caused by:
|
||||||
|
|
||||||
|
* Storage latency
|
||||||
|
* Backend storage bottlenecks
|
||||||
|
* **Root Cause Domain:** Storage subsystem
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Likely Root Causes
|
||||||
|
|
||||||
|
* CPU scheduling inefficiency
|
||||||
|
* Storage / I/O latency issues
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Deep Analysis
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. CPU Steal Analysis
|
||||||
|
|
||||||
|
### Key Concept: Emulator Threads
|
||||||
|
|
||||||
|
Even with CPU pinning:
|
||||||
|
|
||||||
|
* Each **vCPU = 1 thread**
|
||||||
|
* Controlled via:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
hw:cpu_policy=dedicated
|
||||||
|
```
|
||||||
|
|
||||||
|
These threads handle guest workload.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Hidden Workload: Emulator Threads
|
||||||
|
|
||||||
|
QEMU introduces additional threads responsible for:
|
||||||
|
|
||||||
|
* Device emulation (disk, NIC)
|
||||||
|
* I/O handling
|
||||||
|
* VM exits (hypercalls, interrupts)
|
||||||
|
* Internal QEMU operations
|
||||||
|
|
||||||
|
These **exist even when VM is idle**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Critical Problem
|
||||||
|
|
||||||
|
* Emulator threads are **NOT automatically pinned**
|
||||||
|
* They are scheduled by **default Linux scheduler**
|
||||||
|
* Can run on **any CPU**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Identify Threads
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ps -eLo pid,tid,psr,comm | grep qemu
|
||||||
|
```
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```
|
||||||
|
1234 1235 2 qemu-system-x86 ← vCPU thread
|
||||||
|
1234 1236 3 qemu-system-x86 ← vCPU thread
|
||||||
|
1234 1237 2 qemu-system-x86 ← emulator thread (!!)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Proper CPU Segregation
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[compute]
|
||||||
|
cpu_dedicated_set = 2-9
|
||||||
|
cpu_shared_set = 0-1
|
||||||
|
```
|
||||||
|
|
||||||
|
* `cpu_dedicated_set` → VM vCPUs
|
||||||
|
* `cpu_shared_set` → Emulator threads, host processes, kernel
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Important Limitation
|
||||||
|
|
||||||
|
> CPU pinning **only isolates vCPU execution**, NOT the full VM execution path
|
||||||
|
|
||||||
|
Still shared:
|
||||||
|
|
||||||
|
* Emulator threads
|
||||||
|
* Interrupts
|
||||||
|
* Kernel scheduling
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Interrupt & Host Noise Issues
|
||||||
|
|
||||||
|
Even with no other VMs, host can interfere:
|
||||||
|
|
||||||
|
### Sources of Noise
|
||||||
|
|
||||||
|
* `ksoftirqd`
|
||||||
|
* `irqbalance`
|
||||||
|
* `ovs-vswitchd`
|
||||||
|
* `ceph-osd`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Mitigation
|
||||||
|
|
||||||
|
#### Kernel Isolation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
isolcpus=
|
||||||
|
nohz_full=
|
||||||
|
rcu_nocbs=
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Interrupt Check
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat /proc/interrupts
|
||||||
|
```
|
||||||
|
|
||||||
|
If interrupts hit pinned CPUs → **BAD**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Fix Strategy
|
||||||
|
|
||||||
|
* Manually tune IRQ affinity
|
||||||
|
* Or disable `irqbalance`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Hyper-Threading (SMT) Consideration
|
||||||
|
|
||||||
|
* Avoid pinning **single threads**
|
||||||
|
* Always pin **full core pairs (siblings)**
|
||||||
|
|
||||||
|
OR
|
||||||
|
|
||||||
|
* Disable HT for critical workloads
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. NUMA Alignment
|
||||||
|
|
||||||
|
Ensure VM stays within a single NUMA node:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
hw:numa_nodes=1
|
||||||
|
hw:cpu_policy=dedicated
|
||||||
|
hw:mem_page_size=large
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# I/O Wait Analysis
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## VM-Level Checks
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iostat -x 1
|
||||||
|
mpstat -P ALL 1
|
||||||
|
top / htop
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Host-Level Checks
|
||||||
|
|
||||||
|
```bash
|
||||||
|
virsh domblkstat <vm>
|
||||||
|
virsh dumpxml <vm> | grep numa
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Expected Healthy Output (mpstat)
|
||||||
|
|
||||||
|
* `steal ≈ 0`
|
||||||
|
* `iowait ≈ 0`
|
||||||
|
* High idle %
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```
|
||||||
|
%steal → 0.00
|
||||||
|
%iowait → 0.00
|
||||||
|
%idle → ~99%
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Advanced Debugging (eBPF / perf)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CPU Scheduling Analysis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
runqlat
|
||||||
|
runqslower
|
||||||
|
perf sched record
|
||||||
|
perf sched latency
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Storage Latency Analysis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
biolatency
|
||||||
|
biosnoop
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Troubleshooting Workflow
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Step 1 — Validate CPU Pinning
|
||||||
|
|
||||||
|
* Check vCPU pinning
|
||||||
|
* Verify emulator thread placement
|
||||||
|
* Ensure NUMA alignment
|
||||||
|
* Validate HT sibling usage
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Step 2 — Analyze Host CPU Noise
|
||||||
|
|
||||||
|
* `mpstat` per core
|
||||||
|
* Interrupt distribution
|
||||||
|
* Background system processes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Step 3 — Validate Storage Performance
|
||||||
|
|
||||||
|
* `iostat` (VM + host)
|
||||||
|
* Backend metrics (e.g., Ceph)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Step 4 — Use eBPF Tools
|
||||||
|
|
||||||
|
* `runqlat` → CPU bottleneck
|
||||||
|
* `biolatency` → Storage bottleneck
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Step 5 — Correlate Metrics
|
||||||
|
|
||||||
|
Match spikes across:
|
||||||
|
|
||||||
|
* CPU steal
|
||||||
|
* I/O wait
|
||||||
|
* Host load
|
||||||
|
|
||||||
|
Time correlation is key to identifying root cause
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Key Takeaways
|
||||||
|
|
||||||
|
* CPU pinning ≠ full isolation
|
||||||
|
* Emulator threads are often the hidden bottleneck
|
||||||
|
* Interrupts can silently break isolation
|
||||||
|
* NUMA + HT alignment is critical
|
||||||
|
* Always correlate CPU + storage metrics
|
||||||
|
---
|
||||||
Reference in New Issue
Block a user