Prometheus + Grafana 监控 NVIDIA GPU

1.首先安装 NVIDIA Data Center GPU Manager (DCGM),从 https://developer.nvidia.com/dcgm 下载安装

nv-hostengine -t
yum erase -y datacenter-gpu-manager
rpm -ivh datacenter-gpu-manager*
systemctl enable --now dcgm.service

2. 安装 NVIDIA DCGM exporter for Prometheus,从 https://github.com/NVIDIA/gpu-monitoring-tools/tree/master/exporters/prometheus-dcgm 下载手工安装

wget -q -O /usr/local/bin/dcgm-exporter https://raw.githubusercontent.com/NVIDIA/gpu-monitoring-tools/master/exporters/prometheus-dcgm/dcgm-exporter/dcgm-exporter
chmod +x /usr/local/bin/dcgm-exporter
mkdir /run/prometheus 
wget -q -O /etc/systemd/system/prometheus-dcgm.service https://raw.githubusercontent.com/NVIDIA/gpu-monitoring-tools/master/exporters/prometheus-dcgm/bare-metal/prometheus-dcgm.service
systemctl daemon-reload
systemctl enable --now prometheus-dcgm.service

3. 从 https://prometheus.io/download/#node_exporter 下载 node_exporter,手工安装为服务并添加 dcgm-exporter 资料

tar xf node_exporter*.tar.gz
mv node_exporter-*/node_exporter /usr/local/bin/
chown root:root /usr/local/bin/node_exporter
chmod +x /usr/local/bin/node_exporter

cat > /etc/systemd/system/node_exporter.service <<EOF
[Unit]
Description=Prometheus Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target
EOF

sed -i '/ExecStart=\/usr\/local\/bin\/node_exporter/c\ExecStart=\/usr\/local\/bin\/node_exporter --collector.textfile.directory=\/run\/prometheus' /etc/systemd/system/node_exporter.service

systemctl daemon-reload
systemctl enable --now node_exporter.service

4. Grafana 添加这个Dashboard
https://grafana.com/grafana/dashboards/11752

HPE ProLiant DL380 Gen10 不同BIOS设置内存性能测试

硬件环境

2*Intel(R) Xeon(R) Gold 5122 CPU @ 3.60GHz
12*HPE SmartMemory DDR4-2666 RDIMM 16GiB

iLO 5 1.37 Oct 25 2018
System ROM U30 v1.46 (10/02/2018)
Intelligent Platform Abstraction Data 7.2.0 Build 30
System Programmable Logic Device 0x2A
Power Management Controller Firmware 1.0.4
NVMe Backplane Firmware 1.20
Power Supply Firmware 1.00
Power Supply Firmware 1.00
Innovation Engine (IE) Firmware 0.1.6.1
Server Platform Services (SPS) Firmware 4.0.4.288
Redundant System ROM U30 v1.42 (06/20/2018)
Intelligent Provisioning 3.20.154
Power Management Controller FW Bootloader 1.1
HPE Smart Storage Battery 1 Firmware 0.60
HPE Eth 10/25Gb 2p 631FLR-SFP28 Adptr 212.0.103001
HPE Ethernet 1Gb 4-port 331i Adapter – NIC 20.12.41
HPE Smart Array P816i-a SR Gen10 1.65
HPE 100Gb 1p OP101 QSFP28 x16 OPA Adptr 1.5.2.0.0
HPE InfiniBand EDR/Ethernet 100Gb 2-port 840QSF 12.22.40.30
Embedded Video Controller 2.5

软件环境

CentOS Linux release 7.6.1810 (Core)
Linux yaoge123 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Intel(R) Memory Latency Checker – v3.6

Continue reading

安装 GPFS 管理GUI

  1. GUI节点安装 gpfs.gss.pmcollector-.rpm gpfs.gss.pmsensors-.rpm gpfs.gui-.noarch.rpm gpfs.java-.x86_64.rpm
  2. 所有节点安装 gpfs.gss.pmsensors-*.rpm
  3. 初始化收集器节点 mmperfmon config generate –collectors [node list],GUI节点必须是收集器节点
  4. 启用传感器节点 mmchnode –perfmon -N [SENSOR_NODE_LIST]
  5. 设置容量监控节点和间隔 mmperfmon config update GPFSDiskCap.restrict=[node] GPFSDiskCap.period=86400
  6. 设置fileset容量监控节点和间隔 mmperfmon config update GPFSFilesetQuota.restrict=[node] GPFSFilesetQuota.period=3600
  7. GUI节点自动启动systemctl enable gpfsgui

删除

  1. GUI节点:systemctl stop gpfsgui; systemctl disable gpfsgui;
  2. mmlscluster |grep perfmon 查询一下哪些节点,mmchnode –noperfmon -N [SENSOR_NODE_LIST]
  3. mmperfmon config delete –all
  4. 清空数据库 psql postgres postgres -c “drop schema fscc cascade”
  5. 删除相关的rpm包 yum erase gpfs.gss.pmcollector gpfs.gss.pmsensors gpfs.gui gpfs.java
  6. mmlsnodeclass 查询有哪些节点,分别用mmchnodeclass GUI_SERVERS delete -N <……> 和 mmchnodeclass GUI_MGMT_SERVERS delete -N <……> 删除

浪潮刀片和机架的一些问题

用了四年的浪潮NF5270M3机架服务器、I8000刀箱和NX5440刀片服务器,总结一下碰到的管理问题

  1. 浪潮认为刀片BMC的IP应该紧跟着刀箱管理模块的IP顺序增加,比如刀箱管理模块是192.168.1.10,那么第一个刀片就应该是192.168.1.11。不这样设置会出现一些问题,如按刀片上的KVM按钮会亮红灯无法切换,需要SSH到刀片的BMC里用命令行修改一些配置文件
  2. 使用浏览器访问刀片的BMC必须用IP,用hostname的访问打开IP KVM会报错无法使用
  3. 在Linux下打开刀片的IP KVM报错无法使用,Windows下则正常,新的刀片已解决此问题
  4. 刀箱管理模块无法发送报警邮件,NTP配置无法保存且也没有同步时间,无发送syslog功能
  5. 机架BMC发送报警测试邮件正常,但是实际出现故障(如移除电源模块)时却没有发送邮件
  6. 刀箱电源风扇模块故障时前面板报警灯不亮,只在刀箱背后的电源风扇模块上有指示灯变红
  7. 机架RAID卡故障,如硬盘故障,前面板报警灯不亮

GPFS 创建 CNFS

GPFS有两种NFS导出方式,一是Cluster Export Services (CES) NFS,二是clustered NFS (CNFS)。CNFS使用Linux内核的nfsd,提供了较好小文件操作性能,当然也只支持NFS。CES使用用户空间Ganesha的nfsd,连续读写性能较好,CES还支持SMB和Object存储。

CNFS通过动态的调整IP地址来提供NFS的HA,只能提供故障转移不支持负载均衡,下面以nfs1,nfs2两个节点配置CNFS为例

  1. 确保所有服务端和客户端节点与同一个时钟源严格同步时间,服务端节点需要mmchlicense server
  2. 为了防止故障切换时出现写入问题,CNFS export共享目录的文件系统需指定syncnfs挂载选项
    mmchfs fsyaoge123 -o syncnfs
  3. 在每个服务端上面配置相同的/etc/exports,不同目录的fsid必须不同,不同服务端上面同一个目录的fsid必须相同,1.1.1.10/1.1.1.11是客户端IP
    /fsayaoge123/nfs 1.1.1.10(ro,fsid=11) 1.1.1.11(rw,fsid=11)
  4. 在每个服务端上面设置nfsd自动启动
    systemctl enable nfs-server
  5. 定义CNFS的共享目录,最好是一个单独小的文件系统且不被NFS共享出去
    mmchconfig cnfsSharedRoot=/fs2yaoge123/cnfs
  6. 每个服务端使用一个额外的静态IP(onboot=no)用于NFS共享,注意这个IP不能用于GPFS,将这个interface启动起来
  7. 在每个服务端上进行配置,ip_address_list为上面配置的专用于NFS的ip,node为这个节点在GPFS里面的主机名
    mmchnode --cnfs-interface=ip_address_list -N node
    mmchnode --cnfs-interface=1.1.1.1 -N nfs1  //配置nfs1使用1.1.1.1做为NFS专用IP
  8. 查一下rpc.mountd绑定的端口号,配置上去
    mmchconfig cnfsMountdPort=mountd_port -N node
  9. NFS客户端挂载时需加选项 -o sync,hard,intr,nfs1为主用
    mount -o sync,hard,intr 1.1.1.1:/fsyaoge123/nfs /mnt
  10. 测试关机、停止nfsd、停止gpfs三种情况下是否会自动切换

查看CNFS节点

mmlscluster --cnfs

删除CNFS节点

mmchnode --cnfs-interface=DELETE -N "nfs1,nfs2"

 

GPFS 优化

  1. 所有节点需和同一个时钟源严格同步时钟
  2. 一些文件系统操作在defaultHelperNodes上面运行,默认是所有节点,设置为NSD节点可能获得更好的性能
  3. maxMBpS是每个节点的GPFS的吞吐量,可设置为节点IO吞吐量的两倍,特别是IO节点
    1. 默认是2048;单路FDR设置1200,单路QDR设置8000,双路万兆设置5000
  4. GPFS的NSD节点如为专用IO节点,NSD节点没有数据访问则不会缓存任何数据,但是缓存可以为NSD工作线程所用,故可进行如下优化:
    1. 增加pagepool的大小
    2. 将nsdBufSpace设置为最大值(70%)
  5. 磁盘系统优化
    1. RAID segment size × 数据盘个数 = stripe size,GPFS block size应整倍数于stripe size
    2. GPFS block size应整倍数于HBA卡最大IO尺寸
    3. 最好倍数都是1
    4. /sys/block/*/queue/max_sectors_kb
  6.  存储的缓存策略
    1. 顺序IO负载:启用读缓存,禁用任何形式的预读
    2. 随机IO负载和Metadata:启用读写缓存
  7.  对于使用大量文件的GPFS节点,特别是登录节点、NFS/SMB输出节点、登录节点,可进行如下优化:
    1. 提高maxFilesToCache的值,这是缓存文件metadata的数量,最好能提高到并发打开文件数加上最近使用的文件数
    2. 在Linux上面maxStatCache是无效的,所以需要设定maxStatCache为一个较小的值,如512
    3. 按照maxFilesToCache × 3 KB + maxStatCache × 400 bytes估算内存消耗,增加的内存不在pagepool中
    4. 增加pagepool的大小,修改pagepoolMaxPhysMemPct可提高pagepool的上限
  8. 网络优化
    1. net.core.rmem_max = 8388608
      net.core.wmem_max = 8388608
      net.ipv4.tcp_rmem = 4096 262144 8388608
      net.ipv4.tcp_wmem = 4096 262144 8388608
    2. GPFS的socketMaxListenConnections和系统的net.core.somaxconn设置为集群节点数量
  9. sharedMemLimit和maxBufferDescs等看mmfsadm dump fs | head -8输出结果决定是否需要增加
  10. 文件系统的-n参数匹配集群节点数
  11. 后端由大量磁盘或固态盘组成NSD设置ignorePrefetchLUNCount=yes
  12. 用mmlsconfig和mmdiag –config可以查看配置

使用 rrdcached 解决 Ganglia 高 IOPS

用Ganglia监控一个近300个节点的集群,采样时间为默认的15s,加了一些自定义的参数,rrds目录容量74GB,12万个rrd文件。这样的一个规模下,平均每秒写入32MB、8k IOPS,平均每次写入只有4K数据,基本都是gmetad将采样的数据写入rrd文件中。这样高的IOPS对存储还是有明显的压力的,RRDtool中的rrdcached可以将对rrd的updates操作缓存到内存中然后在合并写入硬盘,显著降低了对硬盘的压力。

创建一个rrdcached的服务,编辑文件 /usr/lib/systemd/system/rrdcached.service,内容如下

[Unit]
Description=Data caching daemon for rrdtool
After=network.service
Before=gmetad.service httpd.service

[Service]
Type=forking
PIDFile=/run/rrdcached.pid
ExecStart=/usr/bin/rrdcached -s ganglia -m 664 -l unix:/var/lib/ganglia/rrdcached.sock -s apache -m 777 -P FLUSH,STATS,HELP -l unix:/var/lib/ganglia/rrdcached_limited.sock -b /var/lib/ganglia/rrds -B -p /run/rrdcached.pid

[Install]
WantedBy=multi-user.target
  • rrdcached.sock给gmetad用的、rrdcached_limited.sock限制了可用的操作给WEB前台用
  • -b指定工作目录,-B限制在工作目录下
  • -w指定缓存时间,如果更新时发现超过本文件已经缓存了超过此缓存时间,就放到写入队列中等待写入,默认300s
  • -z指定随机延迟,每一个rrd写入时都插入一个随机延迟,此值不能比-w,默认为0
  • -f指定超时,如果rrd超过此时间还没有更新则写入硬盘

启动服务

systemctl daemon-reload
systemctl enable --now rrdcached.service

修改 /usr/lib/systemd/system/gmetad.service ,在[Unit]和[Service]段修改和添加,并重启gmetad服务

[Unit]
…………
After=network.target rrdcached.service
Requires=rrdcached.service

[Service]
Environment=RRDCACHED_ADDRESS=/var/lib/ganglia/rrdcached.sock
…………
…………

修改前台网页的配置 /etc/ganglia/conf.php 添加一行,并重启httpd服务

$conf['rrdcached_socket'] = "unix:/var/lib/ganglia/rrdcached_limited.sock";

 

LSF 配置NUMA Affinity

首先要给节点启用NUMA Affinity,在lsb.hosts的Host节中添加AFFINITY列,值为Y,如:

Begin Host
HOST_NAME MXJ   r1m     pg    ls    tmp  DISPATCH_WINDOW  AFFINITY 
......
default    !    ()      ()    ()     ()     ()            (Y)      
End Host

启用后用bhost -l -aff可以看到Affinity已经Enable

提交作业时-R参数添加affinity字段如affinity[core:membind=localprefer:distribute=pack]

HP MSA 2040 SAN 测试

HP MSA 2040 SAN,双控制器,每控制器4GB缓存。两台IO节点与存储双控通过16Gb FC冗余链接。

测试命令:iozone -i 0 -i 1 -r 128K -s 256G -t 2 -+m ./iolist -C
每个IO节点一个iozone进程,更多的进程更慢

write rewrite read reread
900GByte 2.5-inch 10Krpm 6Gb/s SAS
每5个盘做一组RAID5,4组RAID5
2421 2421 2419 2418
4TByte 3.5-inch 7.2Krpm 6Gb/s NL-SAS
每6个盘做一组RAID6,2组RAID6
1249 1228 1276 1279

 

通过作业调度系统进行系统维护

HPC集群中一些系统维护工作不需要立刻执行,而希望在不影响用户正常使用的情况下见缝插针的进行,这个时候可以将这些维护工作做成作业,通过作业调度系统来调度完成。下面以通过LSF作业调度系统升级Infiniband卡固件和驱动为例:

  1. 允许root用户提交作业
    1. 修改lsf.conf,添加一行
      LSF_ROOT_REX=local
    2. 重启相关服务让修改生效
      $ badmin mbdrestart
      $ lsadmin resrestart all
  2. 编写升级脚本
    cd /root/mellanox/ #进入目录
    unzip fw-ConnectX3Pro-rel-2_35_5100.zip
    mstflint -d 08:00.0 -i ./fw-ConnectX3Pro-rel-2_35_5100-FlexBoot-3.4.648-CLP-8025-UEFI-14.8.43.bin b #升级固件
    tar xf MLNX_OFED_LINUX-3.1-1.0.3-rhel6.7-x86_64.tgz
    cd MLNX_OFED_LINUX-3.1-1.0.3-rhel6.7-x86_64
    yum install perl pciutils python gcc-gfortran libxml2-python tcsh libnl.i686 libnl expat glib2 tcl libstdc++ bc tk gtk2 atk cairo numactl pkgconfig -y
    ./mlnxofedinstall --all --enable-affinity --enable-mlnx_tune <<< "y\n" #安装新版驱动
    sed -i s/HWADDR=/#HWADDR=/ /etc/sysconfig/network-scripts/ifcfg-ib0
    cd
    rm -rf /root/mellanox #删除升级目录
    reboot #重启
  3. 将升级所需文件复制到所有节点
    pscp -r mellanox node:/root/
  4. 编写作业提交脚本
    如果队列之间有抢占,系统维护作业需要提交到低优先级队列,提交到高优先级队列会造成重启时还有被抢占挂起的作业
    首先关闭节点,再进行维护作业,完成后再打开节点

    #!/bin/bash
    for i in `cat nodelist` #nodelist文件中是所有需要升级节点的主机名列表
    do
    	bsub -q e52680v3ib -n 24 -m $i -o $i "badmin hclose $i;/root/mellanox/up.sh;badmin hopen $i" 
    done