Skip to content

Commit 895eafc

Browse files
committed
add cpu pin docs
1 parent a5d1600 commit 895eafc

File tree

1 file changed

+138
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)