# bot **Repository Path**: cdevel/bot ## Basic Information - **Project Name**: bot - **Description**: 一个简单的OSD服务CPU绑定工具 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-10 - **Last Updated**: 2025-10-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Ceph OSD NUMA/CPU 绑定工具 (Go版本) `osd_cpu_bind` 是一个面向 **cephadm / systemd + podman** 环境的单文件运维工具,用于对 Ceph OSD 进行 **NUMA 感知的 CPU 亲和性规划、应用和重启**,并确保每个 OSD 的 CPU 和内存绑定在同一 NUMA 节点上以获得最佳性能。 该工具支持本地和远程执行模式,可通过 SSH 在远程主机上进行操作。 --- ## ✨ 主要特性一览 - **NUMA 感知与强制单 NUMA**:确保每个 OSD 的 CPU 和内存绑定在同一 NUMA 节点上 - **自动 CPU 分配**:根据指定的 NUMA 节点列表自动为 OSD 分配 CPU 核心 - **手动 CPU 分配**:支持通过 `--osd-cpu-map` 参数手动指定 OSD 与 CPU 核心的映射关系 - **物理核优先**:优先使用物理核心而非超线程核心 - **自动重启**:可选的一键重启功能,使配置更改立即生效 - **CPU 排除列表**:支持排除特定的 CPU 核心(如 0 号 CPU 或高编号的 CPU) - **SSH 远程支持**:可通过 `-H` 参数在远程主机上执行操作 --- ## 🚀 快速开始 ``` # 查看帮助信息 ./osd_cpu_bind --help # 预览 CPU 分配结果(不实际应用更改) ./osd_cpu_bind --numa="0,1,2" --exclude-cpus="96-191" --osd-count=6 --cores-per-osd=5 # 在远程主机上预览 CPU 分配结果 ./osd_cpu_bind -H user@remote-host --numa="0,1,2" --exclude-cpus="96-191" --osd-count=6 --cores-per-osd=5 # 应用 CPU 绑定配置并重启 OSD 服务 ./osd_cpu_bind --numa="0,1,2" --exclude-cpus="96-191" --osd-count=6 --cores-per-osd=5 --apply --restart # 在远程主机上应用 CPU 绑定配置并重启 OSD 服务 ./osd_cpu_bind -H user@remote-host --numa="0,1,2" --exclude-cpus="96-191" --osd-count=6 --cores-per-osd=5 --apply --restart # 手动指定 OSD 与 CPU 核心的映射关系 ./osd_cpu_bind --osd-cpu-map="12:1-5,13:10-15,14:20-25" --apply --restart # 在远程主机上手动指定 OSD 与 CPU 核心的映射关系 ./osd_cpu_bind -H user@remote-host --osd-cpu-map="12:1-5,13:10-15,14:20-25" --apply --restart ``` --- ## 🧩 参数说明 | 参数 | 含义 | 默认值 | |------|------|--------| | `-H` | 远程主机地址,使用SSH连接 | 本地执行 | | `--numa` | NUMA 节点列表,以逗号分隔,例如: "0,1,2" | 必需参数 | | `--osd-cpu-map` | 指定OSD到CPU的映射,格式: OSD_ID:CPU_LIST,OSD_ID:CPU_LIST 例如: "12:1-5,13:10-15" | 无 | | `--osd-count` | OSD 数量 | 6 | | `--cores-per-osd` | 每个 OSD 分配的核心数 | 5 | | `--exclude-cpus` | 要排除的 CPU 列表,支持范围格式如 96-191 | "96-191" | | `--fsid` | Ceph FSID | "eefd01fa-ac19-11f0-806a-e89e49874d8a" | | `--apply` | 是否应用更改到 unit.run 文件 | false | | `--restart` | 是否重启 OSD 服务 | false | --- ## 🔄 工作流程 1. **CPU 分配**:根据指定的 NUMA 节点为每个 OSD 分配指定数量的 CPU 核心,或根据手动映射指定 2. **配置应用**:将 CPU 绑定配置写入每个 OSD 的 unit.run 文件 3. **服务重启**:可选地重启 OSD 服务使配置生效 对于远程执行: 1. 通过 SSH 连接到远程主机 2. 在远程主机上执行 CPU 分配 3. 通过 SSH 读取、修改和写入 unit.run 文件 4. 通过 SSH 重启远程主机上的 OSD 服务 --- ## 🧪 使用示例 ``` # 为 6 个 OSD 分配 CPU,每个 OSD 使用 5 个核心,仅限 NUMA 0,1,2 节点 ./osd_cpu_bind --numa="0,1,2" --osd-count=6 --cores-per-osd=5 # 排除 CPU 0 和 96-191 范围的 CPU ./osd_cpu_bind --numa="0,1,2" --exclude-cpus="0,96-191" --osd-count=6 --cores-per-osd=5 # 在远程主机上执行相同操作 ./osd_cpu_bind -H user@remote-host --numa="0,1,2" --exclude-cpus="0,96-191" --osd-count=6 --cores-per-osd=5 # 应用配置但不重启服务 ./osd_cpu_bind --numa="0,1,2" --exclude-cpus="96-191" --osd-count=6 --cores-per-osd=5 --apply # 应用配置并重启服务 ./osd_cpu_bind --numa="0,1,2" --exclude-cpus="96-191" --osd-count=6 --cores-per-osd=5 --apply --restart # 在远程主机上应用配置并重启服务 ./osd_cpu_bind -H user@remote-host --numa="0,1,2" --exclude-cpus="96-191" --osd-count=6 --cores-per-osd=5 --apply --restart # 手动指定 OSD 与 CPU 核心的映射关系 ./osd_cpu_bind --osd-cpu-map="12:1-5,13:10-15,14:20-25" --apply --restart # 在远程主机上手动指定 OSD 与 CPU 核心的映射关系 ./osd_cpu_bind -H user@remote-host --osd-cpu-map="12:1-3,13:10-12,14:20-22" --apply --restart ``` --- ## 🧱 技术细节 - **NUMA 感知**:确保每个 OSD 的所有 CPU 都在同一 NUMA 节点上 - **CPU 排除**:自动排除指定的 CPU(如 0 号 CPU 和高编号的 CPU) - **核心分配**:按 NUMA 节点循环分配 OSD,确保负载均衡 - **配置备份**:在修改 unit.run 文件前自动创建备份 - **服务管理**:通过 systemd 重启 OSD 服务 - **远程执行**:通过 SSH 在远程主机上执行所有操作 - **手动映射**:支持手动指定 OSD 与 CPU 核心的映射关系 --- ## 🚪 退出码约定 | 码 | 含义 | |----|------| | 0 | 成功 | | 1 | 错误/失败 | --- ## 🛠 构建 ``` go build -o osd_cpu_bind osd_cpu_bind.go ``` --- ## 🧰 一键构建(新增) 仓库提供了两个构建脚本: - `build_binary.sh`:适用于类 Unix 系统的 bash 构建脚本(已存在)。 - `build.ps1`:适用于 Windows PowerShell 的一键构建脚本(新增)。 使用示例(PowerShell,在仓库根目录运行): ```powershell # 简单构建(当前主机 GOOS/GOARCH) .\build.ps1 # 指定多个交叉编译目标(示例:Windows amd64 与 Linux amd64) .\build.ps1 -Targets "windows/amd64,linux/amd64" # 构建并尝试 strip(若系统有 strip/llvm-strip) .\build.ps1 -Strip ``` 使用示例(Linux / macOS bash): ```bash # 使用现有脚本构建(Nuitka 用于 Python 版,Go 程序可直接 go build) ./build_binary.sh # 或者直接 go build -o osd_cpu_bind osd_cpu_bind.go # 使用新添加的一键构建脚本(支持交叉编译) ./build.sh # 构建当前主机目标 ./build.sh -t linux/amd64 # 指定单个目标 ./build.sh -t "linux/amd64,darwin/amd64" -s # 多目标并 strip ``` 构建产物会放在 `dist/` 目录下。 ## 📄 许可 内部运维工具(未附带 License,可按企业策略补充)。