|
| 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 | +``` |
0 commit comments