Skip to content

Commit

Permalink
add cpu pin docs
Browse files Browse the repository at this point in the history
  • Loading branch information
gxglls committed Dec 25, 2023
1 parent a5d1600 commit 895eafc
Showing 1 changed file with 138 additions and 0 deletions.
138 changes: 138 additions & 0 deletions docs/advanced-functions/performance-tips.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@

# Performance Tips

## cpu 核心绑定与独占

### 概述

IOMesh 属于性能敏感型应用。在默认情况下,IOMesh Pod 运行时不会绑定在任何 cpu 核心上,这种情况下虽然 IOMesh 可以正常运行,但频繁的 cpu 切换和 cpu cache missing 会导致 IOMesh 性能波动较大,性能上限不理想。

为解决上述问题,IOMesh 提供了 "基于 Kubelet CpuManager" 和 "基于 Kernel parameter" 两种 cpu 核心绑定模式,并且使所绑定的 cpu 被 IOMesh 独占。

Note: IOMesh 同一时刻仅支持一种 cpu 核心绑定模式,如果需要从其中一种模式切换至另一种,则需要将前一种模式中所做的配置内容完全回滚,再配置另一种模式

### 基于 Kubelet CpuManager 的 cpu 核心绑定配置方式

#### 将 Kubelet 的 CpuManager Policy 设置为 static

依次对所有 K8s Worker 节点执行如下操作

1. 参考 [驱逐节点](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node) 文档对节点上的 Pod 进行驱逐
2. 停止 kubelet 服务

```shell
systemctl stop kubelet
```

3. 删除旧的 CPU CpuManager 状态文件。 默认情况下,该文件的路径为 “/var/lib/kubelet/cpu_manager_state”。这会清除 CPUManager 维护的状态,以便新策略设置的 cpusets 不会与其冲突。

4. 修改 Kubelet 配置文件,默认情况下,该文件的路径为 ` /var/lib/kubelet/config.yaml` ,增加如下配置

```yaml
# /var/lib/kubelet/config.yaml
cpuManagerPolicy: "static" # 设置为 static,保证 Guarantee 类型的 Pod 可以独占 cpu
reservedSystemCPUs: "10-13" # 预留给 K8s 核心服务和系统服务的 cpu 核心,配置方式可参考 https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/
```
5. 启动 kubelet 服务
```
systemctl start kubelet
```

#### 配置 IOMesh 自动绑定 Kubelet 分配的 cpu

##### 配置 Helm Values

在 IOMesh Helm Values 文件中,将 `iomesh.cpuExclusiveOptions.cpuExclusivePolicy` 字段设置为 `kubeletCpuManager

```yaml
iomesh:
cpuExclusiveOptions:
# Cpu isolation and exclusive policy for IOMesh, support kubeletCpuManager/kernelCpuIsolation/noExclusive.
# The default value is kubeletCpuManager
cpuExclusivePolicy: "kubeletCpuManager"
```
对于新部署的 IOMesh 集群,修改完毕后可以使用 `helm install`进行集群部署。

对于已部署的 IOMesh 集群,修改完毕后可以使用 `helm upgrade`对集群进行配置更新。

### 基于 Kernel parameter 的 cpu 核心绑定配置方式

#### 配置内核 cpu 隔离

##### 设置 Linux 内核启动参数

Note:此步骤的操作方法可能会有所不同,具体取决于当前使用的 Linux 发行版

在 grub 配置文件中添加`isolcpus`内核启动参数`GRUB_CMDLINE_LINUX_DEFAULT`,其值标识要隔离的 cpu,配置格式可参考 https://man7.org/linux/man-pages/man7/cpuset.7.html#FORMATS。配置文件路径为 /etc/default/grub

默认情况下,IOMesh 需要使用 4 个独占的 cpu 核心(其中 chunk 服务独占 3 cpu,meta 服务独占 1 cpu)。在以下示例中,我们假设系统总共有 16 个 CPU 核心,第 0,1,2,10 号 CPU 核心专用于 IOMesh,在 GRUB_CMDLINE_LINUX_DEFAULT 后追加如下配置

```config
GRUB_CMDLINE_LINUX_DEFAULT="isolcpus=0-2,10"
```

##### 更新 grub 配置

```
grub2-mkconfig -o $(find /boot -name grub.cfg)
```
##### 重启系统
```reboot
reboot
```

##### 验证内核隔离 cpu 是否生效

```shell
# cat /sys/devices/system/cpu/isolated
0-2,10
```



#### 配置 IOMesh 绑定内核隔离的 cpu

在 IOMesh Helm values 文件中做如下配置:

1.`iomesh.cpuExclusiveOptions.cpuExclusivePolicy` 字段设置为 `kernelCpuIsolation`
2.`iomesh.cpuExclusiveOptions.exclusiveCpusets` 字段中配置 chunk 和 meta 服务独占的 cpuset

```yaml
iomesh:
cpuExclusiveOptions:
# Cpu isolation and exclusive policy for IOMesh, support kubeletCpuManager/kernelCpuIsolation/noExclusive.
# The default value is kubeletCpuManager
cpuExclusivePolicy: "kubeletCpuManager"
exclusiveCpusets:
chunk: 0-2
meta: 10
```
对于新部署的 IOMesh 集群,修改完毕后可以使用 `helm install`进行集群部署。

对于已部署的 IOMesh 集群,修改完毕后可以使用 `helm upgrade`对集群进行配置更新。

### 验证 IOMesh 核心绑定

在 meta pod 所在的 k8s worker 上执行如下命令验证 meta 服务绑定到了 1 个 cpu 上,命令输出代表 meta 服务成功绑定到了 cpu 3 上。如果绑定未生效,则 cpuset.cpus 的值为空或该文件不存在

```bash
# cat /sys/fs/cgroup/cpuset/zbs/meta-main/cpuset.cpus
3
```

在 chunk pod 所在的 k8s worker 上执行如下命令验证 meta 服务绑定到了 1 个 cpu 上,以下命令输出代表 chunk 服务成功绑定到了 cpu 0,1,2 上。如果绑定未生效,则 cpuset.cpus 的值为空或该文件不存在

```shell
# cat /sys/fs/cgroup/cpuset/zbs/chunk-io/cpuset.cpus
0
# cat /sys/fs/cgroup/cpuset/zbs/chunk-main/cpuset.cpus
1
# cat /sys/fs/cgroup/cpuset/zbs/others/cpuset.cpus
2
```

0 comments on commit 895eafc

Please sign in to comment.