Skip to content

Commit 1e7ef33

Browse files
committed
add cpu pin docs
1 parent a5d1600 commit 1e7ef33

File tree

2 files changed

+145
-1
lines changed

2 files changed

+145
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
---
2+
id: performance-tips
3+
title: Performance Tips
4+
sidebar_label: Performance Tips
5+
---
6+
7+
# cpu 核心绑定与独占
8+
9+
## 概述
10+
11+
IOMesh 属于性能敏感型应用。在默认情况下,IOMesh Pod 运行时不会绑定在任何 cpu 核心上,这种情况下虽然 IOMesh 可以正常运行,但频繁的 cpu 切换和 cpu cache missing 会导致 IOMesh 性能波动较大,性能上限不理想。
12+
13+
为解决上述问题,IOMesh 提供了 "基于 Kubelet CpuManager" 和 "基于 Kernel parameter" 两种 cpu 核心绑定模式,并且使所绑定的 cpu 能够被 IOMesh 独占。
14+
15+
> _NOTE:_
16+
> IOMesh 同一时刻仅支持一种 cpu 核心绑定模式,如果需要从其中一种模式切换至另一种,则需要将前一种模式中所做的配置内容完全回滚,再配置另一种模式
17+
18+
## 基于 Kubelet CpuManager 的 cpu 核心绑定配置方式
19+
20+
### 将 Kubelet 的 CpuManager Policy 设置为 static
21+
22+
依次对所有 K8s Worker 节点执行如下操作
23+
24+
1. 参考 [驱逐节点](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node) 文档对节点上的 Pod 进行驱逐
25+
2. 停止 kubelet 服务
26+
27+
```shell
28+
systemctl stop kubelet
29+
```
30+
31+
3. 删除旧的 CPU CpuManager 状态文件。 默认情况下,该文件的路径为 “/var/lib/kubelet/cpu_manager_state”。这会清除 CPUManager 维护的状态,以便新策略设置的 cpusets 不会与其冲突。
32+
33+
4. 修改 Kubelet 配置文件,默认情况下,该文件的路径为 ` /var/lib/kubelet/config.yaml` ,增加如下配置
34+
35+
```yaml
36+
# /var/lib/kubelet/config.yaml
37+
cpuManagerPolicy: "static" # 设置为 static,保证 Guarantee 类型的 Pod 可以独占 cpu
38+
reservedSystemCPUs: "10-13" # 预留给 K8s 核心服务和系统服务的 cpu 核心,配置方式可参考 https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/
39+
```
40+
41+
5. 启动 kubelet 服务
42+
43+
```
44+
systemctl start kubelet
45+
```
46+
47+
### 配置 IOMesh 自动绑定 Kubelet 分配的 cpu
48+
49+
#### 配置 Helm Values
50+
51+
在 IOMesh Helm Values 文件中,将 `iomesh.cpuExclusiveOptions.cpuExclusivePolicy` 字段设置为 `kubeletCpuManager
52+
53+
```yaml
54+
iomesh:
55+
cpuExclusiveOptions:
56+
# Cpu isolation and exclusive policy for IOMesh, support kubeletCpuManager/kernelCpuIsolation/noExclusive.
57+
# The default value is kubeletCpuManager
58+
cpuExclusivePolicy: "kubeletCpuManager"
59+
```
60+
61+
对于新部署的 IOMesh 集群,修改完毕后可以使用 `helm install`进行集群部署。
62+
63+
对于已部署的 IOMesh 集群,修改完毕后可以使用 `helm upgrade`对集群进行配置更新。
64+
65+
## 基于 Kernel parameter 的 cpu 核心绑定配置方式
66+
67+
### 配置内核 cpu 隔离
68+
69+
#### 设置 Linux 内核启动参数
70+
71+
> _NOTE:_
72+
> 此步骤的操作方法可能会有所不同,具体取决于当前使用的 Linux 发行版
73+
74+
在 grub 配置文件中添加`isolcpus`内核启动参数`GRUB_CMDLINE_LINUX_DEFAULT`,其值标识要隔离的 cpu,配置格式可参考 https://man7.org/linux/man-pages/man7/cpuset.7.html#FORMATS。配置文件路径为 /etc/default/grub
75+
76+
默认情况下,IOMesh 需要使用 4 个独占的 cpu 核心(其中 chunk 服务独占 3 cpu,meta 服务独占 1 cpu)。在以下示例中,我们假设系统总共有 16 个 CPU 核心,第 0,1,2,10 号 CPU 核心专用于 IOMesh,在 GRUB_CMDLINE_LINUX_DEFAULT 后追加如下配置
77+
78+
```config
79+
GRUB_CMDLINE_LINUX_DEFAULT="isolcpus=0-2,10"
80+
```
81+
82+
#### 更新 grub 配置
83+
84+
```
85+
grub2-mkconfig -o $(find /boot -name grub.cfg)
86+
```
87+
88+
#### 重启系统
89+
90+
```reboot
91+
reboot
92+
```
93+
94+
#### 验证内核隔离 cpu 是否生效
95+
96+
```shell
97+
# cat /sys/devices/system/cpu/isolated
98+
0-2,10
99+
```
100+
101+
102+
103+
### 配置 IOMesh 绑定内核隔离的 cpu
104+
105+
在 IOMesh Helm values 文件中做如下配置:
106+
107+
1.`iomesh.cpuExclusiveOptions.cpuExclusivePolicy` 字段设置为 `kernelCpuIsolation`
108+
2.`iomesh.cpuExclusiveOptions.exclusiveCpusets` 字段中配置 chunk 和 meta 服务独占的 cpuset
109+
110+
```yaml
111+
iomesh:
112+
cpuExclusiveOptions:
113+
# Cpu isolation and exclusive policy for IOMesh, support kubeletCpuManager/kernelCpuIsolation/noExclusive.
114+
# The default value is kubeletCpuManager
115+
cpuExclusivePolicy: "kubeletCpuManager"
116+
exclusiveCpusets:
117+
chunk: 0-2
118+
meta: 10
119+
```
120+
121+
对于新部署的 IOMesh 集群,修改完毕后可以使用 `helm install`进行集群部署。
122+
123+
对于已部署的 IOMesh 集群,修改完毕后可以使用 `helm upgrade`对集群进行配置更新。
124+
125+
## 验证 IOMesh 核心绑定
126+
127+
在 meta pod 所在的 k8s worker 上执行如下命令验证 meta 服务绑定到了 1 个 cpu 上,命令输出代表 meta 服务成功绑定到了 cpu 3 上。如果绑定未生效,则 cpuset.cpus 的值为空或该文件不存在
128+
129+
```bash
130+
# cat /sys/fs/cgroup/cpuset/zbs/meta-main/cpuset.cpus
131+
3
132+
```
133+
134+
在 chunk pod 所在的 k8s worker 上执行如下命令验证 meta 服务绑定到了 1 个 cpu 上,以下命令输出代表 chunk 服务成功绑定到了 cpu 0,1,2 上。如果绑定未生效,则 cpuset.cpus 的值为空或该文件不存在
135+
136+
```shell
137+
# cat /sys/fs/cgroup/cpuset/zbs/chunk-io/cpuset.cpus
138+
0
139+
# cat /sys/fs/cgroup/cpuset/zbs/chunk-main/cpuset.cpus
140+
1
141+
# cat /sys/fs/cgroup/cpuset/zbs/others/cpuset.cpus
142+
2
143+
```

website/sidebars.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
"deploy-iomesh-cluster/prerequisites",
99
"deploy-iomesh-cluster/install-iomesh",
1010
"deploy-iomesh-cluster/setup-iomesh",
11-
"deploy-iomesh-cluster/activate-license"
11+
"deploy-iomesh-cluster/activate-license",
12+
"deploy-iomesh-cluster/performance-tips"
1213
],
1314
"Volume Operations": [
1415
"volume-operations/create-storageclass",

0 commit comments

Comments
 (0)