# DCSM Exporter 用户手册 DCSM Exporter 是基于 DCSM 构建的指标采集工具,用于在单机或集群环境中实时监控墨芯计算卡的负载与健康状态。DCSM Exporter 支持导出墨芯计算卡的运行数据,兼容 Prometheus 格式。 ```{admonition} 须知 :class: note DCSM Exporter 在 Kubernetes 集群中可单独部署或通过 SPU Operator 统一部署,任选一种方式以避免冲突。通过 SPU Operator 部署的详细操作,请参见 [MOFFETT SPU Operator 用户手册](../k8s-spu-operator.md)。 ``` ## 部署 DCSM Exporter DCSM Exporter 可部署在单机容器中运行,也可在 Kubernetes 集群中的墨芯设备节点上以 DaemonSet 方式部署。 ### 前提条件 - 安装 SOLA Toolkit,具体请参见 [SOLA Toolkit 安装指南](../../installation/sola-toolkit-installation-guide.md)。 - 使用单机容器方式部署时,需安装 MOFFETT Container Toolkit,具体请参见 [MOFFETT Container Toolkit 用户手册](../mct.md)。 - 使用 Kubernetes 集群方式部署时,需安装 Kubernetes 集群,具体请参见 Kubernetes 文档。 ### 操作步骤 #### 获取 DCSM Exporter 容器镜像 通过以下任一方式获取 DCSM Exporter 容器镜像: - 在线拉取 ````{tabs} ```{tab} S4/S30/S40/S40AC ```bash docker pull moffett/dcsm-exporter:1.2.0-1.0.0 ``` ```{tab} S40Lite ```bash docker pull moffett/dcsm-lite-exporter:1.2.0-1.0.0 ``` ```` - 离线导入 ````{tabs} ```{tab} S4/S30/S40/S40AC ```bash wget https://moffett-oss-bucket.tos-cn-shanghai.volces.com/macs/v1.11/dcsm-exporter/dcsm-exporter_1.2.0-1.0.0.tar docker load -i dcsm-exporter_1.2.0-1.0.0.tar ``` ```{tab} S40Lite ```bash wget https://moffett-oss-bucket.tos-cn-shanghai.volces.com/macs/v1.11/dcsm-exporter/dcsm-lite-exporter_1.2.0-1.0.0.tar docker load -i dcsm-lite-exporter_1.2.0-1.0.0.tar ``` ```` #### 单机容器环境部署 DCSM Exporter 1. 生成 CDI 规范文件(详见 [MOFFETT Container Toolkit 用户手册](../mct.md))。 ```bash sudo moffett-ctk cdi generate --driver-root / --output=/etc/cdi/moffett.yaml ``` 2. 启动 DCSM Exporter 容器。 ````{tabs} ```{tab} S4/S30/S40/S40AC ```bash docker run -itd \ --device moffett.ai/spu=all \ --net=host \ --name=dcsm-exporter \ moffett/dcsm-exporter:1.2.0-1.0.0 \ -f /etc/dcsm-exporter/default-counters.csv \ -c 15000 -a :7788 -d all ``` ```{tab} S40Lite ```bash docker run -itd \ --device moffett.ai/spu=all \ --net=host \ --name=dcsm-exporter \ moffett/dcsm-lite-exporter:1.2.0-1.0.0 \ -f /etc/dcsm-exporter/default-counters.csv \ -c 15000 -a :7788 -d all ``` ```` 配置 DCSM Exporter 容器的命令行参数或环境变量如下表所示: ::: nested-table | 命令行参数 | 环境变量 | 说明 | 默认值 | | ------------------------------ | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | | --f,--collectors | DCSM_EXPORTER_COLLECTORS | 指定包含要收集的 DCSM 字段的文件路径。 | /etc/dcsm-exporter/default-counters.csv | | -c,--collect-interval | DCSM_EXPORTER_INTERVAL | 指定收集指标的时间间隔,单位:毫秒(ms)。 | 30000 | | -a,--address value | DCSM_EXPORTER_LISTEN | 指定监听 HTTP 服务的地址,格式::**。 | :7788 | | -r,--remote-hostengine-info | DCSM_REMOTE_HOSTENGINE_INFO | 指定 DCSM Exporter 连接特定主机上部署的 `mx-hostengine`,格式:*machine_ip*:*port*。 | DCSM Exporter 容器内部署的 `mx-hostengine` | | -d,--devices | DCSM_EXPORTER_DEVICES_STR | 指定要监控的设备,支持的值:all 或指定设备的 ID,例如:all、0,1、2-4、0,2-4。
确保指定监控的设备在启动容器时挂载的设备范围内,否则会导致容器启动失败。 | all | | -k,--kubernetes | DCSM_EXPORTER_KUBERNETES | 指定是否将设备对应的 Kubernetes Pod 信息加入指标标签。 | FALSE(否) | | --pod-resources-kubelet-socket | DCSM_POD_RESOURCES_KUBELET_SOCKET | 指定 kubelet pod-resources 套接字文件的路径。 | /var/lib/kubelet/pod-resources/kubelet.sock | ::: 通过 `--f,--collectors` 参数指定的 `default-counters.csv` 文件默认包含以下两类字段: - 指标 用于实时采集和反映设备的运行状态与性能数据,如下表所示。关于 Prometheus 指标类型的详细信息,请参见 Understanding metric types。 ::: nested-table | 指标名称 | Prometheus 指标类型 | 描述 | | ------------------------------ | ------------------- | ------------------------------------------- | | DCSM_FI_DEV_NNCORE_CLOCK | gauge | NNCORE 的时钟频率,单位:Mhz | | DCSM_FI_DEV_SPU_TEMP | gauge | SPU 温度,单位:℃ | | DCSM_FI_DEV_FAN_SPEED | gauge | 风扇调速比(单位:%) | | DCSM_FI_DEV_FAN_SPEED_RPM | gauge | 风扇转速(RPM) | | DCSM_FI_DEV_POWER_USAGE | gauge | 功耗,单位:W | | DCSM_FI_DEV_PCIE_TX_THROUGHPUT | counter | 通过 MXML 传输的 PCIe TX 总字节数,单位:KB | | DCSM_FI_DEV_PCIE_RX_THROUGHPUT | counter | 通过 MXML 接收的 PCIe RX 总字节数,单位:KB | | DCSM_FI_DEV_SPU_UTIL | gauge | SPU 利用率,以百分比格式表示 | | DCSM_FI_DEV_MEM_COPY_UTIL | gauge | 内存利用率,以百分比格式表示 | | DCSM_FI_DEV_XID_ERRORS | gauge | 最后出现的 XID 错误码 | | DCSM_FI_DEV_DDR_FREE | gauge | DDR 空闲内存,单位:MB | | DCSM_FI_DEV_DDR_USED | gauge | DDR 已用内存,单位:MB | | DCSM_FI_DEV_ECC_SBE_VOL_TOTAL | counter | 单比特瞬态 ECC 错误总数 | | DCSM_FI_DEV_ECC_DBE_VOL_TOTAL | counter | 双比特瞬态 ECC 错误总数 | | DCSM_FI_DEV_ECC_SBE_AGG_TOTAL | counter | 单比特持久 ECC 错误总数 | | DCSM_FI_DEV_ECC_DBE_AGG_TOTAL | counter | 双比特持久 ECC 错误总数 | ::: - 标签(Label) 用于描述指标来源设备的静态特征,如下表所示。这些字段不会作为指标上报,而是作为 Prometheus 指标的标签附加在每条指标数据上。 ::: nested-table | Label 名称 | 描述 | | ---------------------- | ------------------------------- | | DCSM_FI_DEV_SERIAL | 设备序列号(Serial Number,SN) | | DCSM_FI_DRIVER_VERSION | 驱动版本 | | DCSM_FI_MXML_VERSION | MXML 版本 | ::: 3. 验证 DCSM Exporter. ```bash curl http://:/metrics # 终端中验证 http://:/metrics # 浏览器中验证 ``` #### Kubernetes 集群环境部署 DCSM Exporter 在 Kubernetes 集群中,创建 DCSM Exporter 的 DaemonSet 和 Service,步骤如下: 1. 创建名为 `moffett-monitoring` 的 namespace。 ```bash kubectl create ns moffett-monitoring ``` 2. 创建 `dcsm-exporter.yaml` 部署文件。 ```{admonition} 须知 :class: note 以下配置适用于 S4/S30/S40/S40AC 计算卡。使用 S40Lite 计算卡时,请使用容器镜像 `moffett/dcsm-lite-exporter:1.2.0-1.0.0`。 ``` ```yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: "dcsm-exporter" namespace: "moffett-monitoring" labels: app.kubernetes.io/name: "dcsm-exporter" app.kubernetes.io/version: "1.0.0" spec: updateStrategy: type: RollingUpdate selector: matchLabels: app.kubernetes.io/name: "dcsm-exporter" app.kubernetes.io/version: "1.0.0" template: metadata: labels: app.kubernetes.io/name: "dcsm-exporter" app.kubernetes.io/version: "1.0.0" name: "dcsm-exporter" spec: containers: - name: "dcsm-exporter" image: "moffett/dcsm-exporter:1.2.0-1.0.0" # 使用 S40Lite 计算卡时,请使用:moffett/dcsm-lite-exporter:1.2.0-1.0.0 env: - name: "DCSM_EXPORTER_LISTEN" value: ":7788" - name: "DCSM_EXPORTER_KUBERNETES" value: "true" - name: "DCSM_EXPORTER_INTERVAL" value: "1000" ports: - name: "metrics" containerPort: 7788 securityContext: privileged: true volumeMounts: - name: "pod-spu-resources" readOnly: true mountPath: "/var/lib/kubelet/pod-resources" resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "256Mi" volumes: - name: "pod-spu-resources" hostPath: path: "/var/lib/kubelet/pod-resources" --- kind: Service apiVersion: v1 metadata: name: "dcsm-exporter" namespace: "moffett-monitoring" labels: app.kubernetes.io/name: "dcsm-exporter" app.kubernetes.io/version: "1.0.0" spec: selector: app.kubernetes.io/name: "dcsm-exporter" app.kubernetes.io/version: "1.0.0" ports: - name: "metrics" port: 7788 targetPort: 7788 ``` 3. 部署 DCSM Exporter。 ```bash kubectl create -f dcsm-exporter.yaml ``` 4. 验证 DCSM Exporter。 ```bash kubectl get pod -n moffett-monitoring -o wide # 查看 NAMESPACE 为 moffett-monitoring 的所有 Pod 的详细信息 kubectl get svc -n moffett-monitoring # 查询 NAME 为 moffett-dcsm-exporter 的 CLUSTER-IP 和 PORT curl http://:/metrics # 查询 DCSM Exporter 输出的指标数据 ``` ## 配置 Prometheus DCSM Exporter 支持接入 Prometheus,根据部署 DCSM Exporter 的方式选择以下一种配置方式: - 单机容器环境,主机上安装 Prometheus 并直接修改配置文件。 - Kubernetes 集群环境,在 Kubernetes 集群中部署 Prometheus 并配置 Service Monitor。 关于如何使用 Prometheus 的详细信息,请参见 Prometheus Docs。 ### 单机容器环境 安装 Prometheus,并修改其配置文件,步骤如下: 1. 获取 Prometheus 安装包,并解压缩。 ```bash tar xvfz prometheus-.tar.gz cd prometheus- ``` 2. 修改 Prometheus 配置文件,添加监控目标。 在 `prometheus.yml` 文件的 `scrape_configs` 字段,添加监控目标(`targets`),示例如下: ```YAML scrape_configs: - job_name: "spu-metrics" static_configs: - targets: [":7788"] # 添加监控目标主机的 IP 地址及端口号,DCSM Exporter 默认监听端口为 7788;可添加多个目标 ``` 3. 重启 Prometheus 服务,使配置生效。Prometheus 默认监听端口为 9090。 ```bash ./prometheus --config.file=prometheus.yml & ``` 4. 主机上通过浏览器访问 `http://:9090`,检索指标数据。 ### Kubernetes 集群环境 在 Kubernetes 集群环境中,使用 Prometheus Operator 和 Service Monitor 自动发现和监控 DCSM Exporter。Service Monitor 配置会通过 Operator 自动同步到 Prometheus 中。 1. 部署 `kube-prometheus-stack`。 ```bash # 添加 Helm 仓库(只需执行一次) helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update # 安装 kube-prometheus-stack helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \ --create-namespace --namespace prometheus \ --set prometheus.service.type=NodePort \ # 将 ClusterIP 修改为 NodePort(默认端口号为 30090) --set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false # 指定 Prometheus 能够监控集群中所有命名空间的 ServiceMonitor ``` 更多关于安装 `kube-prometheus-stack` 的详细信息,请参见 kube-prometheus-stack。 2. 验证已部署的 Prometheus 服务及端口信息。 ```bash kubectl get svc -A | grep prometheus ``` 3. 部署 Service Monitor。 ```{admonition} 须知 :class: note 如果通过 SPU Operator 部署 DCSM Exporter,无需该步骤,可通过 SPU Operator 启用 Service Monitor 服务,具体请参见 [MOFFETT SPU Operator 用户手册](../k8s-spu-operator.md)。 ``` a. 创建配置文件。 ```YAML # service-monitor.yaml apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: "dcsm-exporter" namespace: "moffett-monitoring" labels: app.kubernetes.io/name: "dcsm-exporter" app.kubernetes.io/version: "1.0.0" spec: selector: matchLabels: app.kubernetes.io/name: "dcsm-exporter" app.kubernetes.io/version: "1.0.0" namespaceSelector: matchNames: - "moffett-monitoring" endpoints: - port: "metrics" path: "/metrics" interval: "1s" ``` b. 应用配置。 ```bash kubectl apply -f service-monitor.yaml ``` 4. 通过浏览器访问 `http://:30090`,检索指标数据。 ## 使用 Grafana Grafana 是一款开源的可视化与分析工具,可通过仪表盘(Dashboard)帮助收集、关联并可视化数据。在 Kubernetes 集群中部署的 `kube-prometheus-stack` 集成了 Grafana Dashboard。 ### 单机容器环境 1. 根据 Download Grafana 页面指示,选择对应平台的安装包部署 Grafana,完成后 Grafana 默认监听端口为 3000。 2. 通过浏览器访问 `http://:3000`,进入 Grafana 登录页面。使用用户名 `admin` 和密码 `admin` 登录 Grafana 主界面。 3. 将 Grafana 的数据源设置为 Prometheus,具体操作请参见 Configure the Prometheus data source。 ### Kubernetes 集群环境 默认情况下,Grafana 服务通过 `ClusterIP` 类型监听端口,仅限集群内部访问。为便于通过浏览器访问,可将其修改为 `NodePort` 类型,方式类似于 Prometheus Dashboard 的访问方式。步骤如下: 1. 创建 `grafana-patch.yaml` 补丁文件,修改 Grafana 服务的对外端口为 `NodePort` 并指定端口号。NodePort 端口号取值在 30000~32767 闭区间范围内,这里以 32300 为例。 ```bash vim grafana-patch.yaml ``` ```YAML spec: type: NodePort # 服务监听方式 ports: - port: 80 # 集群内访问端口号 targetPort: 3000 # Pod 内部端口号 nodePort: 32300 # 节点主机上暴露的端口号 ``` 2. 修改服务监听使用指定的 `NodePort`。 ```bash kubectl patch svc -n prometheus --patch "$(cat grafana-patch.yaml)" # 通过 kubectl get svc -A | grep grafana 命令查询 ``` 3. 验证已修改的 Grafana 监听端口信息。 ```bash kubectl get svc -A | grep grafana ``` 4. 通过浏览器访问 `http://:32300` Grafana 主页面,登录用户名:`admin`;密码:`prom-operator`。 ```{admonition} 须知 :class: note 登录 Grafana 的密码可通过 `kubectl --namespace prometheus get secrets -o jsonpath="{.data.admin-password}" | base64 -d ; echo` 命令查询获取。 ``` ### 应用 DCSM Dashboard 参见 Import dashboards 导入墨芯提供的 Dashboard 模板(.json 文件),创建 MOFFETT DCSM Exporter Dashboard。可根据实际需求自定义 Dashboard 内容。 ## 停用 DCSM Exporter 当更新 SOLA Toolkit 时,DCSM Exporter 组件会影响 SOLA Toolkit 卸载,执行以下步骤在指定节点停用 DCSM Exporter。 ### 单机容器环境 1. 检查容器环境的 DCSM Exporter。 ```bash docker ps | grep dcsm-exporter ``` 2. 停止 DCSM exporter 容器。 ```bash docker stop # 或使用 container ID ``` ### Kubernetes 集群环境 #### 利用节点 Taint 防止 DCSM Exporter 组件的 Pod 在指定节点上被调度 1. 查询集群中部署的 DCSM Exporter 所有 Pod 的详细信息。 ```bash kubectl get pod -l app.kubernetes.io/name=dcsm-exporter -n moffett-monitoring -o wide ``` 2. 为集群的指定节点添加污点(Taint)并删除该节点上 DCSM Exporter 相关 Pod。 ```bash kubectl get nodes # 查询集群的所有节点 kubectl taint nodes NeedFix=true:NoSchedule # 为指定节点添加 Taint,标记为不可调度 kubectl describe node | grep Taints # 验证节点 Taint 是否生效 kubectl delete pod -l app.kubernetes.io/name=dcsm-exporter -n moffett-monitoring --field-selector spec.nodeName= # 删除指定节点上 DCSM Exporter 的 Pod kubectl get pod -n moffett-monitoring -o wide # 验证 Pod 状态 ``` 如需恢复指定节点上的 DCSM Exporter 相关 Pod,移除该节点上的 Taint。 ```bash kubectl taint nodes NeedFix=true:NoSchedule- ``` #### 利用节点亲和性防止 DCSM Exporter 组件的 Pod 在指定节点上被调度 1. 给需要停用 DCSM Exporter 组件的节点添加 `dcsm-exporter-disabled=true` 标签。 ```bash kubectl label node dcsm-exporter-disabled=true # 添加标签 kubectl get nodes --show-labels | grep # 验证标签 ``` 2. 添加亲和性配置。 在 `dcsm-exporter.yaml` 文件的 `spec` 字段添加 `requiredDuringSchedulingIgnoredDuringExecution` 配置,指定有 `dcsm-exporter-disabled=true` 标签的节点不运行 DCSM Exporter 组件的 Pod。 ```YAML affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: dcsm-exporter-disabled operator: NotIn values: - "true" ``` 3. 应用更新的 DCSM Exporter 的 DaemonSet 配置。 ```bash kubectl apply -f dcsm-exporter.yaml ``` 4. 验证 DCSM Exporter 组件的 Pod 在指定节点上停用。 ```bash kubectl get pod -o wide -n moffett-monitoring ``` 如需在指定节点上恢复 DCSM Exporter 组件,删除标签。 ```bash kubectl label node dcsm-exporter-disabled- ``` ## 卸载 DCSM Exporter ### 单机容器环境 1. 停用并删除容器。 ```bash docker stop dcsm-exporter && docker rm dcsm-exporter ``` 2. 删除镜像。 ````{tabs} ```{tab} S4/S30/S40/S40AC ```bash docker rmi moffett/dcsm-exporter:1.2.0-1.0.0 ``` ```{tab} S40Lite ```bash docker rmi moffett/dcsm-lite-exporter:1.2.0-1.0.0 ``` ```` 3. 验证卸载是否完成。 ```bash docker ps | grep dcsm-exporter docker images | grep dcsm-exporter ``` ### Kubernetes 集群环境 1. 删除 DCSM Exporter 对应 namespace 下特定资源类型的所有资源,包括 Pod、Deployment、Service、ReplicaSet 等。 ```bash kubectl delete all --all -n moffett-monitoring ``` 2. 删除 DCSM Exporter 的 namespace。 ```bash kubectl delete ns moffett-monitoring ``` 3. 验证卸载是否完成。 ```bash kubectl get all -A | grep dcsm-exporter kubectl get ns | grep moffett-monitoring ```