# 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 容器镜像 ````{tabs} ```{tab} 在线拉取 ```Bash docker pull moffett/dcsm-exporter:1.2.0-1.0.0 ``` ```{tab} 离线导入 ```Bash wget https://moffett-oss-bucket.tos-cn-shanghai.volces.com/images/Ubuntu/business/dcsm/dcsm-exporter_1.2.0-1.0.0.tar docker load -i dcsm-exporter_1.2.0-1.0.0.tar ``` ```` #### 单机容器环境部署 DCSM Exporter 1. 生成 CDI 配置文件,具体请参见 [MOFFETT Container Toolkit 用户手册](../mct.md)。 ```bash sudo moffett-ctk cdi generate --output=/etc/cdi/moffett.yaml ``` 2. 启动 DCSM Exporter 容器。 ```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 ``` 配置 DCSM Exporter 容器的命令行参数或环境变量如下表所示: | **命令行参数** | **环境变量** | **说明** | **默认值** | | ------------------------------ | --------------------------------- | ----------------------------------------------------------- | --------------------------------------------------- | | --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` 文件默认包含以下两类字段: - 指标:用于实时采集和反映设备的运行状态与性能数据,如下表所示: ::: 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 错误总数 | ::: 关于 Prometheus 指标类型的详细信息,请参见 Understanding metric types。 - Label:用于描述指标来源设备的静态特征。这些字段不会作为指标上报,而是作为 Prometheus 指标的标签附加在每条指标数据上,如下表所示: ::: nested-table | **label 名称** | **描述** | | ------------------------------ | ---------------------------------| | DCSM_FI_DEV_SERIAL | 设备序列号(Serial Number,SN) | | DCSM_FI_DRIVER_VERSION | 驱动版本 | | DCSM_FI_MXML_VERSION | MXML 版本 | ::: #### Kubernetes 集群环境部署 DCSM Exporter 在 Kubernetes 集群中,创建 DCSM Exporter 的 DaemonSet 和 Service,步骤如下: 1. 创建名为 `moffett-monitoring` 的 namespace。 ```Bash kubectl create ns moffett-monitoring ``` 2. 创建 dcsm-exporter.yaml 部署文件。 ```YAML # dcsm-exporter.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" 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 ``` ### 部署后验证 ````{tabs} ```{tab} 单机容器环境验证 ```bash curl http://:/metrics # 终端中验证 http://:/metrics # 浏览器中验证 ``` ```{tab} Kubernetes 集群环境验证 ```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 安装包,并解压缩。 ``` 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`。 ``` # 添加 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 服务及端口信息。 ``` 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. 应用配置。 ``` 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 ``` ``` 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 监听端口信息。 ``` 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。 ``` docker ps | grep dcsm-exporter ``` 2. 停止 DCSM exporter 容器。 ``` docker stop # 或使用 container ID ``` ### Kubernetes 集群环境 #### 给指定节点添加 Taint 1. 查询集群中部署的 DCSM Exporter 所有 Pod 的详细信息。 ``` kubectl get pods -l app.kubernetes.io/name=dcsm-exporter -n moffett-monitoring -o wide ``` 2. 为集群的指定节点添加污点(Taint)并删除该节点上 DCSM Exporter 相关 Pod。 ``` kubectl get node # 查询集群的所有节点 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= # 删除指定节点上特定标签的 Pod kubectl get pod -n moffett-monitoring -o wide # 验证 Pod 状态 ``` 如需恢复指定节点上的 DCSM Exporter 相关 Pod,移除该节点上的 Taint。 ``` kubectl taint nodes NeedFix=true:NoSchedule- ``` #### 利用节点亲和性给指定节点添加标签 1. 给需要移除 DCSM Exporter 组件的节点添加 `dcsm-exporter-disabled=true` 标签。 ``` kubectl label node dcsm-exporter-disabled=true ``` 2. 验证指定节点具有 `dcsm-exporter-disabled=true` 标签。 ``` kubectl get nodes --show-labels | grep ``` 3. 在 `dcsm-exporter.yaml` 文件的 `spec` 字段添加亲和性配置(`requiredDuringSchedulingIgnoredDuringExecution`),选择拥有指定标签的节点。 ```YAML affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: dcsm-exporter-disabled operator: NotIn values: - "true" ``` 4. 应用更新的 DCSM Exporter 的 DaemonSet 配置。 ``` kubectl apply -f dcsm-exporter.yaml ``` 5. 验证 DCSM Exporter Pod 在指定节点上停用。 ``` kubectl get pods -o wide -n moffett-monitoring ``` 如需在指定节点上恢复 DCSM Exporter 组件,删除标签。 ``` kubectl label node dcsm-exporter-disabled- ``` ## 卸载 DCSM Exporter ### 单机容器环境 1. 停用并删除容器。 ```Bash docker stop dcsm-exporter && docker rm dcsm-exporter ``` 2. 删除镜像。 ```Bash docker rmi moffett/dcsm-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 ```