DCSM Exporter 用户手册

DCSM Exporter 是基于 DCSM 构建的指标采集工具,用于在单机或集群环境中实时监控墨芯计算卡的负载与健康状态。DCSM Exporter 支持导出墨芯计算卡的运行数据,兼容 Prometheus 格式。

须知

DCSM Exporter 在 Kubernetes 集群中可单独部署或通过 SPU Operator 统一部署,任选一种方式以避免冲突。通过 SPU Operator 部署的详细操作,请参见 MOFFETT SPU Operator 用户手册

部署 DCSM Exporter

DCSM Exporter 可部署在单机容器中运行,也可在 Kubernetes 集群中的墨芯设备节点上以 DaemonSet 方式部署。

前提条件

操作步骤

获取 DCSM Exporter 容器镜像

docker pull moffett/dcsm-exporter:1.2.0-1.0.0

单机容器环境部署 DCSM Exporter

  1. 生成 CDI 配置文件,具体请参见 MOFFETT Container Toolkit 用户手册

    sudo moffett-ctk cdi generate --output=/etc/cdi/moffett.yaml
    
  2. 启动 DCSM Exporter 容器。

    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 服务的地址,格式::<port> :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 指标类型

    描述

    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 指标的标签附加在每条指标数据上,如下表所示:

    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。

    kubectl create ns moffett-monitoring
    
  2. 创建 dcsm-exporter.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。

    kubectl create -f dcsm-exporter.yaml
    

部署后验证

curl http://<host_ip>:<port>/metrics # 终端中验证
http://<host_ip>:<port>/metrics # 浏览器中验证

配置 Prometheus

DCSM Exporter 支持接入 Prometheus,根据部署 DCSM Exporter 的方式选择以下一种配置方式:

  • 单机容器环境,主机上安装 Prometheus 并直接修改配置文件。

  • Kubernetes 集群环境,在 Kubernetes 集群中部署 Prometheus 并配置 Service Monitor。

关于如何使用 Prometheus 的详细信息,请参见 Prometheus Docs

单机容器环境

安装 Prometheus,并修改其配置文件,步骤如下:

  1. 获取 Prometheus 安装包,并解压缩。

    tar xvfz prometheus-<release>.tar.gz
    cd prometheus-<release>
    
  2. 修改 Prometheus 配置文件,添加监控目标。

    prometheus.yml 文件的 scrape_configs 字段,添加监控目标(targets),示例如下:

    scrape_configs:
      - job_name: "spu-metrics"
        static_configs:
          - targets: ["<host_ip>:7788"] # 添加监控目标主机的 IP 地址及端口号,DCSM Exporter 默认监听端口为 7788;可添加多个目标
    
  3. 重启 Prometheus 服务,使配置生效。Prometheus 默认监听端口为 9090。

    ./prometheus --config.file=prometheus.yml &
    
  4. 主机上通过浏览器访问 http://<host_ip>: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。

    须知

    如果通过 SPU Operator 部署 DCSM Exporter,无需该步骤,可通过 SPU Operator 启用 Service Monitor 服务,具体请参见 MOFFETT SPU Operator 用户手册

    a. 创建配置文件。

    # 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://<node_ip>:30090,检索指标数据。

使用 Grafana

Grafana 是一款开源的可视化与分析工具,可通过仪表盘(Dashboard)帮助收集、关联并可视化数据。在 Kubernetes 集群中部署的 kube-prometheus-stack 集成了 Grafana Dashboard。

单机容器环境

  1. 根据 Download Grafana 页面指示,选择对应平台的安装包部署 Grafana,完成后 Grafana 默认监听端口为 3000。

  2. 通过浏览器访问 http://<host_ip>: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 为例。

    vim grafana-patch.yaml
    
    spec:
      type: NodePort          # 服务监听方式
      ports:
      - port: 80              # 集群内访问端口号
        targetPort: 3000      # Pod 内部端口号
        nodePort: 32300       # 节点主机上暴露的端口号
    
  2. 修改服务监听使用指定的 NodePort

    kubectl patch svc <grafana-svc-name> -n prometheus --patch "$(cat grafana-patch.yaml)" # 通过 kubectl get svc -A | grep grafana 命令查询 <grafana-svc-name> 
    
  3. 验证已修改的 Grafana 监听端口信息。

    kubectl get svc -A | grep grafana
    
  4. 通过浏览器访问 http://<node_ip>:32300 Grafana 主页面,登录用户名:admin;密码:prom-operator

    须知

    登录 Grafana 的密码可通过 kubectl --namespace prometheus get secrets <grafana-svc-name> -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-name> # 或使用 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 <node_name> NeedFix=true:NoSchedule                                                                       # 为指定节点添加 Taint,标记为不可调度
    kubectl describe node <node_name> | grep Taints                                                                               # 验证节点 Taint 是否生效
    kubectl delete pod -l app.kubernetes.io/name=dcsm-exporter -n moffett-monitoring --field-selector spec.nodeName=<node_name>   # 删除指定节点上特定标签的 Pod
    kubectl get pod -n moffett-monitoring -o wide                                                                                 # 验证 Pod 状态
    

    如需恢复指定节点上的 DCSM Exporter 相关 Pod,移除该节点上的 Taint。

    kubectl taint nodes <node_name> NeedFix=true:NoSchedule-
    

利用节点亲和性给指定节点添加标签

  1. 给需要移除 DCSM Exporter 组件的节点添加 dcsm-exporter-disabled=true 标签。

    kubectl label node <node_name> dcsm-exporter-disabled=true    
    
  2. 验证指定节点具有 dcsm-exporter-disabled=true 标签。

    kubectl get nodes --show-labels | grep <node_name>  
    
  3. dcsm-exporter.yaml 文件的 spec 字段添加亲和性配置(requiredDuringSchedulingIgnoredDuringExecution),选择拥有指定标签的节点。

    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 <node_name> dcsm-exporter-disabled-
    

卸载 DCSM Exporter

单机容器环境

  1. 停用并删除容器。

    docker stop dcsm-exporter && docker rm dcsm-exporter 
    
  2. 删除镜像。

    docker rmi moffett/dcsm-exporter:1.2.0-1.0.0
    
  3. 验证卸载是否完成。

    docker ps | grep dcsm-exporter 
    docker images | grep dcsm-exporter 
    

Kubernetes 集群环境

  1. 删除 DCSM Exporter 对应 namespace 下特定资源类型的所有资源,包括 Pod、Deployment、Service、ReplicaSet 等。

    kubectl delete all --all -n moffett-monitoring
    
  2. 删除 DCSM Exporter 的 namespace。

    kubectl delete ns moffett-monitoring
    
  3. 验证卸载是否完成。

    kubectl get all -A | grep dcsm-exporter
    kubectl get ns | grep moffett-monitoring