Commit cfb3ce71 authored by JooHan Hong's avatar JooHan Hong

prometheus cpu steal 1차완료

parent 20616560
Pipeline #5317 passed with stages
in 49 seconds
......@@ -8,7 +8,7 @@
| NO | ITEM | 바로가기 | 비고 |
| ------ | ------ | ------ | ------ |
| 1 | Node-Exporter **Down** | [GO](./RESULT/DOWN/) | |
| 2 | Node CPU **Steal** | [GO](./RESULT/STEAL/) | |
| 2 | Node CPU **Steal** Noisy Neighbor | [GO](./RESULT/STEAL/) | |
| 3 | Node **HIGH CPU** Load | [GO](./RESULT/CPULOAD/) | |
| 4 | Node CPU Context Switching **Heavy** | [GO](./RESULT/CONTEXTSWITCHING/) | |
| 5 | Node **High** Load Average(15 minute) | [GO](./RESULT/LOADAVERAGE/) | |
......
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# Node CPU Steal Noisy Neighbor Issue 검증
> CPU Steal 값은 하이퍼바이저가 다른 가상 프로세서를 서비스하는 동안 가상(V-core) CPU가 실제(P-core) CPU를 `간섭하는` 시간을 백분율로 표시한 값이다. 가상 환경에서 동작하는 irtual Machine은 물리 호스트에 있는 다른 인스턴스와 리소스를 공유하는데, CPU Steal Time을 통해 Virtual Machine에서 동작하는 CPU가 **호스트로부터 자원을 할당받기 위해 얼마나 대기하고 있는지** 알 수 있다.
# Configuration
5분 동안 CPU Steal 값이 `10% 이상`인 경우가 감지된 경우 Alert을 발생시키는 Rule
- **결과**
![cpu_steal](../../images/cpu_steal.png)
- **검증 과정**
* [ **STEP 1** ] : Prometheus의 Graph 메뉴의 Expression에서 수식에 대한 검증을 진행한다.
![cpu_steal_verify](../../images/cpu_steal_verify.png)
> 대상 Node에 현재의 CPU Steal 값이 쿼리 된다.
* [ **STEP 2** ] : Prometheus Configmap 파일에 ITEM을 추가한다.
```bash
# cat prometheus-config-map.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-server-conf
labels:
name: prometheus-server-conf
namespace: monitoring
data:
prometheus.rules: |-
groups:
- name: Node CPU steal Noisy Neighbor
rules:
- alert: HostCpuStealNoisyNeighbor
expr: avg by(instance) (rate(node_cpu_seconds_total{mode="steal"}[5m])) * 100 > 10
for: 0m
labels:
severity: warning
annotations:
summary: "Host CPU steal noisy neighbor (instance {{ $labels.instance }})"
description: "CPU steal is > 10%. A noisy neighbor is killing VM performances or a spot instance may be out of credit.\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
...하략
```
* [ **STEP 3** ] : kubectl 툴을 이용하여 Replace 처리하고, curl을 이용하여 POST **reload** Payload를 전송한다.
```bash
# kubectl replace -f prometheus-config-map.yaml
# curl -X POST http://172.24.0.222:30003/-/reload
```
> 또는 prometheus를 재시작하면 즉시 적용된다.
# Verify
* [ **STEP 1** ] : 검증을 위해 10% 기준으로 `0`%로 변경한다.
```python
expr: avg by(instance) (rate(node_cpu_seconds_total{mode="steal"}[5m])) * 100 > 0
```
* [ **STEP 2** ] : Alert Manager를 통한 Alert 발송을 확인한다. 0%로 변경되었기 때문에 모든 Node가 해당된다.
![cpu_steal_alert](../../images/cpu_steal_alert.png)
* [ **STEP 3** ] : Resolved를 검증하기 위해 다시 기존 10%로 변경한다.
```python
expr: avg by(instance) (rate(node_cpu_seconds_total{mode="steal"}[5m])) * 100 > 10
```
* [ **STEP 4** ] : Alert Manager를 통한 `Resolved` Alert 발송을 확인한다.
![node_down_resolved](../../images/node_down_resolved.png)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment