用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,内容如下

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

启动服务

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

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

 

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

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

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

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,添加一行
    2. 重启相关服务让修改生效
  2. 编写升级脚本
  3. 将升级所需文件复制到所有节点
  4. 编写作业提交脚本
    如果队列之间有抢占,系统维护作业需要提交到低优先级队列,提交到高优先级队列会造成重启时还有被抢占挂起的作业
    首先关闭节点,再进行维护作业,完成后再打开节点

GPFS的盘在Windows 2008及以上版本上用CIFS共享出去,当GPFS的盘里面文件发生变化时(如增加删除),某些Windows Vista及以上版本的客户端无法看到这些变化,即使刷新也不行,必须在客户端上面建立或删除文件才能看到,而如果这个共享是Windows自己的硬盘上的则没有这个问题。

这里IBM说明了,从SMBv2(Vista和2008开始)开始引入了一个新的特性,客户端可以对文件和文件夹的metadata进行缓存,刷新这个缓存依赖于目录变更通知,但是GPFS的在Windows上面不支持这个功能,所以客户端并不知道目录中的文件发生了变化。解决方法也很简单暴利,直接关闭SMBv2回退到SMBv1即可。这里详述了打开关闭各个版本SMB的办法,对于Windows 2008 (R2)来说就是在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters下新增一个SMB2的DWORD为0的值,需要特别注意的是Windows 2008 HPC版本不支持这个注册表项目,添加后会导致共享整个就没有了。在这里详述了各个版本的Server Client之间会使用什么样版本的SMB,和在Windows 8/2012怎么查看SMB的版本。

流程如下:生成新的key,分发新key,替换所有节点key,替换xcat key

 

LSF可以让用户自定义一些资源,其中动态资源可以通过ELIM向LSF汇报,下面以本地磁盘(一个机械盘一个SSD)负载为例:

在$LSF_ENVDIR/lsf.shared的Begin Resource中增加

在$LSF_ENVDIR/lsf.cluster.的Begin ResourceMap中增加一行

在$LSF_SERVERDIR/下新建一个文件elim.disk内容如下并且chmod +x elim.disk

所有节点需要lsadmin limrestart,然后用lsload -l就可以看到多出来两列了

bsub时可以使用这些参数
-R “order[diskut]” 优先选择disk负载最轻的
-R “select[diskut < 10]” 要求disk负载小于10%
-R “rusage[diskut=10]” 为这个任务预留10%的disk负载。rusage不影响lsload的显示,但是会叠加到lsload显示的实际值上面从而影响order select的结果,除非lsf确定预留的资源被这个job所使用了(比如mem)。

Compute Units(CU)可以对一个队列中的机器在调度时进行分组,可以控制作业在这些组中的分配。

假设有三个cu,每个cu空闲的job slots如下:

cu name free job slots
cu1 4
cu2 6
cu3 8

 

cu[pref=minavail]:把cu按照空闲的job slots从小到大排序,按顺序填充分配使用cu。例:-n 4则使用cu1的4个;-n 6则使用cu1的4个和cu2的2个。

cu[pref=maxavail]:把cu按照空闲的job slots从大到小排序,按顺序填充分配使用cu。例:-n 6则使用cu3的6个;-n 10则使用cu3的8个和cu2的2个。
上面的情况下,如果cu中空闲的job slots数量一样,则按照其在lsb.hosts中Begin ComputeUnitvs中的顺序使用

cu[balance]:按照在lsb.hosts中Begin ComputeUnitvs中的顺序,在尽量少的cu中分配使用且每个cu中使用的job slots尽量平衡。例:-n 6则使用cu2的6个;-n 8则使用cu3的8个;-n 10则使用cu2和cu3的各使用5个;-n 12则cu2和cu3个使用6个;-n 14则cu1使用4个、cu2和cu3各使用5个。
cu[balance:pref=minavail]和cu[balance:pref=maxavail]:把cu按照空闲的job slots排序,在尽量少的cu中分配使用且每个cu中使用的job slots尽量平衡。例:-n 4 -R “cu[balance:pref=minavail]”使用cu1,-n 4 -R “cu[balance:pref=maxavail]”使用cu3。

对于HPC来说,​其实更想要一种类似于minavail但是又尽量分布到最少cu上的策略,如果必须跨cu则应尽量不等分减少跨cu通讯。